รับพื้นที่รูปหลายเหลี่ยมโดยใช้ geopandas?


16

ด้วยgeopandas GeoDataFrameรูปหลายเหลี่ยมที่มีชุดของฉันต้องการที่จะได้รับพื้นที่ในกม. sq ของแต่ละคุณสมบัติในรายการของฉัน

นี่เป็นปัญหาที่พบได้บ่อยและวิธีแก้ปัญหาที่แนะนำตามปกติในอดีตเคยใช้shapelyและpyprojโดยตรง (เช่นที่นี่และที่นี่ )

มีวิธีการทำสิ่งนี้อย่างบริสุทธิ์geopandasหรือไม่?

คำตอบ:


17

หากรู้จัก crs ของ GeoDataFrame (EPSG: 4326 unit = degree, ที่นี่) คุณไม่จำเป็นต้องมีหุ่นดีหรือ pyproj ในสคริปต์ของคุณเพราะ GeoPandas ใช้พวกมัน)

import geopandas as gpd
test = gpd.read_file("test_wgs84.shp")
print test.crs
test.head(2)

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้คัดลอก GeoDataFrame ของคุณและเปลี่ยนการฉายเป็นระบบคาร์ทีเซียน (EPSG: 3857, หน่วย = m ตามคำตอบของ ResMar)

tost = test.copy()
tost= tost.to_crs({'init': 'epsg:3857'})
print tost.crs
tost.head(2)

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้พื้นที่เป็นตารางกิโลเมตร

tost["area"] = tost['geometry'].area/ 10**6
tost.head(2)

ป้อนคำอธิบายรูปภาพที่นี่

แต่พื้นผิวในการฉายของ Mercator นั้นไม่ถูกต้องดังนั้นจึงมีการฉายในหน่วยเมตร

tost= tost.to_crs({'init': 'epsg:32633'})
tost["area"] = tost['geometry'].area/ 10**6
tost.head(2)

ป้อนคำอธิบายรูปภาพที่นี่


ข้อความของคุณคือepsg:3857แต่รหัสของคุณepsg:3395ซึ่งสองในนั้นถูกต้อง?
Aleksey Bilogur

4
.to_crsการทำงานได้รับการส่งผ่านไปยังpyprojไง ตัวอย่างที่ดีของการประมาณพื้นที่อย่างเท่าเทียมกัน: proj4.org/projections/cea.htmlซึ่งสามารถส่งผ่านได้ดังต่อไปนี้:.to_crs({'proj':'cea'})
Swier

อย่างน้อยที่สุดฉันก็สามารถยืนยันได้ว่า{'proj':'cea'}จะทำการประเมินพื้นที่ใกล้เคียงที่สุด
Polor Beer

4

ฉันเชื่อว่าใช่ ต่อไปนี้ควรทำงาน:

gdf['geometry'].to_crs({'init': 'epsg:3395'})\
               .map(lambda p: p.area / 10**6)

สิ่งนี้จะแปลงรูปทรงเรขาคณิตให้เท่ากับพื้นที่ฉายภาพดึงshapelyพื้นที่ (ส่งคืนเป็น m ^ 2) และแผนที่ที่เป็น km ^ 2 (ขั้นตอนสุดท้ายนี้เป็นทางเลือก)


ถูกต้องหรือไม่
Aleksey Bilogur

1
EPSG 3857 ไม่ใช่พื้นที่เท่ากัน en.wikipedia.org/wiki/Map_project#Equal-area
alphabetasoup

ฉันได้แก้ไขคำตอบนี้เพื่อให้พอดีกับepsg:3395CRS ของยีน ขอบคุณ
Aleksey Bilogur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.