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