Pythonを使用して属性に基づいて機能をフィルターしますか?


16

Pythonを使用してQgisで属性(arcobjectsのIqueryfilterに似ています)で機能を取得する方法は?すべての機能を取得して手動でフィルタリングする代わりに、where句を使用してフィルタリングするオプションはありますか?

例:「Counties」というフィールド名があります。5万を超える機能があります。つまり、時間がかかるため、すべての機能を取得してフィルタリングすることはできません。だから私はアークオブジェクトでiqueryfilter.whereclause = 'Counties = Norwich'を使用してそれをクエリすることができます。PyQgisでも同様のことが必要です。


1
@NathanWはい、あなたは正しいです。レイヤーからクエリを使用してデータを返すだけです。pyqgisで例を教えてもらえますか?
ベンカット

@NathanWこんにちは arcgisの定義クエリのように機能します。この例を参照してください。t = outputLayer.setSubsetString( 'UniqID =' + inputFeat.attribute( "UniqID")。toPyObject())if t == True:outputProvider = outputLayer.dataProvider()print outputProvider.featureCount()つまり、クエリのみを返します満足したデータ
ベンカット

@venkat QGISのどこにクエリを配置しますか?ありがとう。
ianbroad

回答:


12

QGIS式エンジンは、QgsFeatureRequest.setFilterExpression( unicode )メソッドを使用してこれを行うことができます(QGIS 2.2以降)

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

QGIS 2.10以降では、このような方法でフィルタリングを行うと、他のタイプのフィルタリング(Python実装など)よりもパフォーマンスが向上する可能性さえあります。

基本的に、これは次の3つの条件が満たされている場合に適用されます。

  • postgisプロバイダーでレイヤーを使用しています(2.16)現時点では、postgisプロバイダーだけでなく、これを実装するものも多くあります(spatialite、ogr、oracle ...)。
  • あなたの表現が過度に複雑ではありません(物事が好き>=INNOT NULL...サポートされています)
  • この機能を有効にしたのは、[設定]> [オプション]> [データソース]> [データソース処理]> [postgresサーバー側で式を実行]
  • データベーステーブルの適切なインデックスを使用すると、パフォーマンス上の利点が最適になります。

QGIS 3.0では、簡単に行うことさえ可能です

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

1

この投稿 -重複した質問への回答と見なすことができます-レイヤーからすべての属性を取得する方法の詳細。作成者は、データが返されたら手動でデータをフィルタリングすることで、探しているプロセスを説明します。それはかなり完全なリファレンスであり、彼らのリンクは本当にあなたを助けるはずです。


2
これは重複した質問ではありません。レイヤーからすべての属性を取得したくない。最初にそれをフィルターし、次にフィルター基準に含まれる機能を取得します。すなわち、パフォーマンスがはるかに優れています。
ベンカット

1

SQLクエリを使用することで、でも簡単に使用できogrます。たとえば、QGIS pythonコンソールまたはスタンドアロンスクリプトでこのコードを実行できます。

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

バージョン1.9では、QGIS APIを使用したSQLフィルターの指定はまだサポートされていません。

このメーリングリストの記事から理解できるように、「ネイティブプロバイダーのSQL」のサポートは将来のリリースでのみ行われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.