底图大圆纵向包装和丢失数据问题

时间:2018-03-02 22:07:44

标签: python matplotlib matplotlib-basemap

我试图使用for循环和一组lat / lon点来绘制多个大圆。我正在使用matplotlib的动画功能,以便在更新数据源时更新图表。这一切都运作良好。

我注意到绘制了最短距离包裹图像的大圆圈,情节将使用它并出现在地图的另一侧。 是否存在阻止此问题的论据?

另外,根据情节的位置,我注意到"中间"情节弧的缺失。可能导致这种情况的原因是什么?以下地图和代码:

CSV使用以下几点:(莫斯科和东京)

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

最小代码:

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()

enter image description here

1 个答案:

答案 0 :(得分:1)

作为wikipedia tells us

  

大圆距离或顺向距离是球体表面上两点之间的最短距离,沿着球体表面测量。

所以显示的路径是最短的距离,可能会从图像的一侧到另一侧。

该行中的缺失点有点神秘,但可能是使用中的投影存在一些问题。使用不同的投影,这很好,例如, 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()

enter image description here

如果点之间的距离放大,例如

,则可以避免这个问题
line, = m.drawgreatcircle(x,y,z,w,del_s=1000,color='r')

会给出

enter image description here

另一种解决方法是从线上获取数据并手动绘制,

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()

enter image description here