GeoPandas:修改迭代创建的GeoDataFrame的CRS遇异常
解决GeoDataFrame CRS设置后绘图异常的问题
核心误区:区分set_crs()和to_crs()
- 如果你的
contus是从**已有CRS(比如经纬度EPSG:4326)**的GeoDataFrame衍生而来,别用contus.set_crs(epsg=5070)——这会错误地告诉GeoPandas“现有坐标就是EPSG:5070的”,但实际上它们还是经纬度,导致绘图显示异常。 - 正确做法是用
to_crs()转换坐标:# 先确认原始GeoDataFrame的CRS(通常是EPSG:4326) print(original_gdf.crs) # 转换contus到目标CRS(EPSG:5070) contus = contus.to_crs(epsg=5070) # 验证结果:检查CRS和坐标范围 print(contus.crs) print(contus.geometry.bounds.head()) # EPSG:5070坐标是米为单位,数值范围会是几万到几百万级
迭代创建时的CRS一致性检查
- 迭代过程中,确保每一步生成的子GeoDataFrame都有正确CRS,拼接前统一转换:
contus_list = [] for item in large_dataset: # 生成子GeoDataFrame sub_gdf = create_sub_gdf(item) # 若子DF无CRS,先指定原始数据的CRS(假设是经纬度EPSG:4326) if sub_gdf.crs is None: sub_gdf = sub_gdf.set_crs(epsg=4326) # 转换到目标CRS后再加入列表 contus_list.append(sub_gdf.to_crs(epsg=5070)) # 拼接所有子DF得到最终contus contus = pd.concat(contus_list, ignore_index=True)
绘图前的验证步骤
- 打印坐标范围:如果输出是-180180、-9090,说明坐标仍是经纬度,CRS设置未生效。
- 绘图时强制标注CRS,直观确认:
contus.plot() plt.gca().set_title(f"当前CRS: {contus.crs}") plt.show()
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

