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