Python Basemap drawgreatcircle 在路径上有间隙

Python Basemap drawgreatcircle has a gap in the path

我看到一些奇怪的底图行为。它画了一个大圆圈,里面有一个空隙。

这是从温哥华到伦敦画一个大圆的代码:

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

def plot_map():
    bg_color = (0.0, 0.0, 0.0, 1.0)
    coast_color = (204/255.0, 0.8, 153/255.0, 0.7)
    country_color = (204/255.0, 0.8, 153/255.0, 0.2)
    path_color = (204/255.0, 0.2, 153/255.0, 0.6)

    dep_lat, dep_lon = 51.470020, -0.454295
    arr_lat, arr_lon = 49.193901, -123.183998

    plt.figure()

    m = Basemap(llcrnrlon=-130.,llcrnrlat=40.,urcrnrlon=10.,urcrnrlat=70.,\
            rsphere=(6378137.00,6356752.3142),\
            resolution='l',projection='merc',\
            lat_0=40.,lon_0=-20.,lat_ts=20.)
    m.drawcoastlines(color=coast_color, linewidth=1.0)
    m.fillcontinents(color=bg_color, lake_color=bg_color)
    m.drawmapboundary(fill_color=bg_color)
    m.drawgreatcircle(dep_lon, dep_lat,arr_lon, arr_lat,
                      linewidth=2.0, color=path_color)

    plt.savefig('routes.png', format='png', bbox_inches='tight')

if __name__ == '__main__':
    plot_map()

结果如下:

drawgreatcircle 返回的路径对象包含许多 NAN,其中间隙为:

...
[10665759.64101299,  4404955.44856027],
[10474119.01096945,  4511711.30524047],
[              nan,               nan],
[              nan,               nan],
...
[              nan,               nan],
[              nan,               nan],
[ 4228670.53408886,  4599991.37541622],
[ 4031731.93039374,  4496703.65196268],
[ 3840974.7826069 ,  4389405.80623971],
...

谁能帮帮我? 谢谢

解决您在使用 merc (Mercator) 投影计算高纬度点时遇到的问题的一种方法是使用其他有效的投影。但是如果你坚持使用墨卡托绘制这样的高纬度点,你可能需要结合2种方法。这里我使用 cyl(无投影)绘制大圆弧。然后提取它的坐标,最后用坐标在merc投影上绘制大圆路径。

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

fig=plt.figure()

# use 'cyl' projection to get greatcircle path
# some of the parameters are ignored dummies
m0 = Basemap(llcrnrlon=-130.,llcrnrlat=40.,urcrnrlon=10.,urcrnrlat=70., \
        rsphere=(6378137.00, 6356752.3142), \
        resolution='l', projection='cyl', \
        lat_0=40., lon_0=-20., lat_ts=20.)

dep_lat, dep_lon = 51.470020, -0.454295
arr_lat, arr_lon = 49.193901, -123.183998
# draw greatcircle and grab it
gcc = m0.drawgreatcircle(dep_lon, dep_lat,arr_lon, arr_lat, del_s=100.0, \
                      linewidth=2.0, color='None')
ax0 = fig.gca()
ax0.set_visible(False)   # suppress the plot of 'cyl' projection

# get list of long-lat for greatcircle plot later
xys = gcc[0].get_xydata()

def plot_map():
    bg_color = (0.0, 0.0, 0.0, 1.0)
    coast_color = (204/255.0, 0.8, 153/255.0, 0.7)
    country_color = (204/255.0, 0.8, 153/255.0, 0.2)
    path_color = (204/255.0, 0.2, 153/255.0, 0.6)

    plt.figure(figsize=[10, 6])

    m = Basemap(llcrnrlon=-130.,llcrnrlat=40.,urcrnrlon=10.,urcrnrlat=70., \
            rsphere=(6378137.00, 6356752.3142), \
            resolution='l', projection='merc', \
            lat_0=40., lon_0=-20., lat_ts=20.)

    m.drawcoastlines(color=coast_color, linewidth=1.0)
    m.fillcontinents(color=bg_color, lake_color=bg_color)
    m.drawmapboundary(fill_color=bg_color)

    # problematic code ...
    # m.drawgreatcircle(dep_lon, dep_lat,arr_lon, arr_lat, del_s=100.0, \
    #                 linewidth=2.0, color=path_color)

    # plot path on the map with coordinates obtained earlier
    m.plot(xys[:,0], xys[:,1], latlon=True)

    plt.savefig('routes.png', format='png', bbox_inches='tight')

if __name__ == '__main__':
    plot_map()

结果图: