Построение обернутого пути в базовой карте

Я пытаюсь построить спутниковую наземную дорожку. У меня есть список широт и долгот в градусах. Все значения долготы от -180 до +180 градусов. Моя первая проблема связана с использованием ключевого слова latlon (кстати, я использую его в Julia через пакет PyCall.jl, так что простите за странный синтаксис):

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)

Странный сюжет

Это... не то, на что это должно быть похоже. Я не совсем уверен, в чем проблема. Однако, если я сначала конвертирую в координаты карты:

xx,yy = map(lon,lat) 
map[:plot](xx,yy,color="red")

Лучший сюжет

Это намного лучше, за исключением линии в точке, где долгота переходит от +180 до -180. Любые предложения, чтобы сделать это выглядеть лучше?

Пары широта-долгота (в градусах), используемые для создания этих графиков, можно найти здесь.


person Chris    schedule 25.05.2016    source источник
comment
Есть ли шанс, что простое переупорядочивание списка длинных и длинных точек, чтобы они начинались и заканчивались на краях вашей карты, сработает? Другими словами, изменить порядок на основе долготы от -180 до 180.   -  person dagrha    schedule 26.05.2016
comment
Я попытался изменить порядок, но из-за перекрытия Тихого океана путь прыгает туда-сюда между верхней частью и нижней частью.   -  person Chris    schedule 26.05.2016
comment
Может помочь такое решение: stackoverflow.com/a/27139390/3651127   -  person dagrha    schedule 26.05.2016
comment
У меня сложилось впечатление, что базовая карта предназначена для внутренней обработки подобных вещей, поэтому я надеюсь избежать доморощенного решения.   -  person Chris    schedule 26.05.2016
comment
Можете ли вы где-нибудь опубликовать свои данные о широте, чтобы люди могли возиться с ними, чтобы попытаться найти решение?   -  person dagrha    schedule 28.05.2016
comment
@dagrha посмотри, что я только что сделал.   -  person Chris    schedule 31.05.2016


Ответы (1)


Сначала я подумал, что это может быть связано со старой проблемой 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')

введите описание изображения здесь

Окончательное решение состоит в том, чтобы разделить ваш наземный трек на несколько треков и построить их с помощью 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)

введите описание изображения здесь

Изменить Эта подтвержденная ошибка в Basemap отвечает за поведение в первый пример вопроса, где Basemap.plot вызывается напрямую со значениями широты и долготы, установив флаг latlon в True. Существует решение, которое заключается в ручном смещении входных координат перед построение, как в следующем коде.

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

введите описание изображения здесь

person lmillefiori    schedule 02.06.2016
comment
Это здорово, спасибо. Вы хоть представляете, что происходит в моем первом примере (с latlon=true)? - person Chris; 03.06.2016
comment
@Chris Это это Basemap ошибка. Я обновил ответ ссылкой на ошибку и возможным решением. - person lmillefiori; 03.06.2016