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

Geopandas绘制地图如何添加米制比例尺、指北针及经纬度坐标轴

技术原因
  • GeoPandas底层基于通用绘图库Matplotlib实现可视化,本身未针对GIS制图场景做专属功能封装,比例尺、指北针这类GIS专属组件需要依赖第三方库或自定义实现。
  • EPSG:4326属于地理坐标系,单位为角度,而米制比例尺需要的是长度单位映射,1度经度对应的实际米数随纬度动态变化,没有固定换算系数,无法做通用的开箱即用适配。
  • 多坐标系联动显示(坐标轴显示经纬度、比例尺匹配投影坐标系长度)涉及坐标系转换、刻度重映射等逻辑,不同用户的投影选择、显示区域范围差异大,很难做通用的标准化封装。
实现方案

你给出的示例代码可以按如下方式修改,即可同时满足三个需求:

import geopandas as gpd
import numpy as np
from matplotlib_scalebar.scalebar import ScaleBar
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch

# 读取数据
df = gpd.read_file(gpd.datasets.get_path('nybb'))
# 转4326用于绘制,同时计算区域平均纬度用于长度换算
df_4326 = df.to_crs(4326)
# 计算绘图范围的平均纬度,转弧度
lat_mean = np.mean([df_4326.total_bounds[1], df_4326.total_bounds[3]])
lat_rad = np.radians(lat_mean)
# 计算EPSG:4326下1度经度对应的3857米制长度
dx = 111319 * np.cos(lat_rad)

# 绘图,坐标轴默认显示4326经纬度
ax = df_4326.plot(figsize=(10,10), alpha=0.5, edgecolor='k')

# 添加3857对应的米制比例尺
scalebar = ScaleBar(dx=dx, units="m", location="lower right")
ax.add_artist(scalebar)

# 添加指北针
ax.add_patch(FancyArrowPatch((0.92, 0.9), (0.92, 0.98), 
                            arrowstyle='->', mutation_scale=20, 
                            color='k', transform=ax.transAxes))
ax.text(0.92, 0.985, 'N', ha='center', transform=ax.transAxes, fontsize=12)

plt.show()

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:03