วิธีการเปลี่ยนค่าของแอตทริบิวต์โดยใช้ QgsFeature ใน PyQGIS


12

ฉันต้องการอัปเดตคุณลักษณะหนึ่งคุณลักษณะ อย่างไรก็ตามฉันไม่ทราบว่าจะอัปเดตโดยใช้คุณสมบัติของวัตถุ ฉันต้องใช้ผู้ให้บริการข้อมูลเพื่ออัปเดต

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 })

ฉันสามารถเปลี่ยนค่าของคุณสมบัติโดยใช้QgsFeatureวัตถุได้หรือไม่?

ยิ่งไปกว่านั้นมันเป็นไปได้ที่จะวนซ้ำโดยใช้วัตถุตัววนซ้ำ?


ฉันจะเปลี่ยนค่าโดยไม่ใช้ดัชนีได้อย่างไร ฉันต้องการเปลี่ยนค่าโดยตั้งชื่อฟิลด์ของพวกเขา นั่นจะสะดวกสบายมากขึ้น ขอบคุณมาก! สวัสดี Robert
Robert BK

เพียงใช้my_index = layer.fieldNameIndex("my_field_name")เพื่อรับดัชนี
Germán Carrillo

ในกรณีนี้ฉันไม่สามารถเพิ่มในฟิลด์สตริงฉันจะทำอย่างไร
Hamed Makian

หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม รวมลิงค์ไปยังคำถามนี้หากช่วยระบุบริบท - จากรีวิว
Dan C

Hamed ยินดีต้อนรับสู่ GIS Stack Exchange! เนื่องจากคำถามนี้ได้รับการตอบรับแล้วโปรดถามคำถามของคุณเป็นใหม่คำถามที่แยกต่างหากที่นี่gis.stackexchange.com/questions/ask
cm1

คำตอบ:


17

ตอบคำถามสองข้อของคุณ:

  1. คุณสามารถเปลี่ยนค่าคุณลักษณะของคุณจากวัตถุที่ไม่จำเป็นต้องเข้าถึงlayerdataProvider()

  2. ใช่คุณสามารถใช้ตัววนซ้ำในการforวนซ้ำ

ตรวจสอบรหัสด้านล่าง:

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()

สิ่งนี้จะอัพเดตค่าฟิลด์ที่สาม (ดัชนี 2) เป็น 30 สำหรับคุณลักษณะเลเยอร์ทั้งหมด


หมายเหตุ: ตามที่คุณได้กล่าวไว้ด้วยเหตุผลบางอย่างที่วัตถุ QgsFeature ไม่สามารถอัปเดตค่าคุณลักษณะได้แม้ว่า API จะบอกว่าสามารถทำได้


5

ใช่ แต่คุณต้องรู้ดัชนีของสนาม:

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

คุณสามารถทำให้ฟิลด์ใช้QgsFeature::fieldsและจากนั้นวนซ้ำจนกว่าคุณQgsFeature::attribute(const QString & name )จะเจอฟิลด์ที่คุณต้องการหรือค้นหาดัชนีฟิลด์ตามชื่อ

เหตุผลสำหรับ QVariant คือ setAttribute สามารถใช้ชนิดจำนวนเต็มลอยวันที่และข้อความ QgsFeature.attribute (ชื่อ) จะส่งคืนตัวแปรด้วยเช่นกันหากพบแอตทริบิวต์และมีอย่างอื่นที่ไม่สามารถหาได้ .. โปรดระวังสิ่งนี้ในรหัสของคุณ ลอง .. ยกเว้นบล็อกจะได้รับการรับประกันลองแปลงเป็น int และยกเว้นว่าประเภทไม่ใช่ int

เป็นไปได้ว่าคุณสมบัติของคุณไม่รองรับวิธีนี้ วิธีการอื่นที่ฉันใช้คือQgsVectorLayer::changeAttributeValue:

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

สิ่งนี้บอกให้เลเยอร์อัปเดตคุณลักษณะเฉพาะและแอตทริบิวต์เฉพาะ ในกรณีตัวอย่างค่ามาจากวิดเจ็ต


ฉันพยายามfeat.setAttribute(1, QVariant(20))แต่ระบบกล่าวว่าTypeError: PyQt4.QtCore.QVariant เป็นประเภทที่แมปและไม่สามารถอินสแตนซ์ได้
wannik

feat.setAttribute (1, 20) เป็นวิธีที่ฉันเคยทำมาก่อน นั่นคือการใส่ค่า '20' ลงในแอตทริบิวต์ 1
Michael Stimson

ฉันพยายามfeat.setAttribute(1, 20)แต่ค่าไม่เปลี่ยนแปลง อย่างไรก็ตามฉันสามารถprint(feat.attributes()[1])
วรรณนิก

ดูการแก้ไขบางทีคุณต้องเรียก QgsVectorLayer.changeAttributeValue ซึ่งควรใช้ไดรเวอร์เพื่อทำการเปลี่ยนแปลง
Michael Stimson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.