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
相关产品推荐
相关产品推荐

