Đo độ nhỏ gọn trong Python [đã đóng]

Sep 17 2020

Tôi có một tập hợp các đa giác mà tôi muốn kiểm tra độ chặt của chúng.

Tôi đang làm việc trong Jupyter Notebook và hình học của tôi là GeoPandas.
Tôi muốn thử thử nghiệm Polsby-Popper và thử nghiệm Schwartzberg (và các thử nghiệm khác ở đây:https://fisherzachary.github.io/public/r-output.html ) nhưng tôi không thể tìm thấy bất kỳ cách đơn giản nào để làm điều đó.

Tôi không tìm ra cách để tạo ra các vòng tròn cần thiết, ví dụ "hình tròn có diện tích bằng diện tích đa giác" hoặc "hình tròn có chu vi bằng chu vi đa giác".

Tôi đã tìm thấy tập lệnh để tìm vòng tròn bao quanh nhỏ nhất nhưng có vẻ như nó hoạt động với các điểm và tôi có đa giác trong GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py).

Nếu ai đó biết bất kỳ thư viện / gói / bất kỳ ý tưởng nào về cách tôi có thể tạo vòng tròn từ chu vi hoặc diện tích đã cho. Điều quan trọng cần nói là tôi có khoảng 70 nghìn đa giác để kiểm tra nên tôi cũng gặp sự cố về bộ nhớ.

Mục tiêu cuối cùng của tôi là có được ý tưởng về cách tôi có thể tính toán điều này bằng Python trong Máy tính xách tay Jupyter.

Chỉnh sửa: Tôi đã tìm thấy thư viện này nhưng gặp khó khăn trong việc cài đặt / sử dụng nó (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)

Trả lời

8 KadirŞahbaz Sep 17 2020 at 21:40

Bạn không cần tạo vòng kết nối. Công thức được suy ra từ tỷ lệ bạn đã đề cập.

Sử dụng tập lệnh sau. Bạn có thể áp dụng các công thức khác một cách dễ dàng.

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