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:
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]
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 importQgsProject
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.
Jawaban:
Untuk mengulang setiap fitur dalam satu layer, gunakan
getFeatures()
generator. Ini mengembalikan iterator fitur (QgsFeature
) di lapisan.Jika Anda hanya tertarik pada fitur tertentu, alih-alih semua fitur di layer, Anda dapat mengaksesnya menggunakan
QgsFeatureRequest
dan itu FID:Setelah Anda memiliki
QgsFeature
objek, Anda dapat menggunakanattributes()
metode untuk mengambil atribut (alias kolom atau bidang) yang terkait dengan fitur itu (alias baris), misalnya:Jika Anda ingin mengindeks bidang dengan nama itu, bukan angka, Anda perlu menggunakan pemetaan bidang:
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
QgsFeature
like adict
, misSaya tidak yakin versi mana yang masuk atau apakah selalu ada di sana.
sumber
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:
sumber
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.
Catatan mapLayersByName mengembalikan daftar lapisan dengan nama yang diberikan. Saya mengasumsikan ada satu untuk contoh ini.
sumber