Mesure de la compacité en Python [fermé]

Sep 17 2020

J'ai un ensemble de polygones dont je voudrais vérifier leur compacité.

Je travaille dans Jupyter Notebook et ma géométrie est GeoPandas.
Je voudrais essayer le test Polsby-Popper et le test de Schwartzberg (et d'autres tests qui sont ici:https://fisherzachary.github.io/public/r-output.html ) mais je ne trouve pas de moyen simple de le faire.

Je ne trouve pas moyen de créer les cercles nécessaires, par exemple "cercle dont l'aire est égale à l'aire du polygone" ou "cercle dont la circonférence est égale au périmètre du polygone".

J'ai trouvé un script pour trouver le plus petit cercle englobant mais il semble que cela fonctionne avec des points et j'ai un polygone dans GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py).

Si quelqu'un connaît une bibliothèque / un package / une idée de la façon dont je peux créer des cercles à partir d'un périmètre ou d'une zone donné. Il est important de dire que j'ai environ 70 000 polygones à vérifier, donc j'ai également un problème de mémoire.

Mon objectif final est d'obtenir des idées sur la façon de calculer cela en Python dans Jupyter Notebook.

Edit: J'ai trouvé cette bibliothèque mais j'ai du mal à l'installer / l'utiliser (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)

Réponses

8 KadirŞahbaz Sep 17 2020 at 21:40

Vous n'avez pas besoin de créer des cercles. La formule est dérivée du ratio que vous avez mentionné.

Utilisez le script suivant. Vous pouvez appliquer les autres formules facilement.

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