Измерение компактности в Python [закрыто]
У меня есть множество полигонов, компактность которых я хотел бы проверить.
Я работаю в Jupyter Notebook, и моя геометрия - GeoPandas.
Я хотел бы попробовать тест Полсби-Поппера и тест Шварцберга (и другие тесты, которые здесь:https://fisherzachary.github.io/public/r-output.html ), но я не могу найти простого способа сделать это.
Я не нахожу способа создать необходимые круги, например, «круг, площадь которого равна площади многоугольника» или «круг, окружность которого равна периметру многоугольника».
Я нашел скрипт для поиска наименьшего окружающего круга, но похоже, что он работает с точками, и у меня есть многоугольник в GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py).
Если кто-нибудь знает какую-либо библиотеку / пакет / любую идею о том, как я могу создавать круги по заданному периметру или области. Важно отметить, что мне нужно проверить около 70 тысяч полигонов, поэтому у меня также есть проблема с памятью.
Моя конечная цель - получить представление о том, как я могу рассчитать это на Python в Jupyter Notebook.
Изменить: я нашел эту библиотеку, но не могу ее установить / использовать (https://jblindsay.github.io/wbt_book/available_tools/gis_analysis_patch_shape_tools.html) (https://github.com/jblindsay/whitebox-tools/blob/master/src/tools/gis_analysis/related_circumscribing_circle.rs)
Ответы
Создавать круги не нужно. Формула основана на упомянутом вами соотношении.
Используйте следующий сценарий. Вы можете легко применить другие формулы.
import geopandas as gpd
from math import pi, sqrt
def pp_compactness(geom): # Polsby-Popper
p = geom.length
a = geom.area
return (4*pi*a)/(p*p)
def s_compactness(geom): # Schwartzberg
p = geom.length
a = geom.area
return 1/(p/(2*pi*sqrt(a/pi)))
gdf = gpd.read_file("file/path")
gdf["Polsby_Popper"] = gdf.geometry.apply(pp_compactness)
gdf["Schwartzberg"] = gdf.geometry.apply(s_compactness)
print(gdf)
# geometry Polsby_Popper Schwartzberg
# 0 POLYGON ((552... 0.351956 0.593259
# 1 POLYGON ((552... 0.550202 0.741756
# .. ... ... ...
# 130 POLYGON ((553... 0.434469 0.659142
# 131 POLYGON ((553... 0.706016 0.840248