如何用Geopandas计算国家多边形面积?求最优投影选择
问题描述
我使用geopandas示例数据进行测试,代码如下:
import geopandas as gpd df = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
我的真实数据集仅包含EPSG:4326坐标系下的多边形类型几何数据,需求是计算每个国家多边形的平方公里面积。
作为geopandas新手,我尝试了两种方法:
方法一
ndf=df ndf.to_crs("epsg:32633") ndf["area"] = ndf['geometry'].area/ 10**6 ndf.head(2)
但计算结果不符合预期。
方法二
df_2= df.to_crs({'proj':'cea'}) df_2["area"] = df_2['geometry'].area/ 10**6 df_2.head(2)
结果有所改善,但与实际查询到的国家面积仍有偏差。
现咨询两个问题:
- 上述计算方法是否正确?
- 如何选择最优投影类型?
解答
1. 计算方法的正确性分析
方法一的问题
ndf=df只是创建了原DataFrame的引用,而非独立副本;且ndf.to_crs("epsg:32633")默认不会修改原对象,你也没有将转换后的结果重新赋值给ndf,所以实际计算面积时用的还是原数据的EPSG:4326地理坐标系。EPSG:4326用经纬度计算的面积单位是平方度,直接除以10^6无法得到平方公里,这是结果不符合预期的核心原因。
正确写法应为:
ndf = df.copy() ndf = ndf.to_crs("epsg:32633") # 必须接收投影转换后的结果 ndf["area"] = ndf['geometry'].area / 10**6
方法二的合理性
方法二的逻辑是正确的:先转换至等面积投影(CEA为圆柱等面积投影),再计算面积并转换为平方公里。结果存在偏差是因为CEA作为全球通用等面积投影,在高纬度区域的面积精度会下降,且没有任何一种投影能让全球所有区域的面积计算完全精准。
2. 最优投影类型的选择原则
选择投影的核心是匹配数据的空间范围,优先选用针对目标区域的区域等面积投影:
- 全球范围数据:优先选择圆柱等面积投影(如CEA、EPSG:6933)或摩尔威特投影(EPSG:54009),这类投影能控制全球整体面积误差,但高纬度区域仍会存在偏差。
- 单一大洲/国家数据:选用对应区域的专用等面积投影,例如计算中国面积可使用Albers等面积投影(EPSG:102003),计算欧洲面积用EPSG:3035(ETRS89 / LAEA Europe),这类投影在目标区域内的面积精度远高于全球通用投影。
- 通用/不确定范围场景:可直接使用椭球面积计算,无需转换投影。Geopandas 0.10+版本中,地理坐标系(EPSG:4326)下的
geometry.area会自动基于WGS84椭球计算面积,单位为平方米,直接转换为平方公里即可:
df["area_km2"] = df['geometry'].area / 10**6
这种方式避免了投影转换带来的区域偏差,精度依赖于标准椭球参数,适合全球范围的面积计算。
另外需注意:如果使用的是低分辨率数据集(如naturalearth_lowres),数据本身的多边形边界与真实边界存在误差,这也会导致计算结果与实际面积有偏差。
内容的提问来源于stack exchange,提问作者Rebecca James
相关产品推荐
相关产品推荐

