Pythonを使用してQGISで選択した1つのフィーチャのデータを取得しますか?


10

PythonとQGISに関する問題/質問があります。Pythonを使用してQGISで選択した1つのフィーチャのデータを取得することは可能ですか?

私の例では、都市計画のためのいくつかの区画を示すレイヤーがあります。パーセルの1つを選択した場合、このパーセルのデータを取得します。このデータはpythonスクリプトによって読み取られ、自動的に作成されたPDFファイルに追加されます。最後の手順は簡単ですが、この選択した機能からデータを取得できませんでした。

アクティブレイヤーからデータを取得することは可能ですが、このレイヤーの選択した1つのフィーチャからデータを取得することもできますか?

あなたが私を助けることができることを願っています。よろしく

回答:


15

呼び出すlayer.selectedFeatures()と、選択した機能のリストが返されます。次にfeature.attributeMap()、選択した各機能を呼び出して、各機能の属性の辞書を取得できます。

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

私は最近同様の質問にここで答えました:pyqgisでベクターレイヤーを反復処理するとき、機能が選択されているかどうかを確認するにはどうすればよいですか?


奇妙なことに、selected_featuresの結果であるQgsFeatureオブジェクトにはジオメトリメソッドがありません...
user32882

9

バージョン2.0以降のQGIS Python APIの変更に照らして、以前の回答に対するいくつかの更新を投稿したかっただけです。

以前と同様に、選択した機能のリストをで取得しますがiface.activeLayer().selectedFeatures()QGISバージョンで>= 2.0はのQgsFeature.attributes()代わりに関数を使用しますQgsFeature.attributeMap()。二つの機能はまったく同じではありません。attributes()今すぐ返すリストは古いが、一方で、attributeMap()返された辞書を。以下のためのAPIドキュメントを閲覧する時間を取るQgsFeature.attributes()QgsAttributes属性が格納されているか/アクセスを理解することなど、。

興味がある場合は、このメーリングリストのスレッドでAPIの変更の背後にある根拠について読むことができます:[Qgis-developer]新しいベクターAPI選択機能。簡潔に(QGIS開発者Martin Dobiasの言葉で):

属性へのアクセス:f.attributeMap()属性はlistマップ(Python:)ではなくベクター(Python:)に格納されるようになったため、もうありませんdictQgsFeatureクラスはpythonコンテナーオブジェクト4をエミュレートする ため、QgsFeatureインスタンスがリストまたは辞書であるかのように属性にアクセスでき、キーはフィールドインデックスまたはフィールド名のいずれかです。

f[0] ...最初の属性

f["type"] ...「type」という名前の属性

すべての属性を取得することも可能f.attributes()です。値のリストを返します。

そのため、具体的にどのように実行するか(選択した単一の機能のデータを取得する)の例として、city属性を含む属性のリストを持つ機能を含むレイヤーがあるとしcountyます。county選択した特定の都市の値(たとえばHelena, AR)を取得するには、Pythonコンソールで次のようにします。

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

都市の属性テーブルのすべてのフィールドの値が必要な場合は、次のように使用します。

cityData = city.attributes()

また、フィールド名のリストを返すcity.fields()。names()を使用して、この例からすべてのフィールド名を取得できます。
Cary H

1

J.テイラーから提供された回答に役立つものを追加し、2012年から現在受け入れられている回答が正しくないことを指摘します。

QgsFeatureオブジェクトは便利な__geo_interface__属性をサポートします。これは、特定の機能から辞書を返します。辞書は実際にはGeoJSON標準に含まれているため、すべての属性と値のペアとジオメトリが含まれます。この機能はしばらく前から存在し、2012年にSean Gilliesによって最初に説明さましたここでの使用例を示します。QGISのどのバージョンから入手できるのか情報が見つからず、まだQGIS 3を試していませんが、少なくともQGIS 2.14からは確実に入手できました。

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