ArcPyの行/フィールドの更新/削除に対応するQGISの同等の機能は何ですか?


8

一部のスクリプトをArcPyからQGIS(1.8または2.0)に再プログラムしようとしていますが、やり直したいいくつかの単純な関数がありますが、残念ながら、QGISのドキュメントには特定の領域がありません。

つまり、私にとって最も重要な3つは次のとおりです。

フィールドを追加 - フィールドを追加

arcpy.AddField_management(Feature, "ID", "SHORT")

フィールド管理の計算 -そのフィールドを更新

arcpy.CalculateField_management(Feature,"ID","!FID!")

行の更新/削除 -条件に基づいて行を更新/削除(シェープファイルをコピーしない)

keep = ["Bob","Janet","John","Mike"]
Counter = 0
rows = arcpy.UpdateCursor(Feature)

for row in rows:
    if row.Name in keep:
        row.ID = Counter
        rows.updateRow(row)
    else:
        rows.deleteRow(row)
    Counter += 1

これで、SEXTANTEを使用してQGISの各フィーチャを反復処理し、そのジオメトリを取得できます。これを新しいシェープファイルに書き換えて、行またはフィールドを更新/削除できます。に沿って何かから始まります...

layer = st.getobject(Polygon)
features = st.getfeatures(layer)
for f in features:
    f.geometry().asPolygon()

しかし、私は上記のこれらの機能の簡単な解決策を見つけることができませんか?


質問の最後の部分の目的は何なのか、よくわかりません。なぜSEXTANTEに言及するのですか?新しいシェープファイルに書き換えるメソッドを要求しますが、コードの抜粋はそのような面倒なことは何もしません。
Matthias Kuhn

回答:


16

次の例は、(間もなくリリースされる)QGIS 2.0 APIに基づいています。これは1.8以降変更されたため、このバージョンの構文は場所によって異なります。

1.8準拠のソリューションの最適なリソースとパラメーターの背景に関する詳細な説明(2.0にも適用)は、PyQGISクックブックです。

vlたとえば、次のようにして取得したと呼ばれるベクターレイヤーへの参照があると仮定します

vl = iface.activeLayer()

取引

以下の例は、トランザクションで機能しています(ローカルでQGISにキャッシュされています)。編集セッションを開始する前に、呼び出す必要があります

vl.startEditing()

そしてそれで終わる

vl.commitChanges()

変更をデータソースに書き込みます。または

vl.rollBack()

変更を却下する

vl.dataProvider()トランザクション制御ステートメントを直接操作して忘れることもできます。(オートコミットのような動作になります)

フィールドを追加する

QgsVectorLayer.addAttribute(QgsField)

from PyQt4.QtCore import QVariant
vl.addAttribute( QgsField( 'fieldname', QVariant.String ) )

これは、データプロバイダーがAddAttributes機能を実装している場合にのみ機能します。これは次の方法で確認できます。

if vl.dataProvider().capabilities() & QgsVectorDataProvider.ChangeAttributeValues

フィールドを計算する

この答えを見てください:

プログラムで計算フィールドを追加することは可能ですか?

それはまだ1.8を目指しているので、代わりにvl.select()2.0を呼び出す必要がありますvl.getFeatures()QGIS APIの変更を参照)

行を更新する

QgsVectorLayer.updateField(featureId、fieldIndex、value)

vl.updateField( 1000, 5, 'hello' )

前提条件チェック(オプション):

if vl.dataProvider().capabilities() & QgsVectorDataProvider.ChangeAttributeValues

fieldIndexを知るには、 QgsVectorLayer.pendingFields()

編集:読みやすいQgsVectorLayer.updateFeature( feature )方法について言及しているNathanWのコメントも参照してください。

行を削除する

QgsVectorLayer.deleteFeature(featureId)

vl.deleteFeature( 1000 )

オプションの前提条件チェック:

if vl.dataProvider().capabilities() & QgsVectorDataProvider.DeleteFeatures

2
を使用してfeature[5] = 'hello'layer.updateFeature(feature)vl.updateField IMOを使用するよりも優れている
Nathan W

5

これは、PyQGISでコードを実行する方法です。

keep = ["Bob","Janet","John","Mike"]

for counter, feature in enumerate(layer.getFeatures()):
    if feature['Name'] in keep:
        feature['ID'] = counter
        layer.updateFeature(feature)
    else:
        layer.deleteFeature(feature.id())

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