簡體   English   中英

使用Python / Bokeh動畫GMapPlot

[英]Animate GMapPlot w/ Python/Bokeh

我是一個非常高興的程序員,這是我的第一個Stack Overflow問題。 :)

因此,我正試圖使用​​Python在谷歌地圖上制作汽車之旅。 我最初使用matplotlib並且可以在路徑線上獲得一個動畫點...然后我嘗試使用散景並成功獲得在谷歌地圖上疊加的路徑...

我的問題是我沒有找到一個很好的方法來做兩個(谷歌地圖上的動畫情節)。

我的數據采用Lat / Long坐標的形式。

有什么建議? 提前致謝!

編輯:這是我的代碼,它做了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)

這可能不是您正在尋找的,但您可以使用滑塊小部件來控制汽車點的位置。 當我開始使用滑塊時,散景文檔(或github存儲庫,我記不起來)中的滑塊示例幫助了我。

正如您所知,我遇到的問題是在正確的位置出現了latlng積分。 大約有10px的偏移量。 這是一個懸而未決的問題(github issue 2964)。

下面的代碼目前只是生成一個通用的散景圖,但從理論上講,如果你將它從一個Figure改為一個GMapPlot應該可以工作。 我無法直接使用GMapPlots。 我想這可能是因為github問題3737.我甚至無法從散景文檔中運行Austin示例。

希望這是你的想法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM