Pythonを使用してQGISで「属性で選択」?


16

pythonコマンドを使用してQGISで「属性で選択」機能を使用する方法はありますか?私のプラグインでは、ユーザーはGUIを介して値を入力する必要があり、この値は、この属性を持つすべての機能を選択する関数で使用する必要があります。列名はコード内で固定されており、関数は正しい値のみを検索する必要があります。

私の現在のソリューションでは、関数はQGISをPostgreSQLデータベースに接続し、SQLステートメントを実行します。これにより、結果からテーブルが作成され、テーブルはQGISでシェープファイルとして視覚化されます。

原則として、選択範囲の新しいシェープファイルを作成せずに、機能を強調表示すれば十分です。「属性で選択」機能を使用すると、不要なデータベース接続もスキップされます。

機能が強調表示されるように、Pythonで「属性で選択」機能を使用する方法はありますか?QGISで関数を使用すると、クエリに一致しないすべての機能は一時的に空白になりますが、これも問題ありません。


1
これらの回答には、qgis 3アップデートが必要です。
MonsterMushroom

回答:


8

はい。Pythonバインディングを介してすべての属性を取得し、独自のプラグインに追加のフィルタリングを実装できます。要約といくつかの例については、このPyQGIS Coobookの抜粋をご覧ください。次に、返された辞書から一致しない結果を除外します。

視覚化に関しては、select()適切な引数がないため、別のレイヤーを作成する必要があります。メモリレイヤーを使用すると、物理ファイルを作成する必要がなくなります(詳細についてはクックブックを参照)。

編集:

実際には、selectedFeaturesIds()with setSelectedFeatures(ids)を使用して、作成したサブセットの選択を変更できます。実装を直接引用する:

/** Get a copy of the user-selected features */  
QList<QgsFeature> selectedFeatures();

/** Return reference to identifiers of selected features */
const QSet<qint64> &selectedFeaturesIds() const;

/** Change selection to the new set of features */
void setSelectedFeatures(const QSet<qint64> &ids);

お気の毒に!arcpyを使用したArcGISでも可能であるため、QGISで可能だと思いました。それにもかかわらずあなたの答えをありがとう!
userHH

たぶん方法があります。知りません。サイトの他のユーザーにしばらく時間を与えてください。
lynxlynxlynx

それは可能に違いないと思います。QGISでは、選択に一致するすべての機能が視覚化され、他のすべての機能は一時的に空白になります。
userHH

それは、見つけた。QGISはこれをコアで実行しますが、選択を適切に調整するために十分なインターフェイスを公開しているようです。
lynxlynxlynx

リンクを送ってもらえますか?
userHH

9

QGIS 2.2以降、これは非常に自然な方法でサポートされています。QgsFeatureRequest.setFilterExpression( unicode )メソッドを使用してQGIS式エンジンを介して実行できます。

# The important part: get the feature iterator with an expression
it = l.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"Counties" = \'Norwich\'' ) )
# Set the selection
l.setSelectedFeatures( [ f.id() for f in it ] )

最も良い点は、最新のQGISバージョン(2.10以降)を使用している場合、非常に読みやすく、他のソリューションよりもはるかに高いパフォーマンスでデータベースで直接フィルタリングされることです。


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