Pomiar zwartości w Pythonie [zamknięte]

Sep 17 2020

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

8 KadirŞahbaz Sep 17 2020 at 21:40

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