Prettymaps如何在生成的地图上添加指定坐标的位置标记
prettymaps添加点位标识实现方案
你当前代码点位不显示/位置偏移,核心是两个问题:
- 经纬度顺序写反:地图绘图轴的x轴对应经度(东西方向,数值范围-180180,你提供的127.0114887是首尔驿三洞附近的经度),y轴对应**纬度**(南北方向,数值范围-9090,你写在x变量里的37.5718616才是纬度),参数传反时点会落在画布外。
- 标记层级不够:你配置的地图元素中建筑层zorder为4,标记默认层级低于地图要素,会被道路、建筑完全盖住。
prettymaps本质是对matplotlib+osmnx的封装,绘图用的ax对象完全开放,直接用matplotlib原生接口就能加标记,以下是几种常用方案:
方案1:原生matplotlib画标记(最简便,适合少量点位)
不要用全局plt.plot,直接调用绑定地图的ax对象绘图,稳定性更高。把你代码最后两行替换成下面的片段即可:
# 传参顺序:经度、纬度 # zorder设为5,高于所有地图图层,保证标记显示在最上层 ax.plot( 127.0114887, 37.5718616, marker='o', # 可替换为任意matplotlib支持的标记:'^'上三角、's'方块、'*'星号,也支持LaTeX格式标记 markersize=12, color='#C5283D', markeredgecolor='white', markeredgewidth=2, zorder=5 ) # 如需加文字标注,直接调用ax.text即可 ax.text( 127.0114887, 37.5718616 + 0.001, # 纬度加0.001,把文字挪到点位北侧约100米位置,避免遮挡标记 '目标建筑', fontsize=12, fontweight='bold', color='#2F3737', ha='center', zorder=6 )
批量加多点位时,把坐标整理成列表循环绘制即可:
point_list = [ (127.0114887, 37.5718616, "驿三洞地铁站"), (127.0203, 37.5721, "中心商圈") ] for lon, lat, label in point_list: ax.plot(lon, lat, marker='o', markersize=10, color='#E9724C', zorder=5) ax.text(lon, lat + 0.001, label, ha='center', fontsize=10, zorder=6)
方案2:自定义图标标记(适合定制化视觉需求)
如果需要用专属图标(比如景点、商铺的专属标识)代替matplotlib自带的简单标记,可以加载本地图片贴到对应坐标:
from matplotlib.offsetbox import OffsetImage, AnnotationBbox # 读取本地图标文件,调整zoom参数控制图标大小 marker_img = OffsetImage(plt.imread("custom_marker.png"), zoom=0.06) marker_box = AnnotationBbox( marker_img, (127.0114887, 37.5718616), frameon=False, # 去掉图标默认边框 zorder=5 ) ax.add_artist(marker_box)
方案3:批量加载POI自动打点(适合大量点位场景)
如果需要给某一类公共设施批量打点,不需要手动整理坐标,可以直接用osmnx拉取研究范围内的对应POI自动绘制,比如绘制范围内所有咖啡店点位:
# 从plot返回的结果中拿到当前地图的边界范围 map_perimeter = backup['perimeter'] # 拉取边界内所有咖啡店类别的POI cafe_pois = ox.geometries_from_polygon(map_perimeter, tags={'amenity': 'cafe'}) # 筛选点类型的POI绘制,排除面状的咖啡店建筑 cafe_pois[cafe_pois.geom_type == 'Point'].plot( ax=ax, color='#483420', markersize=6, zorder=5 )
注意事项
- 所有后添加的自定义元素zorder必须大于现有地图元素的最高zorder,否则会被遮挡。
- 经纬度顺序不要搞混:国内及东亚城市经度普遍在70140区间,纬度在1060区间,拿不准时可以通过数值范围快速判断。
- 尽量使用
ax.开头的对象方法绘图,不要用plt.开头的全局方法,避免多子图场景下元素错位。
内容的提问来源于stack exchange,提问作者albusdemens
相关产品推荐
相关产品推荐

