Làm thế nào để đọc các giá trị thuộc tính bằng PyQGIS?


18

Cách để có được thông tin trong bảng thuộc tính, giả sử trong cột 2, hàng 2 bằng pyqgis là gì?


Điều này rất hữu ích, nhưng điều này dường như chỉ cung cấp cho bạn giá trị của các thuộc tính. Có vẻ như các thuộc tính cần phải là một cặp tên / giá trị. Làm thế nào để bạn có được tên cho từng thuộc tính? Đó có phải là những gì "lĩnh vực" là tất cả về?
ajpieri

Điều này không thực sự trả lời câu hỏi. Nếu bạn có một câu hỏi khác, bạn có thể hỏi nó bằng cách nhấp vào Đặt câu hỏi . Bạn cũng có thể thêm tiền thưởng để thu hút sự chú ý hơn cho câu hỏi này một khi bạn có đủ danh tiếng . - Từ đánh giá
Martin Hügi

Câu trả lời:


43

Để lặp qua mọi tính năng trong một lớp, hãy sử dụng trình getFeatures()tạo. Điều này trả về một iterator của các tính năng ( QgsFeature) trong lớp.

for feature in layer.getFeatures():
    pass # do something with feature

Nếu bạn chỉ quan tâm đến một tính năng cụ thể, thay vì tất cả các tính năng trong lớp, bạn có thể truy cập nó bằng cách sử dụng QgsFeatureRequestvà đó là FID:

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

Khi bạn có một QgsFeatuređối tượng, bạn có thể sử dụng attributes()phương thức để truy xuất các thuộc tính (còn gọi là cột hoặc trường) được liên kết với tính năng đó (còn gọi là hàng), ví dụ:

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

Nếu bạn muốn lập chỉ mục trường theo tên của nó, thay vì số, bạn cần sử dụng ánh xạ trường:

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

Chỉ mục trường không nên thay đổi trong vòng lặp, vì vậy bạn chỉ cần gọi nó một lần.

Có nhiều thông tin và ví dụ trong sách dạy nấu ăn PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Cập nhật

Bạn có thể truy cập các thuộc tính tính năng dễ dàng hơn nhiều bằng cách sử dụng QgsFeaturenhư dict, ví dụ:

for feature in layer.getFeatures():
    name = feature["name"]

Tôi không chắc phiên bản nào xuất hiện hoặc nếu nó luôn ở đó.


11

Tôi nghĩ rằng tôi thực sự sẽ thêm một số mã, vì việc giải quyết vấn đề này trả về câu hỏi này ... hầu hết mọi người thích một lời giải thích nhanh hoặc một đoạn mã cho một liên kết dẫn đến một trang có nhiều thông tin bổ sung.

Để có được thông tin trong bảng, trước tiên bạn phải truy cập các tính năng của lớp . Trong trường hợp của tôi, tôi đặt các tính năng trong một biến. Sau đó, bạn lặp qua các tính năng và với mỗi tính năng bạn gọi các thuộc tính của nó , sau đó có thể được in bằng chỉ mục cột của chúng . Ví dụ: nếu tôi muốn nhận tất cả các giá trị trong cột thứ hai, thì tôi sẽ làm điều này:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]

1

Các câu trả lời ở trên chỉ cho thấy cách làm điều này cho lớp hoạt động. Tôi nghĩ rằng, trong nhiều trường hợp, bạn có thể muốn tìm thuộc tính đã nói cho một lớp không phải là lớp hoạt động hoặc lớp được kiểm tra trong cửa sổ Lớp. Mã dưới đây sẽ nhận được một danh sách tất cả các lớp mà bạn đã thêm vào cửa sổ Lớp của mình (bất kể chúng được kiểm tra hay kích hoạt) và tìm thuộc tính ở hàng 2, cột 2.

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

Lưu ý mapLayersByName trả về danh sách các lớp có tên đã cho. Tôi giả sử một người tồn tại cho ví dụ này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.