การเลือกคุณสมบัติโดยใช้นิพจน์ด้วย PyQGIS


13

ฉันจะเลือกคุณสมบัติด้วย PyQGIS โดยใช้นิพจน์ได้อย่างไร

ฉันพยายามใช้QgsExpressionแต่วิธีการเลือกไม่ได้:

exp = QgsExpression("'ogc_fid' = 482")
cLayer = canvas.currentLayer()
cLayer.select(exp)

เป็นไปได้และถ้าเป็นเช่นนั้นฉันจะทำอย่างไร

คำตอบ:


24

ทุกวันนี้ (QGIS v3.x)

  1. รับการอ้างอิงเลเยอร์:

    layer = iface.activeLayer()

  2. เลือกคุณสมบัติตามนิพจน์:

    layer.selectByExpression( "\"ogc_fid\"=482" )


ก่อน QGIS 2.16

ทำตามขั้นตอนเหล่านี้:

  1. รับการอ้างอิงเลเยอร์:

    cLayer = iface.mapCanvas().currentLayer()

  2. รับ featureIterator จากนิพจน์:

    expr = QgsExpression( "\"ogc_fid\"=482" )

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. สร้างรายการรหัสคุณลักษณะจากผลลัพธ์ที่ได้ใน 2:

    ids = [i.id() for i in it]

  4. เลือกคุณสมบัติด้วยรหัสที่ได้รับใน 3:

    cLayer.setSelectedFeatures( ids )


หมายเหตุ: หากคุณต้องการตั้งค่านิพจน์ด้วยค่าสตริงคุณต้องเพิ่มเครื่องหมายคำพูดเป็นค่าดังกล่าวด้วยวิธีนี้:

expr = QgsExpression( " \"name\" = 'my string' " )

หากค่าสตริงของคุณมาจากตัวแปรคุณสามารถทำสิ่งนี้ได้:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )

ฉันจะพูด"\"ogc_fid\"=482 AND name=\"hello world\""อย่างไร ที่นี่มีข้อความระบุว่าไม่สามารถใช้งานได้ในภาษาไพธ อน : qgis.org/api/… . คุณอาจรู้วิธีหลีกเลี่ยงข้อ จำกัด นี้หรือไม่?
Jenia Ivanov

2
โปรดทราบว่าชื่อฟิลด์จะต้องถูกยกมาสองครั้งค่าสตริงที่ยกมาเดี่ยวและตัวเลขไม่จำเป็นต้องมีคำพูด ในตัวอย่างของคุณ: "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW ลิงก์ที่คุณรวมไว้ในความคิดเห็นของคุณกำลังระบุว่าแอตทริบิวต์คงBinaryOperatorTextไม่พร้อมใช้งานในการผูก Python แต่ตัวดำเนินการทำงานQgsExpressionได้แม้ว่าจะถูกใช้ผ่านการผูก Python
Germán Carrillo

@ GermánCarrilloฉันใช้วิธีการของคุณด้านบน แต่ไม่สามารถเอาคืนค่าใด ๆ แม้ว่าจะมีการคัดลอกและวางค่าที่รู้จักกันเพื่อค้นหา expr = QgsExpression("\"police_ref\" = 'P0580996'")คอลัมน์ประกอบด้วยสตริงเพื่อให้ฉันได้ใช้ ฉันได้ลองเพิ่มตัวแบ่งในคำค้นหา (สำหรับคำพูดเดียว) แต่มันก็ไม่ได้สร้างความแตกต่าง ที่น่าสนใจถ้าฉันเปิดตารางคุณลักษณะที่ฉันสอบถามและใช้ตัวสร้างนิพจน์ที่นั่นมันจะทำการเลือกถ้า police_ref ฉันใช้เป็นตัวอย่างอยู่ในแถวแรกมาก แต่ไม่เป็นอย่างอื่น
Alex

@ GermánCarrilloขออภัยไม่เป็นไรฉันไม่แน่ใจว่าสิ่งที่ฉันทำแตกต่างกัน แต่ฉันสามารถเอามันไปเลือกคุณสมบัติตอนนี้! สำหรับคนอื่น ๆ ที่อ่านคุณไม่จำเป็นต้องพักตัวละครสำหรับคำพูดเดียว
อเล็กซ์

6

สิ่งนี้ใช้ได้กับฉันใน QGIS Python Console

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))

ยินดีต้อนรับสู่ GIS SE ในฐานะผู้ใช้ใหม่โปรดใช้ทัวร์ คำตอบ (และยอมรับ) ที่มีอยู่นั้นสมบูรณ์กว่ามาก สิ่งนี้ปรับปรุงได้อย่างไร โดยทั่วไปวิธีการได้รับคะแนนชื่อเสียงคือการตอบคำถามที่ยังไม่ได้ตอบแต่ยินดีต้อนรับคำตอบที่สมบูรณ์แบบสำหรับคำถามสามปีที่ผ่านมาหากตอบปัญหาโดยเฉพาะกับวิธีแก้ไขปัญหาก่อนหน้า (ในกรณีนี้ควรกล่าวถึงปัญหา) .
วินซ์

2

คุณจะต้องทดสอบในอินเทอร์เฟซ GUI: "Select by Expression" หากใช้งานได้คุณสามารถวางในโค้ด Python ของคุณล้อมรอบด้วยเครื่องหมายคำพูดคู่ ""

exp = QgsExpression("ogc_fid=482")

หากคุณเปรียบเทียบกับสตริงคุณสามารถเพิ่มเครื่องหมายคำพูดเดี่ยว ''

exp = QgsExpression("ogc_fid='482'")

มันเป็นหลักการเดียวกันในไพ ธ อนมันสามารถสร้างความแตกต่างระหว่างอัญประกาศคู่และอัญประกาศเดี่ยวได้

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