Bagaimana cara membaca nilai atribut menggunakan PyQGIS?

18

Apa cara untuk mendapatkan informasi yang terkandung dalam tabel atribut, katakanlah di kolom 2, baris 2 menggunakan pyqgis?

user16018
sumber
Ini membantu, tetapi ini sepertinya hanya memberi Anda nilai atribut. Tampaknya atribut harus merupakan pasangan nama / nilai. Bagaimana Anda mendapatkan nama untuk setiap atribut? Apakah itu yang dimaksud dengan "ladang"?
ajpieri
Ini tidak benar-benar menjawab pertanyaan itu. Jika Anda memiliki pertanyaan yang berbeda, Anda dapat menanyakannya dengan mengeklik Ajukan Pertanyaan . Anda juga dapat menambahkan hadiah untuk menarik lebih banyak perhatian ke pertanyaan ini setelah Anda memiliki reputasi yang cukup . - Dari Ulasan
Martin Hügi

Jawaban:

43

Untuk mengulang setiap fitur dalam satu layer, gunakan getFeatures()generator. Ini mengembalikan iterator fitur ( QgsFeature) di lapisan.

for feature in layer.getFeatures():
    pass # do something with feature

Jika Anda hanya tertarik pada fitur tertentu, alih-alih semua fitur di layer, Anda dapat mengaksesnya menggunakan QgsFeatureRequestdan itu FID:

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

Setelah Anda memiliki QgsFeatureobjek, Anda dapat menggunakan attributes()metode untuk mengambil atribut (alias kolom atau bidang) yang terkait dengan fitur itu (alias baris), misalnya:

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

Jika Anda ingin mengindeks bidang dengan nama itu, bukan angka, Anda perlu menggunakan pemetaan bidang:

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

Indeks bidang tidak boleh berubah selama loop, jadi Anda hanya perlu menyebutnya sekali.

Ada lebih banyak informasi dan contoh dalam buku masak PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Memperbarui

Anda dapat mengakses atribut fitur dengan lebih mudah dengan menggunakan QgsFeaturelike a dict, mis

for feature in layer.getFeatures():
    name = feature["name"]

Saya tidak yakin versi mana yang masuk atau apakah selalu ada di sana.

Snorfalorpagus
sumber
11

Saya pikir saya sebenarnya akan menambahkan beberapa kode, karena googling masalah ini mengembalikan pertanyaan ini ... kebanyakan orang lebih suka penjelasan cepat atau potongan kode ke tautan yang mengarah ke halaman yang memiliki banyak informasi tambahan.

Untuk mendapatkan informasi dalam tabel, Anda harus terlebih dahulu mengakses fitur-fitur layer . Dalam kasus saya, saya menempatkan fitur dalam variabel. Kemudian Anda mengulangi fitur , dan untuk setiap fitur Anda memanggil atributnya , yang kemudian dapat dicetak menggunakan indeks kolom mereka . Misalnya, jika saya ingin mendapatkan semua nilai di kolom kedua, maka saya akan melakukan ini:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]
BritishSteel
sumber
1

Jawaban di atas hanya menunjukkan bagaimana melakukan ini untuk lapisan aktif. Saya akan berpikir, dalam banyak kasus, Anda mungkin ingin menemukan atribut kata untuk lapisan yang bukan lapisan aktif atau lapisan diperiksa di jendela Layers. Kode di bawah ini akan mendapatkan daftar semua lapisan yang telah Anda tambahkan ke jendela Layers Anda (terlepas dari apakah mereka dicentang atau aktif) dan temukan atribut di baris 2, kolom 2.

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

Catatan mapLayersByName mengembalikan daftar lapisan dengan nama yang diberikan. Saya mengasumsikan ada satu untuk contoh ini.

ajpieri
sumber