Skip to content

Instantly share code, notes, and snippets.

@RutgerK
Forked from brendancol/snap_tiles_example.py
Last active December 31, 2015 22:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RutgerK/7e6801767aa9ad50b212 to your computer and use it in GitHub Desktop.
Save RutgerK/7e6801767aa9ad50b212 to your computer and use it in GitHub Desktop.
Snapping Tile Renderer User Defined Model
from bokeh.plotting import figure, output_file, show
from bokeh.models.renderers import TileRenderer
from bokeh.tile_providers import STAMEN_TONER
from bokeh.models import Range1d
output_file('snap_tiles.html')
class SnappingTileRenderer(TileRenderer):
__implementation__ = """
_ = require "underscore"
$ = require "jquery"
Util = require "util/util"
TileRenderer = require "renderer/tile/tile_renderer"
class SnappingTileRendererView extends TileRenderer.View
type: "SnappingTileRendererView"
_set_data: () ->
super
@plot_view.$el.dblclick(@on_double_click)
on_double_click: (e) =>
extent = @get_extent()
[xmin, ymin, xmax, ymax] = extent
x_percent = .5
y_percent = .5
zoom_level = @mget('tile_source').get_closest_level_by_extent(extent, @map_frame.get('height'), @map_frame.get('width'))
old_resolution = @mget('tile_source').get_resolution(zoom_level)
center_x = xmin + (e.offsetX * old_resolution)
center_y = ymax - (e.offsetY * old_resolution)
if e.shiftKey
zoom_level = zoom_level - 1
else
zoom_level = zoom_level + 1
new_resolution = @mget('tile_source').get_resolution(zoom_level)
new_xrange = new_resolution * @map_frame.get('width')
new_yrange = new_resolution * @map_frame.get('height')
nxmin = center_x - (x_percent * new_xrange)
nymin = center_y - (y_percent * new_yrange)
nxmax = nxmin + new_xrange
nymax = nymin + new_yrange
new_extent = @mget('tile_source').snap_to_zoom([nxmin, nymin, nxmax, nymax], @map_frame.get('height'), @map_frame.get('width'), zoom_level)
@x_range.set('start', new_extent[0])
@y_range.set('start', new_extent[1])
@x_range.set('end', new_extent[2])
@y_range.set('end', new_extent[3])
class SnappingTileRenderer extends TileRenderer.Model
default_view: SnappingTileRendererView
type: 'SnappingTileRenderer'
module.exports =
Model: SnappingTileRenderer
View: SnappingTileRendererView
"""
def create_plot():
axis_range = [-20000000, 20000000]
x_range = Range1d(*axis_range)
y_range = Range1d(*axis_range)
p = figure(tools='pan,wheel_zoom', x_range=x_range, y_range=y_range, plot_height=800, plot_width=800)
p.axis.visible = False
p.renderers.append(SnappingTileRenderer(tile_source=STAMEN_TONER))
return p
p = create_plot()
show(p)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment