Mapa de base gran círculo envoltura longitudinal y problema de datos faltantes

Estoy intentando trazar múltiples círculos grandes usando un bucle for junto con un conjunto de puntos lat / lon. Estoy utilizando la función de animación con matplotlib para actualizar los gráficos cuando se actualice la fuente de datos. Todo esto está funcionando bien.

Noté que al trazar grandes círculos en los que la distancia más corta está envolviendo la imagen, la ttwig usará eso y aparecerá en el otro lado del mapa. ¿Hay algún argumento que impida esto?

Además, dependiendo de dónde esté la ttwig, observo que falta el “centro” del arco de la ttwig. ¿Qué podría estar causando esto? Mapa y código a continuación:

El CSV utiliza los siguientes puntos: (Moscú y Tokio)

sourcelon sourcelat destlon destlat 55.44 37.51 -80.84 35.22 139 35.6 -80.84 35.22 

Código mínimo:

 from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import pandas as pd import numpy as np import matplotlib.animation # setup mercator map projection. fig = plt.figure(figsize=(27, 20)) m = Basemap(projection='mill', lon_0=0) m.drawcoastlines(color='r', linewidth=1.0) def animate(i): df = pd.read_csv('c:/python/scripts/test2.csv', sep='\s*,\s*',header=0, encoding='ascii', engine='python'); df for x,y,z,w in zip(df['sourcelon'], df['sourcelat'], df['destlon'], df['destlat']): line, = m.drawgreatcircle(x,y,z,w,color='r') ani = matplotlib.animation.FuncAnimation(fig, animate, interval=1000) plt.tight_layout() plt.show() 

introduzca la descripción de la imagen aquí

Como nos dice wikipedia

La distancia del círculo máximo o la distancia ortodrómica es la distancia más corta entre dos puntos en la superficie de una esfera, medida a lo largo de la superficie de la esfera.

Por lo tanto, el camino que se muestra va a la distancia más corta, que podría pasar de un lado a otro de la imagen.

Los puntos que faltan en la línea son un poco misteriosos, pero puede ser que haya algún problema con la proyección en uso. Usando una proyección diferente, esto funciona bien, por ejemplo, projection='robin' :

 from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt fig = plt.figure(figsize=(8,6)) m = Basemap(projection='robin',lon_0=0,resolution='c') m.drawcoastlines(color='grey', linewidth=1.0) a = [[55.44, 37.51, -80.84, 35.22],[139, 35.6, -80.84, 35.22]] x,y,z,w = a[0] line, = m.drawgreatcircle(x,y,z,w,color='r') plt.show() 

introduzca la descripción de la imagen aquí

El problema se puede sortear si la distancia entre los puntos se amplía, por ejemplo,

 line, = m.drawgreatcircle(x,y,z,w,del_s=1000,color='r') 

daría

introduzca la descripción de la imagen aquí

Otra solución sería obtener los datos de la línea y trazarlos manualmente,

 from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt fig = plt.figure(figsize=(8,6)) m = Basemap(projection='mill', lon_0=0) m.drawcoastlines(color='grey', linewidth=1.0) a = [[55.44, 37.51, -80.84, 35.22],[139, 35.6, -80.84, 35.22]] x,y,z,w = a[0] line, = m.drawgreatcircle(x,y,z,w,color='r') line.remove() mx,my = line.get_data() m.plot(mx,my, color="limegreen") plt.show() 

introduzca la descripción de la imagen aquí