Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Standard Library
- from functools import partial
- import os
- # Third Party
- from bokeh.document import without_document_lock
- from bokeh.models import GMapPlot, GMapOptions, DataRange1d, ColumnDataSource, Circle, PanTool, WheelZoomTool, BoxSelectTool
- from bokeh.plotting import curdoc
- from concurrent.futures import ThreadPoolExecutor
- from tornado import gen
- # gps update orchestrator
- @gen.coroutine
- @without_document_lock
- def gps_update():
- data = yield executor.submit(get_gps_points)
- doc.add_next_tick_callback(partial(update_gps_plots, data))
- def get_gps_points():
- return {'lat': [32.921, 32.932], 'lon': [-97.06, -97.07]}
- @gen.coroutine
- def update_gps_plots(data):
- source.stream(data)
- def get_48_states():
- return GMapPlot(plot_width=900,
- plot_height=375,
- x_range=DataRange1d(),
- y_range=DataRange1d(),
- map_options=GMapOptions(lat=38.50, lng=-96.35, map_type="roadmap", zoom=4),
- api_key=api_key,
- webgl=True)
- #init
- doc = curdoc()
- executor = ThreadPoolExecutor(max_workers=10)
- source = ColumnDataSource(data=dict(lat=[], lon=[]))
- # api key for google
- api_key = "api_key"
- # get a map
- map = get_48_states()
- # init circles
- circle = Circle(x="lon", y="lat", size=15, fill_color="blue", fill_alpha=0.8, line_color=None)
- # add circles based on source
- map.add_glyph(source, circle)
- # add tools
- map.add_tools(PanTool(), WheelZoomTool(), BoxSelectTool())
- # map to doc
- doc.add_root(map)
- # add callback
- doc.add_periodic_callback(gps_update, 1000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement