Как разбить вогнутый многоугольник на выпуклые многоугольники в Arcpy?

20

Я ищу инструмент или алгоритм для обнаружения вогнутых многоугольников и разделения их на выпуклые многоугольники. Как объяснено на рисунке, синий многоугольник разбит на многоугольники A и B

Я использую Arcpy под Arcgis 10.1

разделить полигоны

geogeek
источник
15
Возможно, вы могли бы уточнить, почему вы это делаете? В конце концов, (а) обнаружение легко: вогнутый многоугольник будет иметь меньшую площадь, чем его выпуклая оболочка; и (б) любая триангуляция многоугольника автоматически разбивает его на выпуклые многоугольники, потому что все треугольники являются выпуклыми. Это показывает, что у вас есть некоторая гибкость в выборе среди множества возможных решений.
whuber
2
Этот набор инструментов позволит вам увидеть, о чем говорит Билл resources.arcgis.com/gallery/file/geoprocessing/… преобразовать полигон в точки, а затем запустить опцию Делоне
1
Ответ об этом можно найти в Stack Overflow: stackoverflow.com/a/6686842/1300519 Описанные алгоритмы не должны быть слишком сложными для написания с использованием arcpy.
Снорфалорпаг
1
@snorf Это, кажется, отвечает на немного, но важно, другой вопрос. Решение, очевидно, включает в себя комбинацию «полигонов» и «дырок» , что обычно не означает «расщепление». По крайней мере, этот ответ нуждается в дальнейшей разработке, чтобы быть полезным здесь. (Кстати, ваш ответ был изменен на комментарий, потому что перекрестные ссылки на другие решения в других местах в Интернете без каких-либо дополнительных объяснений здесь не рассматриваются как ответы на SE.)
whuber
2
Судя по комментариям и отсутствующим ответам, я бы порекомендовал отредактировать ваш вопрос, чтобы включить этот отзыв и рассмотреть вопрос о предоставлении вознаграждения.
PolyGeo

Ответы:

1

Вот несколько шагов для определения вершин из вогнутых частей:

с участком: минимальная ограничивающая геометрия (корпус) -> parcelHull

с посылкой: FeatureVerticesToPoint -> parcelPoints

с parcelHull: FeatureVerticesToPoint -> parcelHullPoints

с parcelPoint и parcelHullPoint: симметричный Diff -> concavePoints

основываясь на этих точках, вы можете либо нарисовать биссектрису, чтобы отрезать полигон (расстояние до линии), выбрать ребра треугольника Вороного, которые пересекают вашу точку, но не делят отрезок с границей участка (выберите по местоположению после разбиения треугольника). линии на вершинах), выберите вершину на противоположном участке и сделайте линию (указывает на линию), выберите ближайшую точку на противоположном крае и нарисуйте линию (указывает на линию) ...

В конце, используйте ваши предпочтительные линии и исходные участки с «Feature to Polygon», чтобы разделить полигоны.

radouxju
источник