Розділення багатокутника на конкретні розміри за допомогою ArcGIS Desktop?


26

У формовому файлі у мене є кілька тисяч багатокутників неправильної форми. Я хочу мати змогу розділити кожен багатокутник на три області та вказати, який розмір цих областей (вони дорівнюють попередній загальній площі). Не має значення, яка форма підполігона, оскільки це для візуалізації.

Як я можу робити це? Чи існує стандартний алгоритм, який я можу використовувати?


Один із підходів, який я розглядав, - це отримати всі точки, що складають багатокутник. Тоді я б з'єднав два випадковим чином разом за допомогою прямої лінії, розділив багатокутник, а потім перевірив, чи знаходиться площа в межах задовільного допуску. Якби це було занадто мало, я змінив би точку в один бік; якби вона була занадто великою, я змінив би точку в зворотному напрямку.

Відповіді:


34

Ця проблема має безліч дійсних рішень. Один з них трохи схожий на ваш опис, але замість того, щоб нарізати багатокутники за "випадковими" місцями, ви можете це робити цілеспрямовано таким чином, щоб мінімізувати кількість обчислень.

Ось основний алгоритм. Його вхід складається з будь-якого напрямку розгортки площини, багатокутника P ненульової області, цільової області a між нулем та площею полігону та негативного порогу t (в одиницях площі). Її мета - розділити P лінією, перпендикулярною напрямку напряму розгортки, на дві частини, одну праворуч від лінії, а іншу зліва від лінії, так що різниці між правою рукою та цільовою площею a немає більше, ніж t .

Нехай L - будь-яка орієнтована лінія, перпендикулярна напрямку зміщення. Визначте f (L) площу P, яка знаходиться праворуч від L, мінус a . У цих умовах завдання - знайти нуль f . Оскільки f навряд чи може бути диференційованим, але є безперервним, використовуйте або метод розбиття, метод сексанта , або - метод мого улюбленого- Брента . Усі прості та гарантовано схожі. Використовуйте t для допуску конвергенції для аргументу.

Це воно. Розглянемо, що стосується кодування цього. Виявлення кореня є рутинним - ви можете використовувати для цього загальний фрагмент коду - так робота ГІС зводиться до кодування f . Для цього потрібно

1.  Splitting the polygon by a line.
2.  Computing the area of the piece(s) to the right of the line.

Обидві операції реалізовані практично в будь-яких векторних ГІС. Якщо ні, ви можете замінити лінію дуже великим прямокутником, що представляє півплощину праворуч від лінії. Крок 1 стає

1'. Clip the polygon to the rectangle.

Це дійсно основна операція.

Щоб почати пошук кореня, потрібно знайти інтервал, в якому гарантовано лежати нуль f . Це легко: спроектуйте конверт полігону ("обмежувальний ящик") у напрямку розгортки лінії. Проекція - потрібний інтервал.

Це питання має давню історію. Я давно реалізував цей алгоритм для ArcView 3.x і багато разів описував його на старих форумах користувачів ESRI. Google

сайт полігону huber split: forums.esri.com

для обговорення, посилання на код, удосконалення та варіації (наприклад, розбиття багатокутників на потрібні розміри, максимально компактні) та алгоритми для растрових даних.

Ось як виглядають континентальні штати США (в проекції рівних районів) з нижньою третиною кожного штату затіненою. Очевидно, напрям розгортки був вертикальним.

alt текст


6

Існує готовий інструмент під назвою "GeoTools" ET Spatial. Там, де є інструмент під назвою "ET Різне". У цьому інструменті є два типи способу розбиття багатокутників саме. За відсотком та площею (кілька одиниць, наприклад, кв. М, га тощо). Цей інструмент розбиває багатокутники з будь-якої з чотирьох сторін, тобто NESW, як показано на малюнках. Я використовував метод "вгору вниз", тобто метод "Північ на Південь".

Розкол


0

У ArcGIS Pro 2.3 є новий інструмент під назвою Subdivide Polygon .

Це дозволяє розділити / поділити багатокутник на задану кількість частин або бажану площу частини.

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