Medindo compactação em Python [fechado]
Eu tenho um conjunto de polígonos que gostaria de verificar se são compactos.
Estou trabalhando no Jupyter Notebook e minha geometria é GeoPandas.
Eu gostaria de experimentar o teste de Polsby-Popper e o teste de Schwartzberg (e outros testes que estão aqui:https://fisherzachary.github.io/public/r-output.html ), mas não consigo encontrar uma maneira simples de fazer isso.
Não encontro forma de criar os círculos necessários, por exemplo "círculo cuja área é igual à área do polígono" ou "círculo cuja circunferência é igual ao perímetro do polígono".
Eu encontrei um script para encontrar o menor círculo delimitador, mas parece que funciona com pontos e eu tenho um polígono no GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py)
Se alguém conhece alguma biblioteca / pacote / alguma ideia de como posso criar círculos de determinado perímetro ou área. É importante dizer que tenho cerca de 70k polígonos para verificar, então também tenho o problema de memória.
Meu objetivo final é ter ideias de como posso calcular isso em Python no Jupyter Notebook.
Edit: Eu encontrei esta biblioteca, mas tenho dificuldade em instalá-la / usá-la (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)
Respostas
Você não precisa criar círculos. A fórmula é derivada da proporção que você mencionou.
Use o seguinte script. Você pode aplicar as outras fórmulas facilmente.
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