Виявлення розгалуженої форми багатокутника?


13

У мене векторний шар з мільйонами багатокутників, які роблять безперервне покриття. Мені потрібно класифікувати їх за формою. Я вже використовую кілька індексів форми з екології ландшафту, як компактність ( 4piA / P ^ 2 ), середня ширина ( 2A / P ), число форми ( P / sqrt (A) ), я також бачив цю відповідь на обчислення округлості / компактності багатокутник?

Моя проблема полягає в тому, що всі ці показники використовують лише деяке співвідношення площі та периметра. Навіть показник фрактальної розмірності використовує лише площу та периметр ( 2ln (0,25P) / ln (A) ). Але як я можу розрізнити два багатокутники з однаковою площею та периметром, але абсолютно різною формою? Як і цей розгалужений багатокутник А:

розгалужений багатокутник проти вигнутої смуги

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

Я навмисно показую багатокутник B як вигнуту смужку, а не пряму смужку, тому що мені відомо про споріднений індекс Circumcircle, який виявляє прямі витягнуті форми, але мої багатокутники можуть мати однакові окружності. Навіть якщо я будую опуклий корпус і обчислюю співвідношення площ Аполігон / Aconvex , це може бути дуже схожим.

Отже, як я можу чітко відрізнити розгалужений багатокутник А від багатокутника В у векторних даних автоматично? (Перетворення їх у растрові вимагало б надзвичайно невеликого розміру комірок, величезного набору даних та браку пам’яті, тому це неможливо). Чи є інші покажчики фігур, які включають інші параметри? В ідеалі метод розрізнив би не тільки чітко розгалужені багатокутники, але навіть C і D:

введіть тут опис зображення

Моя єдина ідея - побудувати опуклий корпус, потім стерти полігон з його опуклого корпусу і порахувати кількість (великих) шматочків, які він залишає (стирання багатокутника за багатокутником, а не на весь шар). Це могло б показати складність кордону.

Я вітаю математичні рішення / алгоритми, які згодом я б реалізував у Python.


1
Вам не потрібно багато Python. Спробуйте! форма !. опуклий (). симетрична Різниця (! форма!) в калькуляторі поля. Спробуйте спочатку на невеликій підмножині. Про правильний синтаксис див. Довідку з геометрії arcpy.
FelixIP

Це може бути чудовим питанням, але на даний момент ви задаєте кілька запитань, не зав'язуючи питання про QGIS або ArcGIS Desktop, а потім також кидаючи в Python. Після того, як ви точно вкажете, що ви спробували, потенційним відповідачам буде легше допомогти там, де ви застрягли. Я пропоную зосередитись на QGIS, щоб уникнути зволікання на першу відповідь.
PolyGeo

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

1
Перша моя думка була такою ж, як і ваша, дивлячись на відмінності між кількістю та розмірами багатокутників, що залишилися після віднімання оригіналу з його опуклого (або увігнутого) корпусу (див. Також альфа-форми).
користувач2856

1
Якби тільки скелет був досить швидким для обчислення, я б використовував для обчислення 4A / PL, площі, периметра, довжини між найдальшіми вузлами скелета для компактності. Те саме стосується найбільшого вписаного кола.
FelixIP

Відповіді:


11

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

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

Приклад:

  • коли ви малюєте букву Y, ви використовуєте щонайменше 2 безперервних штриха (= 2 полілінії), тож він розгалужений, оскільки мінімальна кількість штрихів> 1.
  • коли ви малюєте букву L, ви використовуєте принаймні 1 безперервний штрих. Це не розгалужене.

Більше прикладів цієї логіки:

  • Коли ви малюєте штрихи A: 2 = він розгалужений
  • Коли ви робите штрихи B: 3 = він розгалужений
  • коли ви малюєте штрих С: 1 = він не розгалужений
  • тощо

Я нічого не пробував, просто пробував логіку, але я думаю, що це може спрацювати.

Див.: Скелетонізувати вектори в QGIS / Python або http://postgis.net/docs/ST_StraightSkeleton.html

Або

Приклад

Джерело: Витяг центральної лінії Complex-Polygon в PostGIS / Python

РЕДАКТУВАННЯ: Для випадків C & D вам потрібно мати вже відфільтровані форми B (не розгалужені).

  • Переконайтеся, що унікальний ідентифікатор пов'язує центральну лінію та вихідний багатокутник.
  • Перетворіть свої багатокутники на полілінії
  • Ущільнюйте полілінію середньої лінії та прикордонну полілінію регулярними точками (не надто багато, щоб уникнути проблем із пам'яттю пізніше, але достатньо, щоб "зловити" неправильні шматочки.
  • Створіть матрицю відстані між точками центральної лінії та точками межі
  • Зберігайте в матричних рядках лише ті, де ID_centerline = ID_borderline
  • Створіть статистику, щоб мати стандартне значення відхилення
  • Встановіть обмежене значення, щоб вказати для високих значень SD, що це не регулярний контур, і створіть необхідний індикатор для кожного унікального ідентифікатора
  • Поверніть показник до початкового багатокутника, приєднавши поле на основі унікального ідентифікатора.

Дякую за ідею, я спробую створити центральні лінії
nadya

Просто проблема з розрізненням моїх багатокутників C і D залишиться
nadya

Можливо, вам знадобляться різні методи для різних випадків і розділити роботу. Після того, як у вас є нерозгалужені багатокутники (B), ви можете уточнити B, щоб спробувати знайти C і D. Проблема полягає в тому, що я не бачу, якою логікою ви користуєтесь, щоб відрізнити C від D., ймовірно, вам доведеться це чітко сформулювати критерії.
gisnside

1
Різниця між C і D, здається, полягає в тому, що в C сторони багатокутника приблизно на однаковій відстані від центральної лінії, тоді як у D сторони - неоднакова відстань від центральної лінії.
csk

1
@csk Я це бачу. Думаю, переклавши це в код, було б обчислити статистику про відстань між центральною та граничною лінією. За допомогою ущільнення прикордонної полілінії більше точок, а потім перетворення цієї межі в точки + здійснення відстані від еквівалентного завдання на центральній лінії дало б статистику щодо такої поведінки. Якщо стандартне відхилення високе, то, ймовірно, форма буде неправильною. Важко зрозуміти, як це зробити на полігонах, хоча ... приємний виклик там
gisnside
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.