我试图使用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()
答案 0 :(得分:1)
大圆距离或顺向距离是球体表面上两点之间的最短距离,沿着球体表面测量。
所以显示的路径是最短的距离,可能会从图像的一侧到另一侧。
该行中的缺失点有点神秘,但可能是使用中的投影存在一些问题。使用不同的投影,这很好,例如, 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()
如果点之间的距离放大,例如
,则可以避免这个问题line, = m.drawgreatcircle(x,y,z,w,del_s=1000,color='r')
会给出
另一种解决方法是从线上获取数据并手动绘制,
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()