ArcPy добавляет ошибочное внутреннее кольцо при написании смежной, составной геометрии?

12

Я столкнулся со странной проблемой при использовании Arcpy для записи многочастной геометрии в шейп-файл. Я использую InsertCursor для создания многокомпонентного объекта из списка частей, каждый со списком пар вершин. Я понимаю, что при создании этой функции соседние несколько частей автоматически «растворяются» в одной части. Но по какой-то причине это создает внутреннее кольцо, хотя я не включил в массив Null arcpy.point (), как это обычно требуется для добавления внутренних колец. Вот визуализация:

Визуализация дугообразной ошибки

У кого-нибудь есть идеи, почему это происходит и / или как преодолеть проблему?

Для справки вот мой код:

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)
dmahr
источник
1
Да, у метода arcpy.AsShape есть проблемы - посмотрите здесь еще один пример этого некорректного поведения: gis.stackexchange.com/questions/10201/…
valveLondon

Ответы:

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)
Jezibelle
источник