Измерение компактности в Python [закрыто]

Sep 17 2020

У меня есть множество полигонов, компактность которых я хотел бы проверить.

Я работаю в 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)

Ответы

8 KadirŞahbaz Sep 17 2020 at 21:40

Создавать круги не нужно. Формула основана на упомянутом вами соотношении.

Используйте следующий сценарий. Вы можете легко применить другие формулы.

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