Bagaimana cara memilih fitur menggunakan ekspresi dengan pyqgis?

11

Bagaimana saya bisa memilih fitur dengan pyqgis menggunakan ekspresi?

Saya mencoba menggunakan QgsExpression tetapi metode pilih tidak menerimanya:

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

Apakah mungkin dan jika demikian, bagaimana saya melakukannya?

ustroetz
sumber

Jawaban:

23

Ikuti langkah ini:

  1. Dapatkan referensi lapisan:

    cLayer = iface.mapCanvas().currentLayer()

  2. Dapatkan featureIterator dari ekspresi:

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

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Buat daftar Id fitur dari hasil yang diperoleh di 2 .:

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

  4. Pilih fitur dengan id yang diperoleh dalam 3 .:

    cLayer.setSelectedFeatures( ids )


CATATAN: Jika Anda ingin mengatur ekspresi dengan nilai string , Anda perlu menambahkan tanda kutip ke nilai tersebut, dengan cara ini:

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

Jika nilai string Anda berasal dari variabel, Anda dapat melakukan ini:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )
Germán Carrillo
sumber
Bagaimana saya mengatakannya "\"ogc_fid\"=482 AND name=\"hello world\""? Di sini dikatakan bahwa ini tidak tersedia dalam python: qgis.org/api/… . Mungkin Anda tahu cara untuk menghindari batasan ini?
Jenia Ivanov
2
Ingatlah bahwa nama bidang harus dua kali dikutip, nilai string tunggal dikutip, dan angka tidak perlu tanda kutip. Dalam contoh Anda: "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW, tautan yang Anda sertakan dalam komentar Anda sebenarnya menyatakan bahwa atribut statis BinaryOperatorTexttidak tersedia di binding Python, tetapi operator bekerja untuk QgsExpression, bahkan jika mereka digunakan melalui binding Python.
Germán Carrillo
@ GermánCarrillo Saya menggunakan metode Anda di atas tetapi tidak dapat mengembalikan nilai apa pun, meskipun telah menyalin & menempelkan nilai yang diketahui untuk dicari. Kolom berisi string, jadi saya telah menggunakan expr = QgsExpression("\"police_ref\" = 'P0580996'"). Saya telah mencoba menambahkan karakter break ke istilah pencarian (untuk tanda kutip tunggal) tetapi tidak membuat perbedaan. Menariknya, jika saya membuka tabel atribut yang saya minta, dan menggunakan pembuat ekspresi di sana, itu membuat pilihan jika police_ref saya gunakan sebagai contoh di baris paling pertama, tetapi tidak sebaliknya
Alex
@ GermánCarrillo maaf, saya tidak yakin apa yang saya lakukan berbeda tetapi saya bisa memilih fitur sekarang! Bagi yang lain membaca, Anda tidak perlu karakter pembuka untuk kutipan tunggal
Alex
3

Ini bekerja untuk saya di Konsol Python QGIS

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))
mehmet ercan
sumber
Selamat datang di GIS SE. Sebagai pengguna baru, silakan ikuti Tur . Jawaban yang ada (dan diterima) jauh lebih lengkap. Bagaimana hal ini membaik? Secara umum, cara untuk mendapatkan poin reputasi adalah dengan menjawab pertanyaan yang tidak dijawab, tetapi jawaban lengkap baru untuk pertanyaan berusia tiga tahun akan diterima jika itu secara khusus mengatasi masalah dengan solusi sebelumnya (dalam hal ini, masalahnya tentu harus disebutkan) .
Vince
1

Anda hanya perlu mengujinya di antarmuka GUI: "Select by Expression". Jika berhasil, Anda dapat menempelnya di kode Python Anda yang dikelilingi oleh tanda kutip ganda "".

exp = QgsExpression("ogc_fid=482")

Jika Anda dibandingkan dengan string, Anda dapat menambahkan kutipan tunggal ''.

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

Ini prinsip yang sama dalam python, itu bisa membuat perbedaan antara kutipan ganda dan kutipan tunggal.

Tao
sumber