Lấy dữ liệu của một tính năng được chọn trong QGIS bằng Python?


10

Tôi có một vấn đề / câu hỏi liên quan đến python và QGIS. Có thể lấy dữ liệu của một tính năng được chọn trong QGIS bằng python không và nếu có thì như thế nào?

Trong ví dụ của tôi, tôi có một lớp hiển thị một số bưu kiện cho quy hoạch đô thị. Nếu bây giờ tôi chọn một trong những bưu kiện tôi muốn lấy dữ liệu cho chính xác bưu kiện này. Dữ liệu này phải được đọc bởi tập lệnh python và sau đó được thêm vào tệp PDF được tạo tự động. Bước cuối cùng là dễ dàng, nhưng tôi đã không nhận được dữ liệu từ tính năng được chọn này.

Có thể lấy dữ liệu từ lớp hoạt động, nhưng cũng có thể lấy dữ liệu từ một tính năng được chọn của lớp này?

Hy vọng bạn có thể giúp tôi. Trân trọng

Câu trả lời:


15

Gọi layer.selectedFeatures()sẽ trả về một danh sách với (các) tính năng bạn đã chọn. Sau đó, bạn có thể gọi feature.attributeMap()từng tính năng được chọn để lấy từ điển của từng thuộc tính.

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.attributeMap()
    for (k,attr) in attrs.iteritems():
    print "%d: %s" % (k, attr.toString())

Gần đây tôi đã có một câu hỏi tương tự được trả lời ở đây: Khi lặp qua một lớp vectơ với pyqgis, làm cách nào để kiểm tra xem một tính năng có được chọn không?


thật kỳ lạ, các đối tượng QssFeature có kết quả từ select_features không có phương thức hình học ...
user32882

9

Tôi chỉ muốn đăng một số cập nhật cho câu trả lời trước đó để thay đổi API PythonIS kể từ phiên bản 2.0 .

Như trước đây, bạn sẽ nhận được một danh sách các tính năng được chọn với iface.activeLayer().selectedFeatures(), tuy nhiên trong QGIScác phiên bản >= 2.0bạn hiện sử dụng chức năng QgsFeature.attributes()thay vì QgsFeature.attributeMap(). Hai hàm không hoàn toàn giống nhau: attributes()bây giờ trả về một danh sách , trong khi cái cũ attributeMap()trả về một từ điển . Hãy dành ít phút để duyệt qua các tài liệu API cho QgsFeature.attributes(), QgsAttributes, vv để hiểu làm thế nào các thuộc tính được lưu trữ / truy cập.

Nếu bạn quan tâm, bạn có thể đọc về một số lý do đằng sau các thay đổi API trên chuỗi danh sách gửi thư này: [Qgis-developer] các tính năng chọn api vector mới . Nói ngắn gọn (theo lời của nhà phát triển QGIS Martin Dobias):

Truy cập vào các thuộc tính: không f.attributeMap()còn nữa, vì các thuộc tính hiện được lưu trữ trong một vectơ (Python list:) thay vì bản đồ (Python dict:). QgsFeaturelớp mô phỏng đối tượng container python 4 để bạn có thể truy cập các thuộc tính như QgsFeaturethể là một danh sách hoặc từ điển, với các khóa là chỉ mục trường hoặc tên trường:

f[0] ... thuộc tính đầu tiên

f["type"] ... thuộc tính có tên "loại"

Vẫn có thể nhận được tất cả các thuộc tính: f.attributes()trả về một danh sách các giá trị.

Vì vậy, như một ví dụ cụ thể về những gì bạn đã hỏi cách thực hiện (lấy dữ liệu cho một tính năng bạn đã chọn), giả sử bạn có một lớp chứa citycác tính năng mà mỗi tính năng có một danh sách các thuộc tính, bao gồm một countythuộc tính. Để nhận countygiá trị cho một thành phố cụ thể mà bạn đã chọn (giả sử Helena, AR), hãy làm như sau trong bảng điều khiển Python:

city = iface.activeLayer().selectedFeatures()[0]
city["county"]
# OUTPUTS: u'Phillips'

Nếu bạn muốn các giá trị của tất cả các trường trong bảng thuộc tính của thành phố, thì bạn chỉ cần sử dụng:

cityData = city.attributes()

Ngoài ra, bạn có thể lấy tất cả các tên trường từ ví dụ này bằng cách sử dụng city.fields (). Name () sẽ trả về danh sách các tên trường.
Cary H

1

Tôi muốn thêm một cái gì đó hữu ích vào câu trả lời do J. Taylor cung cấp và chỉ ra rằng câu trả lời được chấp nhận hiện tại từ năm 2012 không còn đúng nữa:

Đối tượng QssFeature hỗ trợ __geo_interface__thuộc tính hữu ích , trả về một từ điển từ một tính năng nhất định. Từ điển thực sự là trong một tiêu chuẩn GeoJSON, vì vậy bạn có được tất cả các cặp giá trị thuộc tính và hình học. Tính năng này tồn tại được một thời gian, được mô tả lần đầu tiên bởi Sean Gillies vào năm 2012, với một ví dụ sử dụng ở đây . Tôi không thể tìm thấy bất kỳ thông tin nào từ phiên bản QGIS có sẵn từ đó và tôi chưa dùng thử QGIS 3, nhưng chắc chắn có sẵn từ ít nhất là QGIS 2.14.

TL; DR:

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.__geo_interface__
    print attrs # GeoJSON attributes of a feature
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.