1つのシェープファイル属性テーブルを別のdbfテーブルの値で更新する


10

ここで私がやろうとしていることを説明しようとします:

同じフィールドを持つ1つのシェープファイルと1つの独立したdbfテーブルがあります。dbfテーブルではすべてのフィールドにデータが入力されていますが、シェープファイル属性テーブルでは1つだけなので、「OneField」という名前を付けます。私がやりたいことは、「OneField」(Shapefile)の値が「OneField」(dbfテーブル)の値と同じであることを確認し、同じ場合は、シェープファイル属性テーブルの残りの空のフィールドに値を設定することです。独立したdbfテーブル内。

現時点では、独立したdbfテーブルからシェープファイル属性テーブルに値をコピーしようとしているだけですが、行き詰まっています(このコードを実行すると、pythonwinが動作を停止し、テーブルに何も起こらないというメッセージが表示されます)。手を貸してくれませんか?

これがコードです:

import arcpy

table = "link/to/table.dbf"
fc = "link/to/shapefile.shp"

# Create a search cursor

rowsTable = arcpy.SearchCursor(table)

# Create an update cursor

rowsFc = arcpy.UpdateCursor(fc) 

for row in rowsTable:
    row = row.getValue("OneField")
    valueTable = row
    for row in rowsFc:
        row = row.setValue("OneField", valueTable)
        rowsFc.updateRow(row)
        row = rowsFc.next()
    row = rowsTable.next()    

del row, rowsFc, rowsTable

どうもありがとうございました


1
元の質問を編集して、修正したり情報を追加したりできます。
Brad Nesom、

.next()が含まれるすべての行を取り出してみてください。arcpyを使用すると、行は反復可能であり、それらの「for」ループに対しては、.next()を実行しないでください
gotchula

回答:


3

これは、QGIS ftoolsの「属性による結合」ツールが行っていることとまったく同じです。シェープファイルとdbfファイル(または2番目のシェープファイル)を受け取り、それらの属性テーブルを結合します。ツールはpythonで記述されているため、必要なものはすべてここにあります。http//trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py


3

コードの観点から見ると、「行」を使用して(〜4)さまざまなものを作成しているように見えますが、その一部は不要であるように見えます。私はarcpyをあまり使用しませんが、このようなものがよりうまく機能すると思います。含まれている場合、FCのOneField列全体に、テーブルのOneFieldの最後の値が入力されます。

for rowT in rowsTable:
    valueTable = rowT.getValue("OneField")
    for rowF in rowsFc:
        rowF.setValue("OneField", valueTable)
        rowsFc.updateRow(rowF)
        rowF = rowsFc.next()
    rowT = rowsTable.next() 

ノイハウザー、どうもありがとう、それはあなたの言い方でうまくいきます
ボグダンパレード


2

データをdbfからシェープファイルに移動するための私の方法。(もちろん、これをguiソフトウェア内で行うことをお勧めします)dbfをシェープファイルに結合することです。

その時点で、通常はnullでない属性を選択します(これは2番目のテーブルのidフィールドで行います)。それらがnullでない場合、それらは一致しました。

これが完了したら、shapefile.onefield <> table.onefieldによって値を選択できます。

次に、シェープファイルで計算を実行します。


-1

あなたの質問に答えないで申し訳ありませんが、代わりにdb-environmentで間違いなくこれを行います。特にそれが大量のデータである場合、それはおそらくはるかに速くなります。

たとえば、シェープファイルとdbfをPostGISデータベースにロードすると、クエリは次のようになります。

CREATE TABLE new_table AS
SELECT a.the_geom, a.populated_field, b.populated_field2, b.populated_field3
FROM shape_table a LEFT JOIN dbf_table b ON a.populated_field=b.populated_field1;

結合フィールドにインデックスを付けると、これは非常に高速になります。もちろん、代わりにshape_tableを更新することもできますが、元のデータを破壊しないように、代わりに新しいテーブルを作成したいです。

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