คำตอบ:
หากรู้จัก 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)
.to_crs
การทำงานได้รับการส่งผ่านไปยังpyproj
ไง ตัวอย่างที่ดีของการประมาณพื้นที่อย่างเท่าเทียมกัน: proj4.org/projections/cea.htmlซึ่งสามารถส่งผ่านได้ดังต่อไปนี้:.to_crs({'proj':'cea'})
{'proj':'cea'}
จะทำการประเมินพื้นที่ใกล้เคียงที่สุด
ฉันเชื่อว่าใช่ ต่อไปนี้ควรทำงาน:
gdf['geometry'].to_crs({'init': 'epsg:3395'})\
.map(lambda p: p.area / 10**6)
สิ่งนี้จะแปลงรูปทรงเรขาคณิตให้เท่ากับพื้นที่ฉายภาพดึงshapely
พื้นที่ (ส่งคืนเป็น m ^ 2) และแผนที่ที่เป็น km ^ 2 (ขั้นตอนสุดท้ายนี้เป็นทางเลือก)
epsg:3395
CRS ของยีน ขอบคุณ
epsg:3857
แต่รหัสของคุณepsg:3395
ซึ่งสองในนั้นถูกต้อง?