การวัดความกะทัดรัดใน Python [ปิด]
ฉันมีชุดรูปหลายเหลี่ยมที่ฉันต้องการตรวจสอบความกะทัดรัด
ฉันทำงานใน 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)
คำตอบ
คุณไม่จำเป็นต้องสร้างแวดวง สูตรได้มาจากอัตราส่วนที่คุณกล่าวถึง
ใช้สคริปต์ต่อไปนี้ คุณสามารถใช้สูตรอื่น ๆ ได้อย่างง่ายดาย
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