Python中GeoDataFrame总面积计算结果差异原因咨询
问题原因解析
核心差异:to_crs()的返回特性
GeoPandas的to_crs()方法不会直接修改原GeoDataFrame的坐标系,它会返回一个转换了坐标系的新对象(或新的GeoSeries),如果没有将这个返回值赋值回原数据,原数据的坐标系完全不变。
错误代码的问题
south_america.geometry.to_crs(epsg=3035) south_america.loc[:, "AREA"] = south_america.geometry.area / 10**6 totalArea = south_america.AREA.sum()
- 第一行代码仅生成了转换到EPSG:3035的几何序列,但没有把这个结果赋值给
south_america.geometry,所以原GeoDataFrame的坐标系还是初始状态(通常是WGS84,即EPSG:4326,单位为经纬度的「度」)。 - 第二行计算的是经纬度坐标系下的面积,这种坐标系下的面积单位是「平方度」,数值本身极小,除以1e6后总和自然趋近于0,和预期的平方公里数值差了10个数量级。
正确代码的逻辑
totalArea = sum(south_america.geometry.to_crs(epsg=3035).area) / 10**6
- 这里直接对
geometry调用to_crs(epsg=3035),得到的是转换到等面积投影(EPSG:3035)后的新GeoSeries,该投影的单位是「米」。 - 计算这个新GeoSeries的
area得到的是平方米,除以1e6转换成平方公里后求和,结果就是正确的南美洲总面积。
如果想修改原数据后再计算,也可以这样写:
# 将转换后的坐标系赋值回原GeoDataFrame south_america = south_america.to_crs(epsg=3035) south_america["AREA"] = south_america.geometry.area / 10**6 totalArea = south_america.AREA.sum()
内容的提问来源于stack exchange,提问作者mlangenfeld
相关产品推荐
相关产品推荐

