จะอ่านค่าคุณสมบัติโดยใช้ PyQGIS ได้อย่างไร


18

วิธีรับข้อมูลที่อยู่ในตารางคุณลักษณะพูดในคอลัมน์ 2 แถว 2 โดยใช้ pyqgis คืออะไร


สิ่งนี้มีประโยชน์ แต่สิ่งนี้ดูเหมือนจะให้คุณค่าแก่แอททริบิวต์เท่านั้น ดูเหมือนว่าแอตทริบิวต์จะต้องเป็นคู่ชื่อ / ค่า คุณจะได้รับชื่อสำหรับแต่ละคุณลักษณะได้อย่างไร นั่นคือสิ่งที่ "ทุ่ง" เป็นเรื่องเกี่ยวกับ?
ajpieri

นี่ไม่ได้ตอบคำถามจริงๆ หากคุณมีคำถามที่แตกต่างที่คุณสามารถถามได้โดยคลิกที่ถามคำถาม นอกจากนี้คุณยังสามารถเพิ่มเงินรางวัลเพื่อดึงดูดความสนใจมากขึ้นกับคำถามนี้เมื่อคุณมีเพียงพอชื่อเสียง - จากการทบทวน
Martin Hügi

คำตอบ:


43

ในการวนซ้ำทุกคุณลักษณะในเลเยอร์ให้ใช้ตัวgetFeatures()สร้าง ส่งคืนตัววนซ้ำของคุณลักษณะ ( QgsFeature) ในเลเยอร์

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

หากคุณสนใจคุณสมบัติเฉพาะแทนที่จะเป็นคุณสมบัติทั้งหมดในเลเยอร์คุณสามารถเข้าถึงได้โดยใช้ a QgsFeatureRequestและเป็น FID:

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

เมื่อคุณมีQgsFeatureวัตถุคุณสามารถใช้attributes()วิธีการดึงข้อมูลคุณสมบัติ (คอลัมน์หรือช่อง aka) ที่เกี่ยวข้องกับสถานที่นั้น (แถว aka) เช่น:

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

หากคุณต้องการจัดทำดัชนีฟิลด์ตามชื่อแทนที่จะเป็นตัวเลขคุณต้องใช้การแมปฟิลด์:

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

ดัชนีฟิลด์ไม่ควรเปลี่ยนแปลงระหว่างการวนซ้ำดังนั้นคุณจะต้องเรียกมันครั้งเดียวเท่านั้น

มีข้อมูลเพิ่มเติมและตัวอย่างในตำราอาหาร PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

ปรับปรุง

คุณสามารถเข้าถึงคุณลักษณะคุณลักษณะได้ง่ายขึ้นโดยใช้สิ่งที่QgsFeatureต้องการdictเช่น

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

ฉันไม่แน่ใจว่าจะมีเวอร์ชั่นใดเข้ามา


11

คิดว่าฉันจะเพิ่มรหัสบางส่วนเนื่องจาก googling ปัญหานี้ส่งคืนคำถามนี้ ... คนส่วนใหญ่ต้องการคำอธิบายสั้น ๆ หรือตัวอย่างรหัสไปยังลิงก์ที่นำไปสู่หน้าเว็บที่มีข้อมูลเพิ่มเติมมากมาย

ในการรับข้อมูลในตารางคุณต้องเข้าถึงฟีเจอร์ของเลเยอร์ก่อน ในกรณีของฉันฉันใส่คุณสมบัติในตัวแปร แล้วคุณห่วงผ่านคุณสมบัติและคุณลักษณะแต่ละครั้งที่คุณโทรหาคุณลักษณะของมันซึ่งจากนั้นจะสามารถพิมพ์โดยใช้ของพวกเขาดัชนีคอลัมน์ ตัวอย่างเช่นหากฉันต้องการรับค่าทั้งหมดในคอลัมน์ที่สองฉันจะทำสิ่งนี้:

lyr = iface.activeLayer()

features = lyr.getFeatures()

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

1

คำตอบข้างต้นแสดงเฉพาะวิธีการนี้สำหรับเลเยอร์ที่ใช้งานอยู่ ฉันคิดว่าในหลายกรณีคุณอาจต้องการหาคุณลักษณะที่กล่าวว่าสำหรับเลเยอร์ที่ไม่ใช่เลเยอร์ที่ใช้งานอยู่หรือตรวจสอบเลเยอร์ในหน้าต่างเลเยอร์ รหัสด้านล่างจะได้รับรายการเลเยอร์ทั้งหมดที่คุณเพิ่มลงในหน้าต่างเลเยอร์ของคุณ (ไม่ว่าพวกเขาจะได้รับการตรวจสอบหรือใช้งานอยู่) และค้นหาแอททริบิวที่แถว 2, คอลัมน์ 2

from qgis.core import QgsProject

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

หมายเหตุ mapLayersByName ส่งคืนรายการเลเยอร์ที่มีชื่อที่กำหนด ฉันสมมติว่ามีอยู่สำหรับตัวอย่างนี้

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