Базовая карта Python drawgreatcircle имеет пробел в пути - PullRequest
0 голосов
/ 24 ноября 2018

Я вижу странное поведение базовой карты.Он рисует большой круг с разрывом в нем.

Вот код для рисования большого круга от Ванкувера до Лондона:

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],
...

Кто-нибудь может мне помочь?Спасибо

1 Ответ

0 голосов
/ 26 ноября 2018

Одним из способов решения проблемы, с которой вы сталкиваетесь при использовании проекции merc (Mercator) для вычисления точек на высокой широте, является использование другой проекции, которая работает.Но если вы настаиваете на использовании 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()

Полученный график:

enter image description here

...