Medindo compactação em Python [fechado]

Sep 17 2020

Eu tenho um conjunto de polígonos que gostaria de verificar se são compactos.

Estou trabalhando no Jupyter Notebook e minha geometria é GeoPandas.
Eu gostaria de experimentar o teste de Polsby-Popper e o teste de Schwartzberg (e outros testes que estão aqui:https://fisherzachary.github.io/public/r-output.html ), mas não consigo encontrar uma maneira simples de fazer isso.

Não encontro forma de criar os círculos necessários, por exemplo "círculo cuja área é igual à área do polígono" ou "círculo cuja circunferência é igual ao perímetro do polígono".

Eu encontrei um script para encontrar o menor círculo delimitador, mas parece que funciona com pontos e eu tenho um polígono no GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py)

Se alguém conhece alguma biblioteca / pacote / alguma ideia de como posso criar círculos de determinado perímetro ou área. É importante dizer que tenho cerca de 70k polígonos para verificar, então também tenho o problema de memória.

Meu objetivo final é ter ideias de como posso calcular isso em Python no Jupyter Notebook.

Edit: Eu encontrei esta biblioteca, mas tenho dificuldade em instalá-la / usá-la (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)

Respostas

8 KadirŞahbaz Sep 17 2020 at 21:40

Você não precisa criar círculos. A fórmula é derivada da proporção que você mencionou.

Use o seguinte script. Você pode aplicar as outras fórmulas facilmente.

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