Memperoleh data dari satu fitur yang dipilih di QGIS menggunakan Python?

10

Saya memiliki masalah / pertanyaan tentang python dan QGIS. Apakah mungkin untuk mendapatkan data dari satu fitur yang dipilih di QGIS menggunakan python, dan jika ya, bagaimana?

Dalam contoh saya, saya memiliki lapisan yang menunjukkan beberapa bidang untuk perencanaan kota. Jika saya sekarang memilih salah satu paket saya ingin mendapatkan data untuk paket ini. Data ini harus dibaca oleh skrip python dan kemudian ditambahkan ke file PDF yang dibuat secara otomatis. Langkah terakhir mudah, tetapi saya tidak mendapatkan data dari fitur yang dipilih ini.

Dimungkinkan untuk mendapatkan data dari lapisan aktif, tetapi apakah mungkin juga untuk mendapatkan data dari satu fitur yang dipilih dari lapisan ini?

Semoga Anda bisa membantu saya. Salam

Sven
sumber

Jawaban:

15

Panggilan layer.selectedFeatures()akan mengembalikan daftar dengan fitur yang Anda pilih. Anda kemudian dapat memanggil feature.attributeMap()setiap fitur yang dipilih untuk mendapatkan kamus kamus dari masing-masing fitur.

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.attributeMap()
    for (k,attr) in attrs.iteritems():
    print "%d: %s" % (k, attr.toString())

Baru-baru ini saya memiliki pertanyaan serupa yang dijawab di sini: Ketika iterasi di atas layer vektor dengan pyqgis, bagaimana cara saya mengecek apakah fitur dipilih?

Cyrus
sumber
aneh, objek QgsFeature yang dihasilkan dari selected_features tidak memiliki metode geometri ...
user32882
9

Saya hanya ingin memposting beberapa pembaruan pada jawaban sebelumnya mengingat perubahan pada QGIS Python API sejak versi 2.0 .

Seperti sebelumnya, Anda akan mendapatkan daftar fitur yang dipilih iface.activeLayer().selectedFeatures(), namun dalam QGISversi >= 2.0Anda sekarang menggunakan fungsi QgsFeature.attributes()bukan QgsFeature.attributeMap(). Dua fungsi tidak persis sama: attributes()sekarang mengembalikan daftar , sedangkan yang lama attributeMap()mengembalikan kamus . Luangkan waktu untuk menelusuri dokumentasi API untuk QgsFeature.attributes(), QgsAttributes, dll untuk memahami bagaimana atribut disimpan / diakses.

Jika Anda tertarik, Anda dapat membaca tentang beberapa alasan di balik perubahan API pada utas milis ini: [Qgis-developer] fitur vektor api pilih baru . Secara singkat (dalam kata-kata pengembang QGIS Martin Dobias):

Akses ke atribut: tidak ada f.attributeMap()lagi, karena atribut sekarang disimpan dalam vektor (Python:), listbukan peta (Python:) dict. QgsFeatureclass mengemulasi objek python container 4 sehingga Anda dapat mengakses atribut seolah-olah QgsFeatureinstance adalah daftar atau kamus, dengan kunci berupa indeks bidang atau nama bidang:

f[0] ... atribut pertama

f["type"] ... atribut bernama "type"

Masih mungkin untuk mendapatkan semua atribut: f.attributes()mengembalikan daftar nilai.

Jadi sebagai contoh spesifik apa yang Anda tanyakan bagaimana melakukan (mendapatkan data untuk satu fitur yang telah Anda pilih), misalkan Anda memiliki lapisan cityfitur yang masing-masing memiliki daftar atribut, termasuk countyatribut. Untuk mendapatkan countynilai untuk kota tertentu yang telah Anda pilih (katakan Helena, AR), lakukan hal berikut di konsol Python:

city = iface.activeLayer().selectedFeatures()[0]
city["county"]
# OUTPUTS: u'Phillips'

Jika Anda ingin nilai dari semua bidang dalam tabel atribut kota, maka Anda cukup menggunakan:

cityData = city.attributes()
J. Taylor
sumber
Anda juga bisa mendapatkan semua nama bidang dari contoh ini menggunakan city.fields (). Names () yang akan mengembalikan daftar nama bidang.
Cary H
1

Saya ingin menambahkan sesuatu yang bermanfaat untuk jawaban yang diberikan oleh J. Taylor dan menunjukkan bahwa jawaban yang diterima saat ini dari 2012 tidak benar lagi:

Objek QgsFeature mendukung __geo_interface__atribut yang berguna , yang mengembalikan kamus dari fitur yang diberikan. Kamus ini sebenarnya dalam standar GeoJSON, sehingga Anda memasukkan semua pasangan atribut-nilai dan geometri. Fitur ini ada untuk beberapa waktu sekarang, pertama kali dijelaskan oleh Sean Gillies sekitar tahun 2012, dengan contoh penggunaan di sini . Saya tidak dapat menemukan informasi dari versi QGIS mana itu tersedia dan saya belum mencoba QGIS 3, tetapi pasti tersedia dari setidaknya QGIS 2.14.

TL; DR:

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.__geo_interface__
    print attrs # GeoJSON attributes of a feature
adamczi
sumber