Python'da kompaktlığı ölçme [kapalı]
Kompaktlıklarını kontrol etmek istediğim bir dizi çokgenim var.
Jupyter Notebook'ta çalışıyorum ve geometrim GeoPandas.
Polsby-Popper testini ve Schwartzberg testini (ve burada bulunan diğer testleri denemek istiyorum:https://fisherzachary.github.io/public/r-output.html ) ama bunu yapmanın basit bir yolunu bulamıyorum.
Gerekli çemberleri yaratmanın bir yolunu bulamıyorum, örneğin "alanı çokgenin alanına eşit olan daire" veya "çevresi çokgenin çevresine eşit olan daire".
En küçük çevreleyen daireyi bulmak için komut dosyası buldum, ancak noktalarla çalışıyor gibi görünüyor ve GeoPandas'ta çokgen varhttps://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py).
Herhangi bir kitaplık / paket / verilen çevre veya alandan nasıl çemberler oluşturabileceğime dair herhangi bir fikri olan varsa. Kontrol etmem gereken yaklaşık 70k çokgenim olduğunu söylemek önemlidir, bu yüzden bellek sorunum da var.
Nihai hedefim, Jupyter Not Defterindeki Python'da bunu nasıl hesaplayabileceğime dair fikir edinmek.
Düzenleme: Bu kütüphaneyi buldum ama kurmak / kullanmakla uğraşıyorum (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)
Yanıtlar
Çevre oluşturmanıza gerek yok. Formül, bahsettiğiniz orandan türetilmiştir.
Aşağıdaki komut dosyasını kullanın. Diğer formülleri kolaylıkla uygulayabilirsiniz.
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