2016-06-01 9 views
2

Ich bin ein sehr nooby Programmierer und das ist meine erste Stack Overflow Frage. :)Animiere GMapPlot mit Python/Bokeh

Also versuche ich einen Auto-Ausflug auf Google Maps mit Python zu animieren. Ich benutzte Matplotlib zuerst und konnte einen Punkt über die Pfadlinie animiert bekommen ... dann versuchte ich, bokeh zu verwenden und den Pfad erfolgreich zu erhalten, um auf Google Maps zu überlagern ...

Mein Problem ist, dass ich a nicht gefunden habe Gute Möglichkeit, beides zu tun (animierter Plot über Google Maps).

Meine Daten sind in Form von Lat/Long-Koordinaten.

Irgendwelche Ratschläge? Danke im Voraus!

EDIT: Hier ist mein Code, der das Gmapplot tut ... Ich hätte lieber dieses und keine Animation als Animation ohne GMAP. Mein Ziel ist es, diesen "Auto" -Punkt zu animieren.

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) 

Antwort

0

Das ist nicht genau das sein, was Sie suchen, aber Sie könnten ein Slider-Widget haben, die die Position des Autos Punkt steuert. Das Slider-Beispiel in den Bokeh-Dokumenten (oder im github-Repository, ich kann mich nicht erinnern) half mir, als ich begann, Schieberegler zu verwenden.

Nur damit Sie wissen, hatte ich Probleme mit latlng Punkten an den richtigen Orten angezeigt. Es gibt ungefähr einen 10px Offset. Dies ist ein offenes Problem (github-Problem 2964).

Der folgende Code zur Zeit nur eine generische Bokeh Abbildung produziert, aber in der Theorie, wenn Sie es von einer Figure zu einer GMapPlot es sollte Arbeit ändern. Ich konnte nicht direkt mit GMapPlots arbeiten. Ich denke, das könnte an der Github-Ausgabe 3737 liegen. Ich kann das Austin-Beispiel nicht einmal aus den Bokeh-Dokumenten herausführen.

Hoffentlich ist das, was Sie

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)) 
+0

im Sinn hatte Haben Sie etwas dagegen zusammen einige Beispiel-Code setzen? Kürzlich hatte ich Erfolg mit Dingen wie Slider-Tools und so in Bokeh, aber das ist, weil die Bokeh-Plot-Objekte ein Datenquellattribut haben, das ich beim Rückruf aktualisiere, und ich kann nicht herausfinden, wie man etwas Ähnliches mit den GMapPlot-Linien macht , wie Bokeh Linien vs GMapPlot Linien sind leicht verschiedene Objekte mit unterschiedlichen Attributen, wenn das Sinn macht. – Drinkwater32