Я строю координаты самолета по широте и долготе, используя Базовую карту с анимацией для обновления карты.Я также хочу отметить участки с идентификатором рейса.Позиции данных считываются из текстового файла, который постоянно обновляется.Для этого поста я заменил текстовый файл на «position_data», и идентификатор рейса исправлен, но результат точно такой же.Если я закомментирую строку plt.text, точки будут построены правильно, но если я включу эту строку, я получу ошибку «Аргумент TypeError: float () должен быть строкой или числом» Uncommenting x2 = 3000000 и y2 = 3000000 отображает обаточки и метки (хотя и не в том месте, так как это всего лишь тест на маркировку). Любая помощь в решении этой проблемы будет принята, поскольку Python и карты являются новыми для меня.
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
import os.path
import matplotlib.animation as animation
my_map = Basemap(projection='merc',llcrnrlat = 20,llcrnrlon = -100,urcrnrlat = 60,
urcrnrlon = 20,resolution='l')
my_map.drawcoastlines()
my_map.drawcountries()
my_map.fillcontinents(color = '#D2FFC4')
my_map.drawmapboundary()
my_map.drawparallels(np.arange(10,90,20),labels=[1,1,0,1])
my_map.drawmeridians(np.arange(-180,180,30),labels=[1,1,0,1])
x1=[]
y1=[]
x2,y2 = my_map(0, 0)
point = my_map.plot(x2, y2, 'r.', markersize=1)[0]
def init():
point.set_data([], [])
return point,
def get_position():
position_data= ['10.18,50.7\n', '8.6,49.9\n','5.0,52.7\n', '4.7,52.36\n', '11.1,56.58\n' ]
#print position_data #debug
for line in position_data:
if len(line)>0:
x,y=line.split(',')
#print x,y #debug
x1.append(float(x))
y1.append(float(y))
#print x1,y1 #debug
return x1,y1
# animation function.
def animate(i):
get_position()
x2,y2=my_map(x1,y1,inverse=False)
#x2=3000000
#y2=3000000
#print x2
plt.text(x2, y2, 'AB123',fontsize=6,fontweight='bold', ha='left',va='bottom',color='r')
point.set_data(x2, y2)
return point,
# call the animator.
anim = animation.FuncAnimation(plt.gcf(), animate, init_func=init,
frames=200, interval=1000, blit=False)
plt.show()
Спасибо за полезнуюсовет.Я путал списки с переменными!Исправленный и рабочий код теперь:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
import os.path
import matplotlib.animation as animation
my_map = Basemap(projection='merc',llcrnrlat = 20,llcrnrlon = -100,urcrnrlat = 60,
urcrnrlon = 20,resolution='l')
my_map.drawcoastlines()
my_map.drawcountries()
my_map.fillcontinents(color = '#D2FFC4')
my_map.drawmapboundary()
my_map.drawparallels(np.arange(10,90,20),labels=[1,1,0,1])
my_map.drawmeridians(np.arange(-180,180,30),labels=[1,1,0,1])
x1=[]
y1=[]
idx=0
ids=[]
p=0
position_data=[]
x2,y2 = my_map(0, 0)
point = my_map.plot(x2, y2, 'r.', markersize=1)[0]
def init():
point.set_data([], [])
return point,
def get_position():
position_data= ['10.18,50.7,ab123\n', '8.6,49.9,bc234\n','5.0,52.7,cd456\n', '4.7,52.36,ef678\n', '11.1,56.58,gh789\n' ]
global idx
idx=0
for line in position_data:
if len(line)>0:
x,y,id=line.split(',')
print x,y,id #debug
x1.append(float(x))
y1.append(float(y))
ids.append(id)
idx=idx+1
#print idx #debug
#print x1,y1,ids #debug
return
# animation function.
def animate(i):
get_position()
x2,y2=my_map(x1,y1,inverse=False)
#print idx
point.set_data(x2, y2)
for p in range(idx):
plt.text(x2[p],y2[p],ids[p],fontsize=7,ha='left',va='bottom',color='k')
# point.set_data(x2, y2)
del x1[:] # or lists grow every loop!
del y1[:]
del ids[:]
return point,
# call the animator.
anim = animation.FuncAnimation(plt.gcf(), animate, frames=20, interval=1000, blit=False)
plt.show()