กรองตามคุณสมบัติของพวกเขาโดยใช้ Python หรือไม่


16

วิธีรับฟีเจอร์ตามคุณสมบัติ (คล้ายกับ Iqueryfilter ใน arcobjects) ใน Qgis โดยใช้ python? แทนที่จะได้รับคุณสมบัติทั้งหมดและกรองด้วยตนเองจะมีตัวเลือกให้ใช้ในกรณีที่ข้อเพื่อกรองออก?

ตัวอย่าง: ฉันมีชื่อเขตข้อมูลที่เรียกว่า 'มณฑล' มีฟีเจอร์มากกว่าห้าหมื่นรายการไม่สามารถดึงข้อมูลคุณลักษณะทั้งหมดและกรองได้เนื่องจากใช้เวลานาน ดังนั้นฉันสามารถค้นหาโดยใช้ iqueryfilter.whereclause = 'Counties = Norwich' ใน arcobjects สิ่งที่ฉันต้องการใน PyQgis


1
@ NathanW ใช่คุณถูกต้อง ฉันต้องการเพียงคืนข้อมูลโดยใช้แบบสอบถามจากเลเยอร์ คุณช่วยยกตัวอย่างใน Pyqgis ให้ฉันได้ไหม
venkat

@ นาธานสวัสดีฉันเข้าใจแล้ว มันทำงานเหมือนแบบสอบถามความหมายใน arcgis ดูตัวอย่างนี้ t = outputLayer.setSubsetString ('UniqID =' + inputFeat.attribute ("UniqID") toPyObject ()) ถ้า t == จริง: outputProvider = outputLayer.dataProvider () พิมพ์ผลลัพธ์ ข้อมูลที่น่าพึงพอใจ
venkat

@venkat คุณวางคำถามที่ไหนใน QGIS ขอบคุณ
ianbroad

คำตอบ:


12

เอ็นจิ้นการแสดงออก QGIS สามารถทำได้โดยใช้QgsFeatureRequest.setFilterExpression( unicode )วิธีการ (ตั้งแต่ QGIS 2.2)

request = QgsFeatureRequest().setFilterExpression( u'"Counties" = \'Norwich\'' )
it = l.getFeatures( request )

การเริ่มต้นด้วย QGIS 2.10 เป็นไปได้ที่การกรองด้วยวิธีนี้จะให้ประสิทธิภาพที่เหนือกว่าการกรองประเภทอื่น (เช่นการใช้งานของงูใหญ่)

โดยพื้นฐานแล้วจะมีผลบังคับใช้หากตรงตามเงื่อนไขสามข้อต่อไปนี้:

  • คุณกำลังใช้เลเยอร์กับผู้ให้บริการ postgisในขณะนี้ (2.16) มากกว่าผู้ให้บริการ postgis ใช้สิ่งนี้ (spatialite, ogr, oracle ... )
  • การแสดงออกของคุณไม่ได้มีความซับซ้อนมากเกินไป (สิ่งที่ชอบ>, =, IN, NOT NULL... ได้รับการสนับสนุน)
  • คุณได้เปิดใช้งานคุณลักษณะนี้ในการตั้งค่า> ตัวเลือก> แหล่งข้อมูล> การจัดการแหล่งข้อมูล> ดำเนินการนิพจน์บน postgres ฝั่งเซิร์ฟเวอร์
  • ประโยชน์ด้านประสิทธิภาพนั้นเหมาะสมที่สุดกับดัชนีที่เหมาะสมบนตารางฐานข้อมูล

ด้วย QGIS 3.0 คุณสามารถทำได้ง่ายๆ

features = l.getFeatures('"Counties" = \'Norwicth\'')

1

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


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

1

โดยใช้แบบสอบถาม SQL ogrมันยังเป็นไปได้อย่างง่ายดายด้วย คุณสามารถรันโค้ดนี้ได้เช่นในคอนโซล Python ของ QGIS หรือสคริปต์แบบสแตนด์อโลน
ตัวอย่าง :

from osgeo import ogr

path = "path to your shapefile.shp"
ID = "FieldID" # For instance 'Countries' 
datasource = ogr.Open(str(path)) # your datasource

layer = datasource.GetLayer(0) # Import layer 0 --> only works with shapefiles
layerName = str( layer.GetName() )# Save the Layersname first

# Do the sql query
# Selects all features from a layer datasource where Field Countries is equal to 'Germany'
layers = datasource.ExecuteSQL("SELECT * FROM %s WHERE %s = '%s'" % (layerName, ID, 'Germany') )
res = []
for i in range(0,layers.GetFeatureCount()):
   f = layers.GetFeature(i)
   g = f.GetGeometryRef()
   res.append(g.Area()) 

# res now contains the measured area of each feature where the attribute ID has the value 'Germany'

0

การระบุตัวกรอง SQL ยังไม่ได้รับการสนับสนุนโดยใช้ QGIS API ตั้งแต่เวอร์ชัน 1.9

ตามที่ฉันเข้าใจจากบทความรายการส่งเมล์นี้การสนับสนุน "SQL ของผู้ให้บริการเนทีฟ" จะมีในรุ่นอนาคตเท่านั้น

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