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


10

ในขณะที่วนซ้ำเวกเตอร์เลเยอร์โดยใช้รหัสต่อไปนี้ (ทำให้ร้อนขึ้นจากตัวอย่างในpyqgis cookbook ) มีวิธีตรวจสอบว่ามีการเลือกสถานที่หรือไม่?

provider = vlayer.dataProvider()
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
while provider.nextFeature(feat):
    geom = feat.geometry()
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        print "%d: %s" % (k, attr.toString())

อีกทางหนึ่งฉันสามารถสร้างรายการคุณลักษณะที่เลือกโดยใช้vlayer.selectedFeatures()แต่ฉันหวังว่าจะมีวิธีการตรวจสอบแต่ละคุณสมบัติโดยตรง

คำตอบ:


8

ดูเหมือนจะไม่มีวิธีในการค้นหาเลเยอร์หลักของออบเจกต์คุณลักษณะโดยตรงหรือไม่ว่าจะถูกเลือกจากวิธีการในคลาส QgsFeature

วิธีการคล้ายกับvlayer.selectedFeatures()ที่จะทดสอบว่าอยู่ในfeat.id() vlayer.selectedFeaturesIds()QgsFeatureIds ไม่ใช่ค่าที่ไม่ซ้ำกันเมื่อเทียบกับเลเยอร์เวกเตอร์อื่น ๆ เฉพาะภายในเลเยอร์ของตนเอง

หรืออีกวิธีหนึ่งคุณสามารถเริ่มต้นด้วยvlayer.selectedFeatures()และวนซ้ำคุณลักษณะเหล่านั้นแทนคุณลักษณะทั้งหมดของผู้ให้บริการ

อีกวิธีหนึ่งคือการรวบรวมชุด (หรือรายการ) ของรหัสคุณลักษณะที่เลือกและไม่ได้เลือกไว้สำหรับเลเยอร์เวกเตอร์ที่ระบุ:

# previous relevant code

set_selids = set(vlayer.selectedFeaturesIds())
feat = QgsFeature()
vlayer.select([], QgsRectangle(), False)
set_allids = set()
while vlayer.nextFeature(feat):
    set_allids.add(feat.id())

set_notselids = set_allids - set_selids

print set_allids
print set_selids
print set_notselids

ฉันดูเหมือนจะไม่พบการเรียกครั้งเดียวสำหรับการดึงการอ้างอิงถึงคุณสมบัติทั้งหมด (หรือรหัส) สำหรับเลเยอร์เวกเตอร์ (เช่นยังต้องใช้QgsVectorLayer.select()และทำซ้ำด้วยQgsVectorLayer.nextFeature())

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

แก้ไข 2 : หลังจากสร้างรหัสคุณลักษณะคุณสามารถวนซ้ำและใช้QgsVectorLayer.featureAtId(featid)เพื่อเข้าถึงคุณลักษณะ


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