การรับข้อมูลของฟีเจอร์หนึ่งที่เลือกใน QGIS โดยใช้ Python?


10

ฉันมีปัญหา / คำถามเกี่ยวกับหลามและ QGIS เป็นไปได้หรือไม่ที่จะได้รับข้อมูลของฟีเจอร์หนึ่งที่เลือกใน QGIS โดยใช้ python และถ้าเป็นเช่นนั้น

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

เป็นไปได้ที่จะรับข้อมูลจากชั้นที่ใช้งานอยู่ แต่มันเป็นไปได้หรือไม่ที่จะได้รับข้อมูลจากคุณลักษณะที่เลือกหนึ่งของชั้นนี้

หวังว่าคุณจะช่วยฉัน ความนับถือ

คำตอบ:


15

การโทรlayer.selectedFeatures()จะส่งคืนรายการพร้อมคุณสมบัติที่คุณเลือก จากนั้นคุณสามารถโทรหาfeature.attributeMap()แต่ละคุณสมบัติที่เลือกเพื่อรับพจนานุกรมของแต่ละคุณสมบัติ

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

ฉันเพิ่งมีคำถามที่คล้ายกันตอบที่นี่: เมื่อวนซ้ำเวกเตอร์เลเยอร์ด้วย pyqgis ฉันจะตรวจสอบได้อย่างไรว่ามีการเลือกสถานที่หรือไม่


แปลกวัตถุ QgsFeature ที่เป็นผลมาจาก selected_features ไม่มีวิธีการทางเรขาคณิต ...
user32882

9

ฉันแค่อยากจะโพสต์การปรับปรุงบางอย่างเพื่อให้คำตอบก่อนหน้านี้ในแง่ของการเปลี่ยนแปลง QGIS หลาม API ตั้งแต่รุ่น 2.0

ก่อนที่คุณจะได้รับรายชื่อของคุณสมบัติที่เลือกมีiface.activeLayer().selectedFeatures()แต่ในQGISรุ่น>= 2.0คุณตอนนี้ใช้ฟังก์ชั่นแทนQgsFeature.attributes() QgsFeature.attributeMap()ทั้งสองฟังก์ชั่นไม่ได้เหมือนกัน: attributes()ตอนนี้ส่งกลับรายการในขณะที่เก่าattributeMap()กลับพจนานุกรม ใช้เวลาสักครู่เพื่อเรียกดูเอกสาร API สำหรับQgsFeature.attributes(), QgsAttributesฯลฯ ที่จะเข้าใจว่าแอตทริบิวต์จะถูกเก็บไว้ / เข้าถึงได้

หากคุณสนใจคุณสามารถอ่านเกี่ยวกับบางส่วนของเหตุผลที่อยู่เบื้องหลังการเปลี่ยนแปลง API ในหัวข้อรายชื่อผู้รับจดหมายนี้: [QGIS นักพัฒนา] ใหม่เวกเตอร์ API คุณลักษณะเลือก สั้น ๆ (ในคำพูดของนักพัฒนา QGIS Martin Dobias):

เข้าถึงคุณลักษณะ: ไม่มีf.attributeMap()อีกต่อไปเพราะแอตทริบิวต์จะถูกเก็บไว้ในขณะนี้ในเวกเตอร์ (Python: list) แทนของแผนที่ (Python: dict) QgsFeatureคลาสเลียนแบบภาชนะหลามของออบเจ็กต์ 4เพื่อให้คุณสามารถเข้าถึงแอททริบิวราวกับว่าQgsFeatureอินสแตนซ์เป็นรายการหรือพจนานุกรมโดยมีคีย์เป็นดัชนีฟิลด์หรือชื่อฟิลด์:

f[0] ... คุณลักษณะแรก

f["type"] ... แอตทริบิวต์ชื่อ "type"

ยังคงเป็นไปได้ที่จะได้รับคุณลักษณะทั้งหมด: f.attributes()ส่งคืนรายการค่า

ดังนั้นเป็นตัวอย่างของสิ่งที่คุณถามว่าจะทำอย่างไร (รับข้อมูลสำหรับฟีเจอร์เดียวที่คุณเลือก) สมมติว่าคุณมีเลเยอร์ที่ประกอบด้วยcityฟีเจอร์ที่แต่ละรายการมีแอททริบิวรวมถึงแอcountyททริบิวต์ ในการรับcountyค่าของเมืองที่คุณเลือก (พูดHelena, AR) ให้ทำดังต่อไปนี้ในคอนโซล Python:

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

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

cityData = city.attributes()

นอกจากนี้คุณยังสามารถรับชื่อฟิลด์ทั้งหมดจากตัวอย่างนี้โดยใช้ city.fields (). names () ซึ่งจะส่งคืนรายการชื่อฟิลด์
นิวเคลียส H

1

ฉันต้องการเพิ่มบางสิ่งที่มีประโยชน์กับคำตอบของ J. Taylor และชี้ให้เห็นว่าคำตอบที่ยอมรับในปัจจุบันจาก 2012 ไม่ถูกต้องอีกต่อไป:

วัตถุ QgsFeature รองรับ__geo_interface__คุณสมบัติที่มีประโยชน์ซึ่งส่งคืนพจนานุกรมจากคุณสมบัติที่กำหนด พจนานุกรมนั้นอยู่ในมาตรฐาน GeoJSON ดังนั้นคุณจะได้รับคู่ของแอตทริบิวต์และค่าเรขาคณิตทั้งหมดมาด้วย คุณลักษณะที่มีอยู่สำหรับบางเวลาขณะนี้เป็นครั้งแรกที่อธิบายไว้โดยฌอน Gillies บางครั้งในปี 2012 โดยมีตัวอย่างการใช้งานที่นี่ ฉันไม่สามารถหาข้อมูลใด ๆ จาก QGIS รุ่นใดได้บ้างและยังไม่ได้ลอง QGIS 3 แต่ก็มีให้อย่างน้อย 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.