#!/usr/bin/env python # coding: utf-8 # In[1]: import bokeh from bokeh.plotting import figure, output_notebook, show from bokeh.models.renderers import TileRenderer from bokeh.tile_providers import STAMEN_TONER from bokeh.models import Range1d # In[2]: bokeh.__version__ # In[3]: output_notebook() # In[8]: 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 = [-15000000, 15000000] 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, min_border_top=0, min_border_left=0, min_border_right=0, min_border_bottom=0) p.axis.visible = False p.renderers.append(SnappingTileRenderer(tile_source=STAMEN_TONER)) return p # In[7]: p = create_plot() show(p) # In[ ]: # In[ ]: