Pomiar zwartości w Pythonie [zamknięte]
Mam zestaw wielokątów, dla których chciałbym sprawdzić ich zwartość.
Pracuję w Jupyter Notebook, a moja geometria to GeoPandas.
Chciałbym wypróbować test Polsby-Popper i test Schwartzberga (i inne testy, które są tutaj:https://fisherzachary.github.io/public/r-output.html ), ale nie mogę znaleźć prostego sposobu, aby to zrobić.
Nie znajduję sposobu na stworzenie potrzebnych okręgów, np. „Okrąg, którego powierzchnia jest równa powierzchni wielokąta” lub „okrąg, którego obwód jest równy obwodowi wielokąta”.
Znalazłem skrypt, który szuka najmniejszego otaczającego okręgu, ale wygląda na to, że działa z punktami i mam wielokąt w GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py).
Jeśli ktoś zna jakąś bibliotekę / pakiet / jakiś pomysł na to, jak mogę utworzyć kręgi z podanego obwodu lub obszaru. Ważne jest, aby powiedzieć, że mam do sprawdzenia około 70 tysięcy wielokątów, więc mam również problem z pamięcią.
Moim końcowym celem jest zdobycie pomysłów, jak obliczyć to w Pythonie w Jupyter Notebook.
Edycja: znalazłem tę bibliotekę, ale mam problemy z jej zainstalowaniem / użyciem (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)
Odpowiedzi
Nie musisz tworzyć kręgów. Wzór pochodzi ze wspomnianego współczynnika.
Użyj następującego skryptu. Możesz łatwo zastosować inne formuły.
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