You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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. 上述计算方法是否正确?
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:33:24