Các chức năng tương đương của QGIS cho Cập nhật / Xóa hàng / Trường của ArcPy là gì?


8

Tôi đang cố gắng lập trình lại một số tập lệnh từ ArcPy sang QGIS (1.8 hoặc 2.0) và có một số chức năng đơn giản mà tôi muốn có thể làm lại nhưng không may là tài liệu trong QGIS thiếu ở một số khu vực nhất định.

Cụ thể là ba điều quan trọng nhất đối với tôi là:

Thêm trường - Thêm trường

arcpy.AddField_management(Feature, "ID", "SHORT")

Tính toán quản lý trường - Cập nhật trường đó

arcpy.CalculateField_management(Feature,"ID","!FID!")

Cập nhật / Xóa hàng - Cập nhật / Xóa hàng dựa trên điều kiện (không sao chép shapefile)

keep = ["Bob","Janet","John","Mike"]
Counter = 0
rows = arcpy.UpdateCursor(Feature)

for row in rows:
    if row.Name in keep:
        row.ID = Counter
        rows.updateRow(row)
    else:
        rows.deleteRow(row)
    Counter += 1

Bây giờ tôi có thể lặp lại qua từng tính năng trong QGIS bằng SEXTANTE và có được hình dạng của nó mà tôi có thể viết lại thành một shapefile mới và từ đó cập nhật / xóa một hàng hoặc trường. Bắt đầu với thứ gì đó dọc theo ...

layer = st.getobject(Polygon)
features = st.getfeatures(layer)
for f in features:
    f.geometry().asPolygon()

nhưng tôi không thể tìm thấy một giải pháp đơn giản cho các chức năng được đề cập ở trên?


Tôi không chắc lắm, mục đích của phần cuối câu hỏi của bạn là gì. Tại sao bạn lại đề cập đến SEXTANTE? Bạn yêu cầu một phương thức để viết lại thành một shapefile mới, nhưng đoạn trích mã của bạn không làm được gì như vậy.
Matthias Kuhn

Câu trả lời:


16

Các ví dụ sau được dựa trên API QGIS 2.0 (sắp được phát hành). Điều này đã thay đổi kể từ 1.8, vì vậy cú pháp cho phiên bản này sẽ khác ở một số nơi.

Tài nguyên tốt nhất cho các giải pháp tuân thủ 1.8 và giải thích sâu cho nền tảng của các tham số (cũng áp dụng cho 2.0) là Sách nấu ăn PyQGIS

Chúng tôi sẽ giả sử bạn đã có một tham chiếu đến một lớp vectơ được gọi là vlvd

vl = iface.activeLayer()

Giao dịch

Các ví dụ sau đây đang hoạt động trong một giao dịch (được lưu trữ cục bộ trong QGIS). Trước khi bắt đầu phiên chỉnh sửa, bạn phải gọi

vl.startEditing()

và kết thúc nó với

vl.commitChanges()

để viết các thay đổi của bạn vào nguồn dữ liệu. hoặc là

vl.rollBack()

để loại bỏ những thay đổi

Bạn cũng có thể làm việc trực tiếp vl.dataProvider()và quên đi các tuyên bố kiểm soát giao dịch. (Kết quả là hành vi giống như tự kỷ)

Thêm một lĩnh vực

QssVectorLayer.addAttribution (QssField)

from PyQt4.QtCore import QVariant
vl.addAttribute( QgsField( 'fieldname', QVariant.String ) )

Điều này chỉ hoạt động, nếu dataprovider thực hiện khả năng AddAttribut. Bạn có thể kiểm tra điều này với:

if vl.dataProvider().capabilities() & QgsVectorDataProvider.ChangeAttributeValues

Tính toán các trường

Xem câu trả lời này:

Có thể lập trình thêm các trường được tính toán không?

Nó vẫn nhắm đến 1.8, vì vậy thay vì vl.select()bạn phải gọi tương đương 2.0 vl.getFeatures()(xem các thay đổi API của QGIS )

Cập nhật hàng

QssVectorLayer.updateField (FeatureId, field Index, value)

vl.updateField( 1000, 5, 'hello' )

Kiểm tra trước yêu cầu (tùy chọn):

if vl.dataProvider().capabilities() & QgsVectorDataProvider.ChangeAttributeValues

Để biết trường Index, bạn có thể sử dụng QgsVectorLayer.pendingFields()

Chỉnh sửa: Xem thêm bình luận của NathanW trong đó đề cập đến QgsVectorLayer.updateFeature( feature )phương pháp dễ đọc .

Xóa hàng

QssVectorLayer.deleteFeature (FeatureId)

vl.deleteFeature( 1000 )

Kiểm tra các điều kiện tiên quyết tùy chọn:

if vl.dataProvider().capabilities() & QgsVectorDataProvider.DeleteFeatures

2
Sử dụng feature[5] = 'hello'layer.updateFeature(feature)tốt hơn là sử dụng vl.updateField IMO
Nathan W

5

Đây là cách bạn sẽ làm mã của mình trong PyQGIS:

keep = ["Bob","Janet","John","Mike"]

for counter, feature in enumerate(layer.getFeatures()):
    if feature['Name'] in keep:
        feature['ID'] = counter
        layer.updateFeature(feature)
    else:
        layer.deleteFeature(feature.id())

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.