在Basemap中绘制包装路径

Chr*_*ris 3 python maps plot matplotlib-basemap

我试图绘制一个卫星地面轨道.我有一个度数的纬度和经度列表.经度值均为-180至+180度.我的第一个问题是使用latlon关键字(顺便说一句,我通过PyCall.jl包在Julia中使用它,所以请原谅看起来很奇怪的语法):

map = Basemap.Basemap(projection="mill",lon_0=0)
map[:drawcoastlines]()
map[:drawparallels](-90:30:90,labels=[1,0,0,0])
map[:drawmeridians](map[:lonmin]:60:map[:lonmax]+30,labels=[0,0,0,1])
map[:plot](lon,lat,color="red",latlon=true)
Run Code Online (Sandbox Code Playgroud)

奇怪的情节

这是......不应该是什么样子.我不确定问题是什么.但是,如果我先转换为地图坐标:

xx,yy = map(lon,lat) 
map[:plot](xx,yy,color="red")
Run Code Online (Sandbox Code Playgroud)

更好的情节

这要好得多,除了经度从+180到-180之间的线.有什么建议使这看起来更好?

可以在此处找到用于生成这些图的纬度,经度对(以度为单位).

lmi*_*ori 8

一开始我觉得这可能与旧的问题有关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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

明确的解决办法是在多个轨道分割你的地面轨迹,并使用绘制出来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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑已确认的bugBasemap负责的问题,其中第一个例子中的行为Basemap.plot直接与纬度和经度值叫,将其具有的latlon标志True.有一种解决方案,即在绘图之前手动移动输入坐标,如下面的代码所示.

lons, lats = m.shiftdata(lon, lat)
m.plot(lons, lats, color="blue", latlon=True, marker='.', linestyle='None')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述