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

Відповіді:


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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.