3

シェープ ファイルのすべてのポリラインを取得するために arcpy を使用しています。SearchCursorカーソルを返すので、シェープ ファイルのすべての機能を反復処理できます。問題は、後で使用するために、カーソルによって返されたすべてのオブジェクトを保存したいことです。

import arcpy
from arcpy import env

env.workspace = r"C:\GIS Data\GIS data"

desc = arcpy.Describe("River.shp")
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor("River.shp")

featureList = ()

for row in rows:
    feat = row.getValue(shapefieldname)

    featureList = featureList + (feat, )

    print "%i %i" % (featureList[-1].firstPoint.X, featureList[-1].firstPoint.Y)
    print "%i %i" % (featureList[-1].lastPoint.X, featureList[-1].lastPoint.Y)

    print

print "---------------------------------------------------------------"

for feat in featureList:
    print "%i %i" % (feat.firstPoint.X, feat.firstPoint.Y)
    print "%i %i" % (feat.lastPoint.X, feat.lastPoint.Y)
    print

カーソルによって返されるすべてのオブジェクトを含むはずのタプル。sizeただし、タプル回数の最後の要素のみが繰り返されます。

3610930 2135882 3611593 2134453

3611806 2134981 3611593 2134453

3614160 2136164 3617432 2131734

3611593 2134453 3617432 2131734

3617432 2131734 3620568 2127591

3620568 2127591 3620785 2127423

3617980 2126657 3620568 2127591

3616768 2129454 3617948 2126649

3617948 2126649 3617980 2126657

3615102 2128889 3617587 2126510

3617587 2126510 3617948 2126649

3617624 2126416 3617980 2126657

3613129 2128176 3615155 2125617

3615155 2125617 3617587 2126510

3615086 2125515 3615155 2125617


3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

3615086 2125515 3615155 2125617

最初に、リストを使用してこれを試しました。「append()」メソッドを使用した場合、リストにも同じ出力が見つかりました。タプルは不変のデータ構造であるため+、タプルの以前のすべての要素をどのように上書きできますか。このコードはarcpy用に書かれていますが、問題はarcgis固有ではないと思います.

4

2 に答える 2

4

これが示唆しているのは、同じオブジェクトへのrow.getValue()参照を返し続け、そのオブジェクトが所定の位置で更新され続けるということです。

id(feat)確認するには、を印刷id(feat.firstPoint)id(feat.lastPoint)て、最初のループで、反復間でIDのいずれかが同じままであるかどうかを確認します。それらのいずれかがそうなら、それはあなたの問題です。

タプルは不変のデータ構造であるため、タプルの以前のすべての要素を+どのように上書きできますか。

そうではありません。タプルは、新しいタプルを作成せずに要素を追加または削除できないという意味で不変です。タプル要素の値を変更することもできません。ただし、その要素が可変オブジェクトへの参照である場合は、オブジェクト自体を自由に変更できます。これが私がここで起こっていると思うことです。同じオブジェクトへの複数の参照があります。1つを変更すると、それらはすべて変更されたように見えます。

于 2012-05-30T11:19:44.497 に答える
0

これは、1 行のリスト内包表記として実行できます。

import arcpy
from arcpy import env

env.workspace = r"C:\GIS Data\GIS data"

desc = arcpy.Describe("River.shp")
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor("River.shp")

feature_list = [row.getValue( shapefieldname ) for row in rows]

この例では、'feature_list' は形状フィールドの値のリストになります。

于 2012-06-01T01:03:08.867 に答える