PyQGISを使用して属性値を読み取る方法は?


18

pyqgisを使用して、列2、列2などの属性テーブルに含まれる情報を取得する方法は何ですか?


これは役立ちますが、これは属性の値を提供するだけのようです。属性は名前/値のペアである必要があるようです。各属性の名前はどのようにして取得しますか?それが「フィールド」のすべてですか?
ajpieri

これは本当に質問に答えません。別の質問がある場合は、質問するをクリックして質問できます。十分な評判を得たら、この質問にもっと注意を引くために賞金追加することもできます。- レビューから
MartinHügi18年

回答:


43

レイヤー内のすべてのフィーチャをループするには、getFeatures()ジェネレーターを使用します。これはQgsFeature、レイヤー内のフィーチャの反復子()を返します。

for feature in layer.getFeatures():
    pass # do something with feature

レイヤー内のすべての機能ではなく、特定の機能のみに関心がある場合は、a QgsFeatureRequestとそのFID を使用してアクセスできます。

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

あなたが持ってたらQgsFeatureオブジェクトをあなたが使用することができattributes()、その機能(別名行)、例えばに関連付けられている(列またはフィールド別名)属性を取得する方法を:

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

フィールドを番号ではなく名前でインデックス付けする場合は、フィールドマッピングを使用する必要があります。

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

フィールドインデックスはループ中に変更されるべきではないので、一度呼び出すだけで済みます。

PyQGISクックブックには詳細と例がありますhttp ://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

更新

あなたは使用してはるかに簡単な特徴の属性にアクセスすることができますQgsFeatureようにdict、例えば

for feature in layer.getFeatures():
    name = feature["name"]

どのバージョンが入ったのか、それが常にあったのかはわかりません。


11

この問題をグーグルで検索するとこの質問が返されるので、実際にコードを追加すると思います...ほとんどの人は、多くの追加情報を含むページにつながるリンクよりも簡単な説明またはコードスニペットを好みます。

テーブルの情報を取得するには、まずレイヤーの機能アクセスする必要があります。私の場合、機能を変数に入れました。次に、機能ループし、機能ごとに属性呼び出します。属性は列インデックスを使用して印刷できます。たとえば、2番目の列のすべての値を取得する場合は、次のようにします。

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]

1

上記の回答は、アクティブレイヤーに対してこれを行う方法のみを示しています。多くの場合、アクティブなレイヤーではないレイヤーまたはレイヤーウィンドウでチェックされているレイヤーの属性を見つけたいと思うでしょう。以下のコードは、Layersウィンドウに追加したすべてのレイヤーのリストを取得し(チェックされているかアクティブであるかに関係なく)、行2、列2で属性を見つけます。

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

注mapLayersByNameは、指定された名前のレイヤーのリストを返します。私はこの例のために存在すると仮定しています。

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