Misurare la compattezza in Python [chiuso]
Ho un set di poligoni di cui vorrei verificare la compattezza.
Sto lavorando in Jupyter Notebook e la mia geometria è GeoPandas.
Vorrei provare il test di Polsby-Popper e il test di Schwartzberg (e altri test che sono qui:https://fisherzachary.github.io/public/r-output.html ) ma non riesco a trovare un modo semplice per farlo.
Non trovo il modo di creare i cerchi necessari, es. "Cerchio la cui area è uguale all'area del poligono" o "cerchio la cui circonferenza è uguale al perimetro del poligono".
Ho trovato uno script per trovare il cerchio di chiusura più piccolo ma sembra che funzioni con i punti e ho un poligono in GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py).
Se qualcuno conosce qualche libreria / pacchetto / idea di come posso creare cerchi da un dato perimetro o area. È importante dire che ho circa 70.000 poligoni da controllare, quindi ho anche il problema di memoria.
Il mio obiettivo finale è ottenere idee su come posso calcolarlo in Python in Jupyter Notebook.
Modifica: ho trovato questa libreria ma ho difficoltà a installarla / usarla (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)
Risposte
Non è necessario creare cerchie. La formula è derivata dal rapporto che hai menzionato.
Usa il seguente script. Puoi applicare facilmente le altre formule.
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