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

使用GeoPandas缩放地图:欧洲区域显示异常问题求助

问题解决:GeoPandas地图欧洲区域显示异常(法国位置错误)

核心原因

出现法国位置偏移、区域显示混乱的问题,主要是两个关键点出错:

  1. GeoDataFrame未绑定正确坐标系:如果你的几何数据没有指定空间参考(比如通用的WGS84经纬度坐标系),GeoPandas无法正确解析地理位置,直接导致图形错位。
  2. 直接设置坐标轴范围的局限性: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:45:01