Pythonでのコンパクトさの測定[クローズ]

Sep 17 2020

コンパクトさを確認したいポリゴンのセットがあります。

私はJupyterNotebookで作業しており、ジオメトリはGeoPandasです。
Polsby-PopperテストとSchwartzbergテスト(およびここにある他のテスト)を試してみたいと思います。https://fisherzachary.github.io/public/r-output.html )しかし、私はそれを行う簡単な方法を見つけることができません。

必要な円を作成する方法が見つかりません。たとえば、「面積がポリゴンの面積に等しい円」や「円周がポリゴンの周囲に等しい円」などです。

最小の囲み円を見つけるスクリプトを見つけましたが、ポイントで機能するようで、GeoPandasにポリゴンがあります(https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py)。

誰かがライブラリ/パッケージ/特定の境界または領域から円を作成する方法についてのアイデアを知っている場合。チェックするポリゴンが約70kあるので、メモリの問題もあると言うことが重要です。

私の最終目標は、JupyterNotebookのPythonでこれを計算する方法を理解することです。

編集:私はこのライブラリを見つけましたが、インストール/使用に苦労しています(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)

回答

8 KadirŞahbaz Sep 17 2020 at 21:40

サークルを作成する必要はありません。式はあなたが言及した比率から導き出されます。

次のスクリプトを使用します。他の式を簡単に適用できます。

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