一开始我认为这可能与Basemap
的旧问题有关。然而,我认为你的问题并不是由于Basemap
引起的,实际上它正确处理了经度包裹,如果你只使用标记来绘制卫星地面轨迹,你就可以看到。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
f = plt.figure(figsize(10,7.5))
m = Basemap(projection="mill", lon_0=0)
m.drawcoastlines()
m.drawparallels(np.arange(-90,91,30),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180,181,60), labels=[0,0,0,1])
x,y = m(lon, lat)
m.plot(x, y, color="red", latlon=False, marker='.', linestyle='None')
![enter image description here](https://istack.dev59.com/SBPJA.webp)
最终的解决方案是将您的地面轨迹分成多个轨迹,并使用
LineCollection
绘制它们,如
此处所述。一个更简单的方法(如果您预计经度上有一个不连续点):
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
latlon_ar = np.array(latlon)
threshold = 90
idx_wrap = np.nonzero(np.abs(np.diff(latlon_ar[:,1])) > threshold)[0]+1
lon_1 = lon[:idx_wrap]
lat_1 = lat[:idx_wrap]
lon_2 = lon[idx_wrap:]
lat_2 = lat[idx_wrap:]
f = plt.figure(figsize(10,7.5))
m = Basemap(projection="mill", lon_0=0)
m.drawcoastlines()
m.drawparallels(np.arange(-90,91,30),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180,181,60), labels=[0,0,0,1])
x1, y1 = m(lon_1, lat_1)
x2, y2 = m(lon_2, lat_2)
m.plot(x1, y1, color="red", latlon=False)
m.plot(x2, y2, color="blue", latlon=False)
![enter image description here](https://istack.dev59.com/4cN0Y.webp)
编辑 Basemap
中的 已确认的错误 是导致问题第一个示例行为的罪魁祸首,这里使用经纬度值直接调用 Basemap.plot
并将 latlon
标志设置为 True
。有一个解决方案,即在绘图前手动移动输入坐标,如下面的代码。
lons, lats = m.shiftdata(lon, lat)
m.plot(lons, lats, color="blue", latlon=True, marker='.', linestyle='None')
![enter image description here](https://istack.dev59.com/WaNQm.webp)