3 votes

Animer GMapPlot avec Python/Bokeh

Je suis un programmeur très novice et c'est ma première question sur Stack Overflow :)

J'essaie donc d'animer le trajet d'une voiture sur google maps en utilisant Python. J'ai d'abord utilisé matplotlib et j'ai pu obtenir un point animé sur la ligne du trajet... puis j'ai essayé d'utiliser bokeh et j'ai réussi à faire superposer le trajet sur google maps...

Mon problème est que je n'ai pas trouvé de bon moyen de faire les deux (animer le tracé sur google maps).

Mes données sont sous la forme de coordonnées Lat/Long.

Des conseils ? Merci d'avance !

EDIT : Voici mon code qui fait le gmapplot... Je préfère avoir ceci et aucune animation qu'une animation sans GMAP. Mon but est d'animer le point "voiture".

import numpy as np
from bokeh.io import output_file, show, vform
from bokeh.models.widgets import Dropdown
from bokeh.models import (GMapPlot, GMapOptions, ColumnDataSource, Line, Circle,
    DataRange1d, PanTool, WheelZoomTool, BoxSelectTool, HoverTool)

data = np.genfromtxt('Desktop\Temp Data for Python\test data 3.csv', delimiter=',',
    names=True)

map_options = GMapOptions(lat=np.average(data['Latitude']),
    lng=np.average(data['Longitude']), map_type="roadmap", zoom=13)

plot = GMapPlot(x_range=DataRange1d(), y_range=DataRange1d(), map_options=map_options,
    title="My Drive")

source = ColumnDataSource(data=dict(lat=data['Latitude'], lon=data['Longitude'],
    speed=data['GpsSpeed'],))

path = Line(x="lon", y="lat", line_width = 2, line_color='blue')
car = Circle(x=data['Longitude'][0], y=data['Latitude'][0], size=5, fill_color='red')

plot.add_glyph(source, path)
plot.add_glyph(source, car)
plot.add_tools(PanTool(), WheelZoomTool(), BoxSelectTool(),
    HoverTool(tooltips=[("Speed", "@speed"),]))

output_file("gmap_plot.html")
show(plot)

0voto

tkchris Points 110

Ce n'est peut-être pas exactement ce que vous recherchez, mais vous pourriez avoir un widget de curseur qui contrôle la position de votre point de voiture. L'exemple de curseur trouvé dans la documentation de bokeh (ou dans le dépôt github, je ne me souviens plus) m'a aidé lorsque j'ai commencé à utiliser des curseurs.

Juste pour que vous sachiez, j'avais des problèmes avec les points de latitude qui apparaissaient aux bons endroits. Il y a un décalage d'environ 10px. Il s'agit d'un problème ouvert (github issue 2964).

Le code suivant ne produit actuellement qu'une figure de bokeh générique, mais en théorie, si vous le changez d'une figure de bokeh à une figure de bokeh, vous pouvez l'utiliser pour produire une figure de bokeh. Figure a un GMapPlot il devrait travail. Je n'ai pas réussi à le faire fonctionner avec GMapPlots directement. Je pense que cela peut être dû au problème 3737 de Github. Je ne peux même pas exécuter l'exemple d'Austin dans la documentation de bokeh.

J'espère que c'est ce que vous aviez à l'esprit

from bokeh.plotting import Figure, ColumnDataSource, show, vplot
from bokeh.io import output_file
from bokeh.models import (Slider, CustomJS, GMapPlot, 
                          GMapOptions, DataRange1d, Circle, Line)
import numpy as np

output_file("path.html")

# Create path around roundabout
r = 0.000192

x1 = np.linspace(-1,1,100)*r
x2 = np.linspace(1,-1,100)*r
x = np.hstack((x1,x2))

f = lambda x : np.sqrt(r**2 - x**2)

y1 = f(x1)
y2 = -f(x2)
y = np.hstack((y1,y2))

init_x = 40.233688
init_y = -111.646784

lon = init_x + x 
lat = init_y + y

# Initialize data sources.
location = ColumnDataSource(data=dict(x=[lon[0]], y=[lat[0]]))
path = ColumnDataSource(data=dict(x=lon, y=lat))

# Initialize figure, path, and point
"""I haven't been able to verify that the GMapPlot code below works, but 
this should be the right thing to do. The zoom may be totally wrong, 
but my latlng points should be a path around a roundabout.
"""
##options = GMapOptions(lat=40.233681, lon=-111.646595, map_type="roadmap", zoom=15)
##fig = GMapPlot(x_range=DataRange1d(), y_range=DataRange1d(), map_options=options)

fig = Figure(plot_height=600, plot_width=600)

c = Circle(x='x', y='y', size=10)
p = Line(x='x', y='y')

fig.add_glyph(location, c)
fig.add_glyph(path, p)

# Slider callback
callback = CustomJS(args=dict(location=location, path=path), code="""
    var loc = location.get('data');
    var p = path.get('data');

    t = cb_obj.get('value');

    /* set the point location to the path location that
       corresponds to the slider position */
    loc['x'][0] = p['x'][t];
    loc['y'][0] = p['y'][t];

    location.trigger('change');
""")

# The way I have written this, 'start' has to be 0 and 
#  'end' has to be the length of the array of path points.
slider = Slider(start=0, end=200, step=1, callback=callback)

show(vplot(fig, slider))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X