Özellikler Python kullanarak özelliklerine göre filtreleniyor mu?


16

Özellikleri python kullanarak Qgis'te özelliklerine göre (arcobjects'teki Iqueryfilter benzeri) nasıl alabilirim? Tüm özellikleri almak ve manuel olarak filtrelemek yerine, filtrelemek için nerede yan tümcesini kullanma seçeneği var mı?

Örnek: 'İlçeler' adında bir alan adım var. Elli binden fazla özelliği var. Zaman alıcı olduğu için tüm özellikleri getirip filtrelemek mümkün değil. Yani ben arcobjects iqueryfilter.whereclause = 'İlçeler = Norwich' kullanarak sorgulayabilirsiniz. PyQgis'te ihtiyacım olan benzer şey.


1
@NathanW evet haklısın. sadece katmandan bir sorgu kullanarak veri döndürmek gerekir. bana pyqgis'de bir örnek verebilir misiniz?
venkat

@NathanW Merhaba anladım. arcgis tanım sorgusu gibi çalışıyor. bu örneğe bakın. t == True: outputProvider = outputLayer.dataProvider () print outputProvider.featureCount () ise toPyObject ()) yani yalnızca sorguyu döndürür memnun veriler
venkat

@venkat sorguyu QGIS'de nereye koyuyorsunuz? Teşekkürler.
ianbroad

Yanıtlar:


12

QGIS ifade motoru bu QgsFeatureRequest.setFilterExpression( unicode )yöntemi kullanarak bunu yapabilir (QGIS 2.2'den beri)

request = QgsFeatureRequest().setFilterExpression( u'"Counties" = \'Norwich\'' )
it = l.getFeatures( request )

QGIS 2.10'dan başlayarak, bu şekilde filtrelemenin size diğer filtreleme türlerine (python uygulamaları gibi) göre ekstra performans vermesi bile mümkündür.

Temel olarak bu, aşağıdaki üç koşul karşılandığında geçerlidir:

  • Postgis sağlayıcısı ile bir katman kullanıyorsunuz Şu anda (2.16) postgis sağlayıcısından çok daha fazlası bunu uyguluyor (spatialite, ogr, oracle ...).
  • Kişisel ifadesi aşırı karmaşık değildir (şeyler gibi >, =, IN, NOT NULL... desteklenmektedir)
  • Bu özelliği Ayarlar> Seçenekler> Veri Kaynakları> Veri Kaynağı İşleme> Postgres sunucu tarafında ifadeyi çalıştır'da etkinleştirdiniz
  • Veritabanı tablolarındaki uygun dizinlerle performans avantajı en uygunudur

QGIS 3.0 ile basitçe

features = l.getFeatures('"Counties" = \'Norwicth\'')

1

Yinelenen bir sorunun cevabı olarak düşünülebilecek bu gönderi , bir katmandaki tüm niteliklerin nasıl getirileceğini açıklar. Yazar, aradığınız işlemi, verileri döndürüldükten sonra manuel olarak filtreleme olarak tanımlar. Oldukça eksiksiz bir referans ve bağlantıları gerçekten size yardımcı olmalı.


2
Bu yinelenen bir soru değil. bir katmandaki tüm nitelikleri almak istemiyorum. Önce filtre ve sonra filtre ölçütleri altında gelen özellikleri almak istiyorum. yani performans çok daha iyi.
venkat

1

Bir sql sorgusu kullanarak da kolayca mümkündür ogr. Bu kodu örneğin QGIS python konsolunda veya bağımsız bir komut dosyasında yürütebilirsiniz.
Örnek :

from osgeo import ogr

path = "path to your shapefile.shp"
ID = "FieldID" # For instance 'Countries' 
datasource = ogr.Open(str(path)) # your datasource

layer = datasource.GetLayer(0) # Import layer 0 --> only works with shapefiles
layerName = str( layer.GetName() )# Save the Layersname first

# Do the sql query
# Selects all features from a layer datasource where Field Countries is equal to 'Germany'
layers = datasource.ExecuteSQL("SELECT * FROM %s WHERE %s = '%s'" % (layerName, ID, 'Germany') )
res = []
for i in range(0,layers.GetFeatureCount()):
   f = layers.GetFeature(i)
   g = f.GetGeometryRef()
   res.append(g.Area()) 

# res now contains the measured area of each feature where the attribute ID has the value 'Germany'

0

SQL filtrelerinin belirtilmesi, 1.9 sürümünden itibaren QGIS API'sı kullanılarak henüz desteklenmemektedir.

Bu posta listesi makalesinden anladığım gibi , "yerel sağlayıcının SQL" desteği yalnızca gelecekteki bir sürümde olacaktır.

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.