使用GeoPandas缩放地图:欧洲区域显示异常问题求助
问题解决:GeoPandas地图欧洲区域显示异常(法国位置错误)
核心原因
出现法国位置偏移、区域显示混乱的问题,主要是两个关键点出错:
- GeoDataFrame未绑定正确坐标系:如果你的几何数据没有指定空间参考(比如通用的WGS84经纬度坐标系),GeoPandas无法正确解析地理位置,直接导致图形错位。
- 直接设置坐标轴范围的局限性:
ax.set_xlim/ylim只是粗暴裁剪显示区域,不会修正数据本身的空间错位,反而会放大坐标系不匹配带来的问题。
分步解决方案
1. 确认并设置正确坐标系
先检查当前GeoDataFrame的坐标系,若未设置则手动绑定WGS84(EPSG:4326):
# 检查当前坐标系 print(gdf_mundo.crs) # 若未设置,绑定WGS84经纬度坐标系 if gdf_mundo.crs is None: gdf_mundo = gdf_mundo.set_crs(epsg=4326, allow_override=True)
2. 用空间索引精准裁剪欧洲区域
不要直接限制坐标轴,而是用GeoPandas的cx索引筛选欧洲范围内的国家数据,确保只加载目标区域的有效几何:
# 定义欧洲经纬度范围(可根据需求微调) europe_bounds = (-10, 35, 70, 80) # 格式:(最小经度, 最小纬度, 最大经度, 最大纬度) gdf_europe = gdf_merged.cx[europe_bounds[0]:europe_bounds[2], europe_bounds[1]:europe_bounds[3]]
3. 重新绘制欧洲区域地图
用裁剪后的gdf_europe替换原数据绘图,避免错位问题:
fig, ax = plt.subplots(figsize=(12, 10)) # 绘制欧洲区域数据 gdf_europe.plot(column='PRODECENCIA EXTRANJEROS', cmap='ocean_r', ax=ax, legend=True, legend_kwds={'shrink': 0.5}, alpha=0.8, vmin=0, vmax=5) gdf_europe.boundary.plot(ax=ax, color='white', linewidth=1) # 添加国家名称(仅欧洲区域) for idx, row in gdf_europe.iterrows(): ax.text(row.geometry.centroid.x, row.geometry.centroid.y, row['etiqueta'], fontsize=10, ha='center', color='black') # 美化图表 ax.set_title('2022年欧洲各国人口', fontsize=20, pad=20) legend = ax.get_legend() if legend is not None: plt.setp(legend.get_texts(), fontsize='12') ax.set_axis_on() plt.show()
4. 额外排查:修复损坏的几何数据
如果上述步骤后仍有错位,可能是部分国家的几何数据本身无效,可执行修复:
gdf_mundo = gdf_mundo.make_valid()
完整修正代码
import geopandas as gpd import matplotlib.pyplot as plt # 转换为GeoDataFrame并设置坐标系 gdf_mundo = gpd.GeoDataFrame(df_turismoextfinal, geometry='geometry') if gdf_mundo.crs is None: gdf_mundo = gdf_mundo.set_crs(epsg=4326, allow_override=True) # 过滤有效数据并修复几何(可选) gdf_merged = gdf_mundo.dropna(subset=['PRODECENCIA EXTRANJEROS']).make_valid() # 裁剪欧洲区域 europe_bounds = (-10, 35, 70, 80) gdf_europe = gdf_merged.cx[europe_bounds[0]:europe_bounds[2], europe_bounds[1]:europe_bounds[3]] # 绘制地图 fig, ax = plt.subplots(figsize=(12, 10)) gdf_europe.plot(column='PRODECENCIA EXTRANJEROS', cmap='ocean_r', ax=ax, legend=True, legend_kwds={'shrink': 0.5}, alpha=0.8, vmin=0, vmax=5) gdf_europe.boundary.plot(ax=ax, color='white', linewidth=1) # 添加国家名称 for idx, row in gdf_europe.iterrows(): ax.text(row.geometry.centroid.x, row.geometry.centroid.y, row['etiqueta'], fontsize=10, ha='center', color='black') # 美化设置 ax.set_title('2022年欧洲各国人口', fontsize=20, pad=20) legend = ax.get_legend() if legend is not None: plt.setp(legend.get_texts(), fontsize='12') ax.set_axis_on() plt.show()
内容的提问来源于stack exchange,提问作者María del Carmen Montoya
相关产品推荐
相关产品推荐

