使用geopandas获取多边形区域?


16

给定一个geopandas GeoDataFrame包含一系列多边形的区域,我想获取列表中每个要素的面积(平方公里)。

这是一个很常见的问题,并且在过去通常建议的解决方案是使用shapelypyproj直接(如这里这里)。

有没有办法做到这一点geopandas

Answers:


17

如果已知GeoDataFrame的crs(此处为EPSG:4326 unit = degree),则您的脚本中不需要Shapely,也不需要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)

在此处输入图片说明

但是墨卡托投影中的表面不正确,因此其他投影以米为单位也是如此。

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

至少对于US Census Tracts shapefile,我可以确认{'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,2016年


我修改了此答案以适合基因的epsg:3395CRS。谢谢。
Aleksey Bilogur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.