“Select by Attribute” di QGIS menggunakan python?

16

Apakah ada cara untuk menggunakan fungsi "Select by Attribute" di QGIS menggunakan perintah python? Dalam plugin saya, pengguna harus memasukkan nilai melalui GUI dan nilai ini harus digunakan dalam fungsi yang memilih semua fitur yang memiliki atribut ini. Nama kolom ditetapkan dalam kode, fungsinya hanya mencari nilai yang benar.

Dalam solusi saya saat ini, fungsi menghubungkan QGIS ke database PostgreSQL dan menjalankan pernyataan SQL. Ini membuat tabel dari hasil dan tabel divisualisasikan sebagai Shapefile di QGIS.

Pada prinsipnya itu akan cukup untuk menyorot fitur dan tidak membuat Shapefile baru seleksi. Menggunakan fungsi "Pilih berdasarkan Atribut" juga akan melewati koneksi basis data yang tidak perlu.

Apakah ada cara untuk menggunakan fungsi "Select by Attribute" dengan python sehingga fitur-fiturnya disorot? Dengan menggunakan fungsi di QGIS, semua fitur yang tidak cocok dengan kueri bersifat sementara yang akan baik-baik saja.

userHH
sumber
1
Jawaban ini membutuhkan pembaruan qgis 3.
MonsterMushroom

Jawaban:

8

Iya. Anda bisa mendapatkan semua atribut melalui ikatan python dan menerapkan pemfilteran tambahan di plugin Anda sendiri. Lihat kutipan PyQGIS Coobook ini untuk ikhtisar dan beberapa contoh. Anda kemudian akan mengecualikan hasil yang tidak cocok dari kamus yang dikembalikan.

Sedangkan untuk visualisasi, Anda mungkin masih harus membuat layer lain, karena select()tidak memiliki argumen yang pas. Anda dapat menggunakan lapisan memori untuk menghindari keharusan membuat file fisik (lebih banyak tentang itu di buku masak).

edit:

Sebenarnya, Anda dapat menggunakan selectedFeaturesIds()dengan setSelectedFeatures(ids)untuk mengubah pilihan ke subset yang Anda buat. Mengutip implementasi secara langsung:

/** Get a copy of the user-selected features */  
QList<QgsFeature> selectedFeatures();

/** Return reference to identifiers of selected features */
const QSet<qint64> &selectedFeaturesIds() const;

/** Change selection to the new set of features */
void setSelectedFeatures(const QSet<qint64> &ids);
lynxlynxlynx
sumber
Sayang sekali! Saya pikir itu mungkin di QGIS, karena ArcGIS juga dimungkinkan menggunakan arcpy. Meskipun demikian, terima kasih atas jawaban Anda!
userHH
Mungkin ada jalannya; Aku hanya tidak tahu itu. Beri waktu kepada pengguna lain situs - mungkin seseorang melakukannya.
lynxlynxlynx
Saya pikir itu harus mungkin. Di QGIS, semua fitur divisualisasikan yang sesuai dengan pemilihan, semua fitur lainnya dihapus sementara.
userHH
Ya, saya menemukannya. QGIS melakukan ini pada intinya, tetapi sepertinya ia memperlihatkan cukup banyak antarmuka untuk menyesuaikan pilihan dengan benar.
lynxlynxlynx
Bisakah Anda mengirimkan saya tautan?
userHH
9

Mulai dari QGIS 2.2 ini didukung dengan cara yang sangat alami. Ini dapat dilakukan melalui mesin ekspresi QGIS menggunakan QgsFeatureRequest.setFilterExpression( unicode )metode ini.

# The important part: get the feature iterator with an expression
it = l.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"Counties" = \'Norwich\'' ) )
# Set the selection
l.setSelectedFeatures( [ f.id() for f in it ] )

Hal terbaik tentang itu: jika Anda memiliki versi QGIS baru-baru ini (2,10 dan yang lebih baru), ini akan disaring secara langsung dalam database sehingga jauh lebih berkinerja daripada solusi lain sementara masih sangat mudah dibaca.

Matthias Kuhn
sumber