การวัดความกะทัดรัดใน Python [ปิด]

Sep 17 2020

ฉันมีชุดรูปหลายเหลี่ยมที่ฉันต้องการตรวจสอบความกะทัดรัด

ฉันทำงานใน Jupyter Notebook และรูปทรงเรขาคณิตของฉันคือ GeoPandas
ฉันต้องการลองทดสอบ Polsby-Popper และการทดสอบ Schwartzberg (และการทดสอบอื่น ๆ ที่นี่:https://fisherzachary.github.io/public/r-output.html ) แต่ฉันไม่พบวิธีง่ายๆในการทำ

ฉันไม่พบวิธีสร้างวงกลมที่จำเป็นเช่น "วงกลมที่มีพื้นที่เท่ากับพื้นที่ของรูปหลายเหลี่ยม" หรือ "วงกลมที่มีเส้นรอบวงเท่ากับเส้นรอบวงของรูปหลายเหลี่ยม"

ฉันพบสคริปต์เพื่อค้นหาวงกลมล้อมรอบที่เล็กที่สุด แต่ดูเหมือนว่ามันใช้ได้กับจุดและฉันมีรูปหลายเหลี่ยมใน GeoPandas (https://www.nayuki.io/res/smallest-enclosing-circle/smallestenclosingcircle.py).

ถ้าใครรู้จักห้องสมุด / แพ็คเกจ / แนวคิดใด ๆ เกี่ยวกับวิธีสร้างแวดวงจากขอบเขตหรือพื้นที่ที่กำหนด สิ่งสำคัญคือต้องบอกว่าฉันมีรูปหลายเหลี่ยมประมาณ 70,000 รูปที่ต้องตรวจสอบดังนั้นฉันจึงมีปัญหาเรื่องความจำด้วย

เป้าหมายสุดท้ายของฉันคือการได้รับแนวคิดว่าฉันจะคำนวณสิ่งนี้ใน Python ใน Jupyter Notebook ได้อย่างไร

แก้ไข: ฉันพบไลบรารีนี้ แต่มีปัญหาในการติดตั้ง / ใช้งาน (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