Misurare la compattezza in Python [chiuso]

Sep 17 2020

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

8 KadirŞahbaz Sep 17 2020 at 21:40

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