PyQGIS kullanarak öznitelik değerleri nasıl okunur?


18

Sütun 2, satır 2'de pyqgis kullanarak özellik tablosunda yer alan bilgileri almanın yolu nedir?


Bu yardımcı olur, ancak bu sadece özelliklerin değerini veriyor gibi görünüyor. Özelliklerin bir ad / değer çifti olması gerektiği anlaşılıyor. Her bir özelliğin adını nasıl alırsınız? "Alanlar" ın konusu bu mu?
ajpieri

Bu soruya gerçekten cevap vermiyor. Farklı bir sorunuz varsa Soru Sor'u tıklayarak bunu sorabilirsiniz . Ayrıca , yeterli itibara sahip olduğunuzda bu soruya daha fazla dikkat çekmek için bir ödül ekleyebilirsiniz . - Yorumdan
Martin Hügi

Yanıtlar:


43

Katmandaki her özelliğin üzerinden geçmek için getFeatures()jeneratörü kullanın . Bu QgsFeature, katmandaki özelliklerin ( ) yinelemesini döndürür .

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

Katmandaki tüm özelliklerin yerine yalnızca belirli bir özellikle ilgileniyorsanız, a QgsFeatureRequestve FID'sini kullanarak buna erişebilirsiniz :

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

Bir QgsFeaturenesneye attributes()sahip olduğunuzda, söz konusu özellikle (aka satır) ilişkilendirilmiş nitelikleri (diğer adıyla sütunlar veya alanlar) almak için yöntemi kullanabilirsiniz , örneğin:

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

Alanı sayı yerine adıyla dizine eklemek istiyorsanız alan eşlemelerini kullanmanız gerekir:

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

Alan dizini döngü sırasında değişmemelidir, bu nedenle yalnızca bir kez çağırmanız gerekir.

PyQGIS yemek kitabında daha fazla bilgi ve örnek bulunmaktadır: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Güncelleme

QgsFeatureBenzer özelliklere kullanarak özellik özelliklerine çok daha kolay erişebilirsiniz dict;

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

Hangi sürümün geldiğinden veya her zaman orada olup olmadığından emin değilim.


11

Aslında bu sorunu googling bu soruyu döndürür gibi bazı kod eklemek düşündüm ... çoğu insan çok fazla ek bilgi içeren bir sayfaya götüren bir bağlantıya hızlı bir açıklama veya bir kod snippet'i tercih eder.

Bir tablodaki bilgileri almak için önce katmanın özelliklerine erişmeniz gerekir . Benim durumumda özellikleri bir değişkene koydum. Sonra özellikleri aracılığıyla döngü ve her özellik için onun özelliklerini çağrı daha sonra kullanılarak basılabilir, sütun indeksi . Örneğin, ikinci sütundaki tüm değerleri almak istiyorsanız, bunu yapardım:

lyr = iface.activeLayer()

features = lyr.getFeatures()

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

1

Yukarıdaki yanıtlar yalnızca bunun etkin katman için nasıl yapılacağını gösterir. Birçok durumda etkin katmanlar veya Katmanlar penceresinde kontrol edilen bir katman olmayan bir katman için adı geçen özniteliği bulmak isteyebilirsiniz. Aşağıdaki kod, Katmanlar pencerenize eklediğiniz tüm katmanların bir listesini alır (işaretlenmiş veya etkin olup olmadıklarına bakılmaksızın) ve özniteliği satır 2, sütun 2'de bulur.

from qgis.core import QgsProject

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

Not mapLayersByName, verilen ada sahip katmanların bir listesini döndürür. Ben bu örnek için var olduğunu varsayıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.