Python kullanarak QGIS'te seçilen bir özelliğin verilerini alma?


10

Python ve QGIS ile ilgili bir sorunum / sorum var. QGIS'te seçilen bir özelliğin verilerini python kullanarak elde etmek mümkün müdür ve eğer öyleyse nasıl?

Örneğimde, kentsel planlama için bazı parselleri gösteren bir katmanım var. Şimdi parsellerden birini seçersem, tam olarak bu parsel için veri almak istiyorum. Bu veriler bir python betiği tarafından okunmalı ve daha sonra otomatik olarak oluşturulan bir PDF dosyasına eklenmelidir. Son adım kolaydır, ancak seçilen bu özellikten veri alamadım.

Etkin katmandan veri almak mümkündür, ancak bu katmanın seçilen bir özelliğinden veri almak da mümkün müdür?

Umarım bana yardım edebilirsin. Saygılarımızla

Yanıtlar:


15

Arama layer.selectedFeatures(), seçtiğiniz özelliklerin bulunduğu bir liste döndürür. Daha sonra feature.attributeMap(), her bir özelliğin özniteliklerinin bir sözlüğünü almak için seçilen özelliklerin her birini arayabilirsiniz .

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())

Geçenlerde burada benzer bir soru vardı: Pyqgis ile bir vektör katmanı üzerinde yineleme yaparken, bir özelliğin seçili olup olmadığını nasıl kontrol edebilirim?


garip, seçilen_features sonuçlanan QgsFeature nesnelerin geometri yöntemi yoktur ...
user32882 15:18

9

Sürüm 2.0'dan bu yana QGIS Python API'sindeki değişiklikler ışığında önceki cevaba bazı güncellemeler göndermek istedim .

Daha önce olduğu gibi, seçili özelliklerin bir listesini alırsınız iface.activeLayer().selectedFeatures(), ancak QGISsürümlerde >= 2.0artık işlevi QgsFeature.attributes()yerine kullanıyorsunuz QgsFeature.attributeMap(). İki işlev tam olarak aynı değildir: attributes()şimdi bir liste döndürürken , eski attributeMap()bir sözlük döndürdü . API belgelerine göz atmak için biraz zaman ayırın QgsFeature.attributes(), QgsAttributesvb nitelikler / saklanan erişilen anlamak için.

İlgileniyorsanız, bu posta listesi iş parçacığında API değişikliklerinin arkasındaki mantık hakkında bilgi edinebilirsiniz: [Qgis-developer] new vector api select features . Kısaca (QGIS geliştiricisi Martin Dobias'ın sözleriyle):

Özniteliklere erişim: f.attributeMap()artık yok, çünkü öznitelikler artık listbir harita (Python:) yerine bir vektörde (Python:) saklanmaktadır dict. QgsFeaturesınıf piton konteyner nesnesi emüle 4 sanki özelliklerini erişebilmesi için QgsFeatureörnek bir liste veya sözlüktü tuşları ya saha indeksleri veya alan adları olmak üzere:

f[0] ... ilk özellik

f["type"] ... "type" adlı özellik

Tüm nitelikleri almak hala mümkündür: f.attributes()bir değer listesi döndürür.

Özellikle nasıl yapılacağını sorduğunuza bir örnek olarak (seçtiğiniz tek bir özellik için veri alma), cityher biri bir özellik de dahil olmak üzere bir countyözellik listesine sahip bir özellik katmanı bulunduğunu varsayalım . Seçtiğiniz county(örneğin Helena, AR) belirli bir şehrin değerini öğrenmek için Python konsolunda aşağıdakileri yapın:

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

Şehrin öznitelik tablosundaki tüm alanların değerlerini istiyorsanız, sadece şunu kullanırsınız:

cityData = city.attributes()

Ayrıca, alan adlarının listesini döndürecek olan city.fields (). Names () öğesini kullanarak bu örnekteki tüm alan adlarını alabilirsiniz.
Cary H

1

J. Taylor tarafından verilen cevaba yararlı bir şey eklemek istiyorum ve 2012'de kabul edilen mevcut cevabın artık doğru olmadığını belirtmek istiyorum:

QgsFeature nesnesi, __geo_interface__belirli bir özellikten bir sözlük döndüren kullanışlı özniteliği destekler . Sözlük aslında bir GeoJSON standardındadır, bu nedenle tüm özellik-değer çiftlerini ve geometrisini dahil edersiniz. Bu özellik bir süredir var, ilk kez 2012 yılında Sean Gillies tarafından tarif edildi ve burada örnek bir kullanım var . QGIS'in hangi sürümünden herhangi bir bilgi bulamadım ve henüz QGIS 3'ü denemedim, ancak en azından QGIS 2.14'ten kesinlikle ulaşılabilirdi.

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
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.