如何在Geopandas地图指定国家区域上方添加自定义图片
Geopandas在指定国家区域上方叠加自定义图片实现方案
完全可以实现,核心逻辑是提取每个目标国家多边形的几何中心点,通过matplotlib的图片标注接口将对应自定义图片锚定到中心点上方即可,不需要依赖额外复杂工具。
前置依赖安装
先安装需要的第三方库,执行命令:pip install geopandas matplotlib pillow
完整实现步骤
准备基础映射关系与底图数据
先整理国家名称和对应图片路径的匹配字典,加载你已有的GeoDataFrame,也可以直接用geopandas自带的世界底图做测试:import geopandas as gpd import matplotlib.pyplot as plt from matplotlib.offsetbox import OffsetImage, AnnotationBbox from PIL import Image # 按你的需求配置国家-对应图片的映射规则 country_img_config = { "United States of America": "coke.jpg", "Russia": "pepsi.jpg" # 其余国家按相同规则追加即可 } # 加载世界底图,可替换为你自己的GeoDataFrame world_gdf = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))计算每个国家的图片锚点坐标
为了避免高纬度国家几何中心偏移,先转成Web墨卡托投影计算中心点,再转回到原经纬度坐标系:# 投影转换后计算中心点 proj_gdf = world_gdf.to_crs(epsg=3857) world_gdf["plot_x"] = proj_gdf.geometry.centroid.to_crs(world_gdf.crs).x world_gdf["plot_y"] = proj_gdf.geometry.centroid.to_crs(world_gdf.crs).y绘制底图并叠加自定义图片
先绘制国家轮廓底图,再遍历匹配到规则的国家,将对应图片锚定到中心点上方,可自由调整图片大小、偏移量:# 创建绘图画布 fig, ax = plt.subplots(figsize=(16, 9)) # 绘制基础国家轮廓 world_gdf.plot(ax=ax, color="#f2f2f2", edgecolor="#444444", linewidth=0.8) # 逐个叠加对应图片 for _, row in world_gdf.iterrows(): country_name = row["name"] if country_name not in country_img_config: continue # 读取目标图片 mark_img = Image.open(country_img_config[country_name]) # 设置图片缩放比例,根据你的图片实际尺寸调整,数值越大图片越大 img_offset = OffsetImage(mark_img, zoom=0.025) img_offset.image.axes = ax # 配置图片锚定规则:xybox设置相对于中心点的偏移,第二个值越大图片位置越靠上 img_anchor = AnnotationBbox( img_offset, (row["plot_x"], row["plot_y"]), xybox=(0, 12), xycoords="data", boxcoords="offset points", frameon=False # 关闭图片默认边框 ) ax.add_artist(img_anchor) # 隐藏坐标轴 ax.set_axis_off() plt.tight_layout() plt.show()
参数调整提示
- 若图片大小不符合预期,修改
OffsetImage的zoom参数即可 - 若图片位置偏下/偏上,调整
xybox的第二个数值,单位是像素点 - 针对形状狭长、中心点落在国土外的国家,可以手动指定该国家的
plot_x、plot_y坐标,不需要统一用几何中心
需求效果参考

内容的提问来源于stack exchange,提问作者CingirakliDumbelek
相关产品推荐
相关产品推荐

