ArcPyは、隣接するマルチパートジオメトリを書き込むときに誤った内部リングを追加しますか?


12

Arcpyを使用してマルチパートジオメトリをシェープファイルに書き込むと、奇妙な問題に遭遇しました。InsertCursorを使用して、頂点ペアのリストを持つ各パーツのリストからマルチパートフィーチャーを作成しています。この機能を作成すると、隣接する複数のパーツが自動的に単一のパーツに「溶解」されることを理解しています。しかし、何らかの理由で、通常は内部リングを追加するために必要なNull arcpy.point()を配列に含めなかったにもかかわらず、これは内部リングを作成しています。これが視覚化です:

arcpyエラーの可視化

誰がこれが起こっているのか、および/または問題を克服する方法を知っていますか?

参考のために、ここに私のコードがあります:

import arcpy

arcpy.CreateFeatureclass_management(r"C:\temp", "test.shp", "POLYGON")
OutputCursor = arcpy.InsertCursor(r"C:\temp\test.shp")

# List of parts, each with list of vertex pairs
ListOfParts = []
ListOfParts.append([[0,1],[1,1],[1,0],[0,0],[0,1]])
ListOfParts.append([[0,2],[1,2],[1,1],[0,1],[0,2]])
ListOfParts.append([[0,3],[1,3],[1,2],[0,2],[0,3]])
ListOfParts.append([[1,1],[2,1],[2,0],[1,0],[1,1]])
ListOfParts.append([[1,2],[2,2],[2,1],[1,1],[1,2]])
ListOfParts.append([[1,3],[2,3],[2,2],[1,2],[1,3]])
ListOfParts.append([[2,1],[3,1],[3,0],[2,0],[2,1]])
ListOfParts.append([[2,2],[3,2],[3,1],[2,1],[2,2]])
ListOfParts.append([[2,3],[3,3],[3,2],[2,2],[2,3]])

# Array of parts to be passed to newRow()
ArrayOfParts = arcpy.Array()

# Add parts to array
for Part in ListOfParts:
    ArrayOfVertices = arcpy.Array()
    for Vertex in Part:
        ArrayOfVertices.add(arcpy.Point(Vertex[0],Vertex[1]))
    ArrayOfParts.add(ArrayOfVertices)
    ArrayOfVertices.removeAll()

# Output new feature
OutputFeature = OutputCursor.newRow()
OutputFeature.shape = ArrayOfParts
OutputCursor.insertRow(OutputFeature)

1
ええ-arcpy.AsShapeメソッドには問題があります-この欠陥のある動作の別の例についてはこちらを参照してください:gis.stackexchange.com/questions/10201/…– valveLondon
20:23

回答:


2

多角形の内部に点を定義して、形状に含めました。これにより、必要な出力ではなく、取得した出力が作成されます。プログラムは、ポリゴン定義に入れられた各ポイントをポリゴンの頂点を定義するものとして扱います。したがって、ポリゴン定義にすべての頂点を含めると、各頂点間にエッジを持つポリゴンが返されます。リングを削除するには、グリッド内の各ボックスに個別にポリゴンを作成してから、ポリゴンを一緒にディゾルブする必要があります。

または、上記のコードを次のように編集して、正方形の外部ポイントのみを含めることもできます。

import arcpy

arcpy.CreateFeatureclass_management(r"C:\temp", "test.shp", "POLYGON")
OutputCursor = arcpy.InsertCursor(r"C:\temp\test.shp")

# List of parts, each with list of vertex pairs
ListOfParts = []
ListOfParts.append([[0,3],[3,3],[3,0],[0,0],[0,3]])

# Array of parts to be passed to newRow()
ArrayOfParts = arcpy.Array()

# Add parts to array
for Part in ListOfParts:
    ArrayOfVertices = arcpy.Array()
    for Vertex in Part:
        ArrayOfVertices.add(arcpy.Point(Vertex[0],Vertex[1]))
    ArrayOfParts.add(ArrayOfVertices)
    ArrayOfVertices.removeAll()

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