Làm cách nào để thay đổi giá trị của một thuộc tính bằng QssFeature trong PyQGIS?


12

Tôi muốn cập nhật một thuộc tính của một tính năng. Tuy nhiên, tôi không biết cập nhật nó bằng cách sử dụng đối tượng tính năng. Tôi phải sử dụng nhà cung cấp dữ liệu để cập nhật nó.

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
dp = layer.dataProvider()
it = dp.getFeatures()

for i in range(0, dp.featureCount()):
  feat = it.next()
  attrs = { 2 : 30 }
  layer.dataProvider().changeAttributeValues({ feat.id() : attrs })

Tôi có thể thay đổi giá trị của một thuộc tính bằng cách sử dụng QgsFeatuređối tượng không?

Hơn nữa, có thể lặp bằng cách sử dụng một đối tượng lặp không?


Làm thế nào tôi có thể thay đổi giá trị mà không cần sử dụng chỉ mục? Tôi muốn thay đổi các giá trị bằng cách đặt tên trường của họ. Điều đó sẽ thoải mái hơn nhiều. Cảm ơn rât nhiều! Chúc mừng Robert
Robert BK

Đơn giản chỉ cần sử dụng my_index = layer.fieldNameIndex("my_field_name")để có được chỉ số.
Germán Carrillo

trong trường hợp này tôi không thể thêm vào trường chuỗi làm thế nào tôi có thể làm được?
Hamed Makian

Nếu bạn có một câu hỏi mới, vui lòng hỏi nó bằng cách nhấp vào nút Hỏi câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp bối cảnh. - Từ đánh giá
Dan C

Hamed, Chào mừng bạn đến với Sàn giao dịch GIS! Vì câu hỏi này đã được trả lời, vui lòng đặt câu hỏi của bạn dưới dạng câu hỏi mới, riêng biệt tại đây gis.stackexchange.com/questions/ask .
cm1

Câu trả lời:


17

Trả lời hai câu hỏi của bạn:

  1. Bạn có thể thay đổi giá trị tính năng của mình từ layerđối tượng, không cần truy cập vào dataProvider().

  2. Có, bạn có thể sử dụng iterator trong một forvòng lặp.

Kiểm tra mã dưới đây:

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
it = layer.getFeatures()

layer.startEditing()
for feat in it:
  layer.changeAttributeValue(feat.id(), 2, 30)

layer.commitChanges()

Điều này cập nhật giá trị trường thứ ba (chỉ mục 2) lên 30 cho tất cả các tính năng của lớp.


Lưu ý: Như bạn đã chỉ ra, vì một số lý do, đối tượng QssFeature không thể cập nhật các giá trị tính năng, mặc dù API cho biết có thể.


5

Có, nhưng bạn phải biết chỉ số của trường:

QgsFeature::setAttribute(int field,const QVariant & attr )  

Bạn có thể lấy các trường bằng cách sử dụng QgsFeature::fieldsvà lặp đi lặp lại qua chúng cho đến khi bạn tìm thấy trường bạn muốn hoặc QgsFeature::attribute(const QString & name )tìm chỉ mục trường theo tên.

Lý do cho QVariant là setAttribution có thể lấy các kiểu Integer, Float, Date và Text. QssFeature.attribution (name) trả về một biến thể của kiểu int nếu thuộc tính được tìm thấy và một cái gì đó khác nếu nó không thể được tìm thấy .. hãy lưu ý điều này trong mã của bạn. Một khối try..except sẽ được bảo hành, hãy thử chuyển đổi sang int và ngoại trừ nếu kiểu không phải là int.

Có thể tính năng của bạn không hỗ trợ phương pháp này. Một phương pháp khác mà tôi đã sử dụng là QgsVectorLayer::changeAttributeValue:

self.canvas.currentLayer().changeAttributeValue(UpdateFeatureID,FieldToUpdate,self.CurrentWidget.text(),True)

Điều này báo cho lớp để cập nhật một tính năng cụ thể và thuộc tính cụ thể. Trong trường hợp ví dụ, giá trị đến từ một widget.


Tôi đã thử feat.setAttribute(1, QVariant(20))nhưng hệ thống cho biết TypeError: PyQt4.QtCore.QVariant đại diện cho một loại ánh xạ và không thể khởi tạo
wannik

feat.setAttribution (1, 20) là cách tôi đã làm trước đây. Đó là đặt giá trị '20' vào thuộc tính 1.
Michael Promotionson

Tôi đã thử feat.setAttribute(1, 20)nhưng các giá trị không thay đổi. Tuy nhiên, tôi có thểprint(feat.attributes()[1])
wannik

Xem các chỉnh sửa, có lẽ bạn phải gọi QssVectorLayer.changeAttributionValue nên sử dụng trình điều khiển để thực hiện các thay đổi.
Michael Promotionson
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.