You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

matplotlib Basemap经纬度坐标绘制异常问题求助

排查Basemap绘图点偏离地图的常见问题

嘿,我之前折腾Basemap的时候也踩过类似的坑,坐标转换后点直接跑到地图外面去,太闹心了!结合你说的52°N 1°E(英国)的点严重偏离的情况,大概率是这几个常见问题,咱们一个个排查:

1. 地图投影初始化的范围没覆盖目标区域

Basemap初始化时如果没设置正确的地图边界,你的目标点可能根本不在当前显示的地图范围内。比如你要是初始化了一个只覆盖东亚的地图,英国的点自然会跑到画布外面。

举个覆盖欧洲区域的正确初始化示例:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# 选用墨卡托投影,设置覆盖欧洲的经纬度范围
m = Basemap(projection='merc', 
            llcrnrlon=-15,  # 左下角经度
            llcrnrlat=30,   # 左下角纬度
            urcrnrlon=25,   # 右上角经度
            urcrnrlat=65,   # 右上角纬度
            resolution='i') # 中等分辨率

2. 经纬度的顺序搞反了!

这是最容易犯的错误!Basemap的坐标转换函数m(lon, lat)要求第一个参数是经度,第二个是纬度。很多人会下意识写成m(lat, lon),直接把52°N 1°E变成1°N 52°E——这位置跑到非洲东部去了,肯定偏离英国!

正确的转换和绘图代码应该是:

# 目标坐标:1°E(经度),52°N(纬度)
target_lon, target_lat = 1, 52
x, y = m(target_lon, target_lat)  # 先经度,后纬度!
m.scatter(x, y, color='darkred', marker='o', s=100) # 绘制红色标记点

3. 经纬度的正负符号错误

别小看这个细节:北纬度是正数,南纬度是负数;东经是正数,西经是负数。要是你不小心把52°N写成-52,那点直接跑到南美洲去了,完全不在预期区域。赶紧检查你的坐标列表里的正负号是否正确。

4. 忘记绘制地图基础元素导致误判

有时候你已经正确转换了坐标,但因为没画海岸线、经纬线,导致你以为点偏离了,其实是地图本身没显示出来。记得加上这些代码来渲染地图:

m.drawcoastlines(linewidth=0.8)
m.drawcountries(linewidth=0.5)
m.drawparallels(range(30, 70, 10), labels=[1,0,0,0]) # 绘制纬线
m.drawmeridians(range(-15, 25, 10), labels=[0,0,0,1]) # 绘制经线
plt.title('Target Point in UK')
plt.show()

额外排查技巧

你可以打印出Basemap的坐标范围和转换后的点坐标,对比看看是否超出:

print(f"地图x范围:{m.xmin} ~ {m.xmax}")
print(f"地图y范围:{m.ymin} ~ {m.ymax}")
print(f"转换后的点坐标:x={x}, y={y}")

如果点的x/y不在地图范围内,那要么是初始化的地图范围太小,要么是坐标输入错误。

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

火山引擎 最新活动