2016-06-01 1 views
2

Я очень программист из nooby, и это мой первый вопрос о переполнении стека. :)Анимация GMapPlot w/Python/Bokeh

Итак, я пытаюсь анимировать поездку автомобиля на Google Maps с помощью Python. Сначала я использовал matplotlib и мог получить точку, анимированную по линии пути ... тогда я попытался использовать bokeh и успешно получил путь к наложению на карты Google ...

Моя проблема в том, что я не нашел хороший способ сделать и то и другое (анимационный сюжет по картам Google).

Мои данные представлены в виде координат Lat/Long.

Любые советы? Заранее спасибо!

EDIT: Вот мой код, который делает gmapplot ... Я бы предпочел иметь это и без анимации, чем анимация без GMAP. Моя цель - оживить эту «автомобильную» точку.

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) 

ответ

0

Это может быть не совсем то, что вы ищете, но у вас может быть виджет слайдера, который контролирует положение вашей точки автомобиля. Пример слайдера, найденный в документах bokeh (или репозиторий github, я не помню) помог мне, когда начал использовать слайдеры.

Просто, чтобы вы знали, у меня были проблемы с точками latlng, появляющимися в правильных местах. Существует около 10 пикселей смещения. Это открытый вопрос (github issue 2964).

Следующий код в настоящее время только производит общий боке рисунок, но в теории, если вы измените его от Figure к GMapPlot он должен работать. Мне не удалось напрямую работать с GMapPlots. Я думаю, что это может быть из-за проблемы github 3737. Я даже не могу запустить пример Austin из документации bokeh.

Надеюсь, это то, что вы имели в виду

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

Вы не возражаете воедино некоторые примеры кода? В последнее время я успешно использовал такие вещи, как инструменты слайдера и т. Д. В bokeh, однако, это потому, что объекты сюжета bokeh имеют атрибут источника данных, который я обновляю при обратном вызове, и я не могу понять, как сделать что-то подобное с линиями GMapPlot , как и линии боке против линий GMapPlot, представляют собой несколько разные объекты с разными атрибутами, если это имеет смысл. – Drinkwater32