У меня есть векторный слой с миллионами полигонов, создающих непрерывное покрытие. Мне нужно классифицировать их в соответствии с их формой. Я уже использую несколько индексов формы из ландшафтной экологии, таких как компактность ( 4piA / P ^ 2 ), средняя ширина ( 2A / P ), номер формы ( P / sqrt (A) ), я также видел этот ответ на Расчет округлости / компактности многоугольник?
Моя проблема в том, что все эти метрики используют только некоторое соотношение площади и периметра. Даже индекс фрактального измерения использует только площадь и периметр ( 2ln (0.25P) / ln (A) ). Но как я могу различить два полигона с одинаковой площадью и периметром, но абсолютно разной формы? Как этот разветвленный многоугольник A:
которую я попытался нарисовать с той же площадью и периметром, что и изогнутая полоса B. Все мои известные индексы для них будут одинаковыми. Но для меня очень важно отличать простые полосы (в том числе изогнутые, как новолуние) от сложных разветвленных фигур.
Я намеренно показываю многоугольник B как изогнутую полосу, а не как прямую полосу, потому что мне известен индекс относительной окружности, который обнаруживает прямые вытянутые формы, но у моих многоугольников могут быть такие же окружности. Даже если я построю выпуклую оболочку и вычислю соотношение площадей Apolygon / Aconvex , здесь это может быть очень похоже.
Итак, как я могу четко отличить разветвленный многоугольник A от многоугольника B в векторных данных ? (Преобразование их в растр потребовало бы чрезвычайно малого размера ячеек, огромного набора данных и недостатка памяти, поэтому это невозможно). Существуют ли другие индексы формы, которые включают другие параметры? В идеале метод должен различать не только четко разветвленные многоугольники, но даже C и D:
Моя единственная идея состоит в том, чтобы построить выпуклую оболочку, а затем стереть многоугольник из его выпуклой оболочки и подсчитать количество (больших) кусков, которые он оставляет (стирая многоугольник за многоугольник, а не весь слой). Это может показать сложность границы.
Я приветствую математические решения / алгоритмы, которые я позже реализовал в Python.
Ответы:
Вы могли бы взглянуть на следующий метод: скелетировать ваши полигоны и лучше поработать над объектами типа линии, связанными с вашим исходным полигоном, с уникальным исходным идентификатором полигона. Я предполагаю, что есть некоторые догадки (например, когда рассматривать ломаную линию как реальную осевую линию: минимальная длина, чтобы полилиния имела право на статус центральной линии). Когда число осевой линии больше 1 для одного исходного многоугольника, тогда оно разветвляется.
Разветвленный многоугольник при очистке до центральной линии будет иметь несколько линий, тогда как прямой многоугольник может иметь только одну большую линию в центре (то же самое, что и человеческая интерпретация на самом деле).
Пример :
Еще примеры этой логики:
Я ничего не пробовал, просто пробовал логику, но думаю, что это может сработать.
Смотрите: Скелетонизируйте векторы в QGIS / Python или http://postgis.net/docs/ST_StraightSkeleton.html.
Или
Источник: извлечение осевой линии сложного многоугольника в PostGIS / Python
РЕДАКТИРОВАТЬ: Для случаев C & D, вам уже нужно иметь отфильтрованные формы B (неразветвленные).
источник