def create_layout(self): # create figure self.x_range = Range1d(start=self.model.map_extent[0], end=self.model.map_extent[2], bounds=None) self.y_range = Range1d(start=self.model.map_extent[1], end=self.model.map_extent[3], bounds=None) self.fig = Figure(tools='box_zoom,wheel_zoom,pan', x_range=self.x_range, y_range=self.y_range) self.fig.plot_height = 600 self.fig.plot_width = 1024 self.fig.axis.visible = True # add datashader layer self.image_source = ImageSource( url=self.model.service_url, extra_url_vars=self.model.shader_url_vars) self.image_renderer = DynamicImageRenderer( image_source=self.image_source) self.fig.renderers.append(self.image_renderer) # add ui components axes_select = Select.create(name='Plot:', options=self.model.axes) axes_select.on_change('value', self.on_axes_change) field_select = Select.create(name='Summary:', options=self.model.fields) field_select.on_change('value', self.on_field_change) aggregate_select = Select.create( name='Aggregation:', options=self.model.aggregate_functions) aggregate_select.on_change('value', self.on_aggregate_change) transfer_select = Select.create(name='Scale:', options=self.model.transfer_functions) transfer_select.on_change('value', self.on_transfer_function_change) controls = [ axes_select, field_select, aggregate_select, transfer_select ] self.controls = VBox(width=200, height=600, children=controls) self.map_area = VBox(width=self.fig.plot_width, children=[self.fig]) self.layout = HBox(width=self.fig.plot_width, children=[self.controls, self.map_area])
def update_image(self): self.model.shader_url_vars['cachebust'] = str(uuid.uuid4()) self.image_renderer.image_source = ImageSource( url=self.model.service_url, extra_url_vars=self.model.shader_url_vars)
def create_layout(self): # create figure self.x_range = Range1d(start=self.model.map_extent[0], end=self.model.map_extent[2], bounds=None) self.y_range = Range1d(start=self.model.map_extent[1], end=self.model.map_extent[3], bounds=None) self.fig = Figure(tools='wheel_zoom,pan', x_range=self.x_range, lod_threshold=None, plot_width=self.model.plot_width, plot_height=self.model.plot_height, background_fill_color='black', y_range=self.y_range) self.fig.min_border_top = 0 self.fig.min_border_bottom = 10 self.fig.min_border_left = 0 self.fig.min_border_right = 0 self.fig.axis.visible = False self.fig.xgrid.grid_line_color = None self.fig.ygrid.grid_line_color = None # add tiled basemap self.tile_source = WMTSTileSource(url=self.model.basemap) self.tile_renderer = TileRenderer(tile_source=self.tile_source) self.fig.renderers.append(self.tile_renderer) # add datashader layer self.image_source = ImageSource( url=self.model.service_url, extra_url_vars=self.model.shader_url_vars) self.image_renderer = DynamicImageRenderer( image_source=self.image_source) self.fig.renderers.append(self.image_renderer) # add label layer self.label_source = WMTSTileSource(url=self.model.labels_url) self.label_renderer = TileRenderer(tile_source=self.label_source) self.fig.renderers.append(self.label_renderer) # Add placeholder for legends (temporarily disabled) # self.model.legend_side_vbox = Column() # self.model.legend_bottom_vbox = Column() # add ui components controls = [] axes_select = Select(name='Axes', options=list(self.model.axes.keys())) axes_select.on_change('value', self.on_axes_change) controls.append(axes_select) self.field_select = Select(name='Field', options=list(self.model.fields.keys())) self.field_select.on_change('value', self.on_field_change) controls.append(self.field_select) self.aggregate_select = Select( name='Aggregate', options=list(self.model.aggregate_functions.keys())) self.aggregate_select.on_change('value', self.on_aggregate_change) controls.append(self.aggregate_select) transfer_select = Select(name='Transfer Function', options=list( self.model.transfer_functions.keys())) transfer_select.on_change('value', self.on_transfer_function_change) controls.append(transfer_select) color_ramp_select = Select(name='Color Ramp', options=list(self.model.color_ramps.keys())) color_ramp_select.on_change('value', self.on_color_ramp_change) controls.append(color_ramp_select) spread_size_slider = Slider(title="Spread Size (px)", value=0, start=0, end=10, step=1) spread_size_slider.on_change('value', self.on_spread_size_change) controls.append(spread_size_slider) # hover (temporarily disabled) #hover_size_slider = Slider(title="Hover Size (px)", value=8, start=4, # end=30, step=1) #hover_size_slider.on_change('value', self.on_hover_size_change) #controls.append(hover_size_slider) # legends (temporarily disabled) # controls.append(self.model.legend_side_vbox) # add map components basemap_select = Select(name='Basemap', value='Imagery', options=list(self.model.basemaps.keys())) basemap_select.on_change('value', self.on_basemap_change) image_opacity_slider = Slider(title="Opacity", value=100, start=0, end=100, step=1) image_opacity_slider.on_change('value', self.on_image_opacity_slider_change) basemap_opacity_slider = Slider(title="Basemap Opacity", value=100, start=0, end=100, step=1) basemap_opacity_slider.on_change('value', self.on_basemap_opacity_slider_change) show_labels_chk = CheckboxGroup(labels=["Show Labels"], active=[0]) show_labels_chk.on_click(self.on_labels_change) map_controls = [ basemap_select, basemap_opacity_slider, image_opacity_slider, show_labels_chk ] self.controls = Column(height=600, children=controls) self.map_controls = Row(width=self.fig.plot_width, children=map_controls) # legends (temporarily disabled) self.map_area = Column(width=900, height=600, children=[self.map_controls, self.fig]) self.layout = Row(width=1300, height=600, children=[self.controls, self.map_area]) self.model.fig = self.fig self.model.update_hover()
p.background_fill = "black" p.add_tools(WheelZoomTool(), PanTool()) # add base layer tile_options = {} tile_options['url'] = 'http://tile.stamen.com/toner/{Z}/{X}/{Y}.png' tile_source = WMTSTileSource(**tile_options) p.add_tile(tile_source) # add dynamic data layer # National Land Cover Dataset (http://www.mrlc.gov/nlcd2011.php) service_url = 'http://raster.nationalmap.gov/arcgis/rest/services/LandCover/USGS_EROS_LandCover_NLCD/MapServer/export?' service_url += 'bbox={XMIN},{YMIN},{XMAX},{YMAX}&bboxSR=102100&size={HEIGHT}%2C{WIDTH}&imageSR=102100&format=png32&transparent=true&f=image' image_source_options = {} image_source_options['url'] = service_url image_source = ImageSource(**image_source_options) p.add_dynamic_image(image_source) # create labels layer tile_label_options = {} tile_label_options[ 'url'] = 'http://tile.stamen.com/toner-labels/{Z}/{X}/{Y}.png' tile_label_source = WMTSTileSource(**tile_label_options) p.add_tile(tile_label_source, **dict(render_parents=True)) doc = Document() doc.add(p) if __name__ == "__main__": filename = "dynamic_map.html" with open(filename, "w") as f:
def update_image(self): self.model.shader_url_vars['cachebust'] = str(uuid.uuid4()) self.image_renderer.image_source = ImageSource(url=self.model.service_url, extra_url_vars=self.model.shader_url_vars) self.fig.xaxis.axis_label=self.model.active_axes['xtitle'] self.fig.yaxis.axis_label=self.model.active_axes['ytitle']
def create_layout(self): # create figure self.x_range = Range1d(start=self.model.map_extent[0], end=self.model.map_extent[2], bounds=None) self.y_range = Range1d(start=self.model.map_extent[3], end=self.model.map_extent[1], bounds=None) self.fig = Figure(tools='wheel_zoom,pan,save,box_zoom', title='Color Magnitude Diagram', x_range=self.x_range, y_range=self.y_range, lod_threshold=None, plot_width=self.model.plot_width, plot_height=self.model.plot_height, background_fill_color='white') # Labeling will be used to deal with the fact that we cannot get the axes right # this source can then be adjusted with sliders as necessary to reset axis. label_source = ColumnDataSource(data={'x': [-5,-5,-5,-5,-5], 'y': [-10-0.2,-5-0.2,0-0.2,5-0.2,10-0.2], 'text':['10','5','0','-5','-10']}) label1 = self.fig.text('x','y','text', source=label_source, text_font_size='8pt', text_color='deepskyblue') # edit all the usual bokeh figure properties here self.fig.xaxis.axis_label=self.model.xtitle self.fig.yaxis.axis_label=self.model.ytitle self.fig.yaxis.axis_label_text_font= 'PT Serif' self.fig.yaxis.major_label_text_font = 'PT Serif' self.fig.xaxis.axis_label_text_font= 'PT Serif' self.fig.xaxis.major_label_text_font = 'PT Serif' self.fig.min_border_top = 20 self.fig.min_border_bottom = 10 self.fig.min_border_left = 10 self.fig.min_border_right = 10 self.fig.axis.visible = False # use this to flip the axis labeling on and off self.fig.xgrid.grid_line_color = '#aaaaaa' self.fig.ygrid.grid_line_color = '#aaaaaa' self.fig.ygrid.grid_line_alpha = 0.1 self.fig.xgrid.grid_line_alpha = 0.1 # add tiled basemap to class AppView image_url = 'http://server.arcgisonline.com/arcgis//rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}.png' self.tile_source = WMTSTileSource(url=image_url) self.tile_renderer = TileRenderer(tile_source=self.tile_source) self.tile_renderer.alpha = 0.02 self.fig.renderers.append(self.tile_renderer) # comment this out and it takes the ds points with it! WHY? # add datashader layer - these are the aggregated data points to class AppView self.image_source = ImageSource(url=self.model.service_url, extra_url_vars=self.model.shader_url_vars) self.image_renderer = DynamicImageRenderer(image_source=self.image_source) self.image_renderer.alpha = 1.00 self.fig.renderers.append(self.image_renderer) # add controls controls = [] # empty list for astronomy controls visual_controls = [] # empty list for visual controls self.parameters = {} # empty dict for astrophyscal pars age_slider = Slider(title="Log Age [Gyr]", value=9.0, start=5.5, end=10.1, step=0.05) age_slider.on_change('value', self.on_age_change) controls.append(age_slider) self.parameters['age'] = age_slider.value aperture_size_slider = Slider(title="Aperture [m]", value=10, start=2,end=20, step=1) aperture_size_slider.on_change('value', self.on_aperture_size_change) controls.append(aperture_size_slider) self.parameters['aperture'] = aperture_size_slider.value exposure_time_slider = Slider(title="Exposure Time [hr]", value=0.1, start=1.0,end=10.0, step=0.1) exposure_time_slider.on_change('value', self.on_exposure_time_change) controls.append(exposure_time_slider) distance_slider = Slider(title="Distance [kpc]", value=100. , start=10.0,end=1000.0, step=100.) distance_slider.on_change('value', self.on_distance_change) controls.append(distance_slider) axes_select = Select(title='Variables', options=list(self.model.axes.keys())) axes_select.on_change('value', self.on_axes_change) controls.append(axes_select) self.field_select = Select(title='Field', options=list(self.model.fields.keys())) self.field_select.on_change('value', self.on_field_change) #controls.append(self.field_select) - chooses wich field to weight by in aggregation, temporarily omitted for devel self.aggregate_select = Select(title='Aggregate', options=list(self.model.aggregate_functions.keys())) self.aggregate_select.on_change('value', self.on_aggregate_change) controls.append(self.aggregate_select) spread_size_slider = Slider(title="Spread Size (px)", value=1, start=0,end=5, step=1) spread_size_slider.on_change('value', self.on_spread_size_change) visual_controls.append(spread_size_slider) image_opacity_slider = Slider(title="Opacity", value=100, start=0,end=100, step=1) image_opacity_slider.on_change('value', self.on_image_opacity_slider_change) visual_controls.append(image_opacity_slider) transfer_select = Select(title='Transfer Function', options=list(self.model.transfer_functions.keys())) transfer_select.on_change('value', self.on_transfer_function_change) visual_controls.append(transfer_select) color_ramp_select = Select(title='Colormap', name='Color Ramp', options=list(self.model.color_ramps.keys())) color_ramp_select.on_change('value', self.on_color_ramp_change) visual_controls.append(color_ramp_select) astro_tab = Panel(child=Column(children=controls), title='Stars') visual_tab = Panel(child=Column(children=visual_controls), title='Visuals', width=450) self.controls = Tabs(tabs=[astro_tab, visual_tab], width=350) self.map_area = Column(width=900, height=600,children=[self.fig]) self.layout = Row(width=1300, height=600,children=[self.controls, self.fig]) self.model.fig = self.fig # identify the fig defined here as the one that will be passed to AppView
from bokeh.plotting import figure, output_file, show from bokeh.tile_providers import STAMEN_TONER, STAMEN_TONER_LABELS title = 'Dynamic Map: National Land Cover Dataset' p = figure(tools='wheel_zoom,pan', title=title) p.x_range = Range1d(start=-15473429, end=2108550, bounds=None) p.y_range = Range1d(start=-6315661, end=7264686, bounds=None) p.background_fill_color = "black" p.axis.visible = False # National Land Cover Dataset (http://www.mrlc.gov/nlcd2011.php) service_url = ( "http://raster.nationalmap.gov/" "arcgis/rest/services/LandCover/USGS_EROS_LandCover_NLCD/MapServer/export" "?bbox={XMIN},{YMIN},{XMAX},{YMAX}" "&bboxSR=102100" "&size={HEIGHT}%2C{WIDTH}" "&imageSR=102100" "&format=png32" "&transparent=true" "&f=image") image_source = ImageSource(url=service_url) p.add_tile(STAMEN_TONER) p.add_dynamic_image(image_source) p.add_tile(STAMEN_TONER_LABELS, render_parents=False) output_file('dynamic_map.html') show(p)
def create_layout(self): # create figure self.x_range = Range1d(start=self.model.map_extent[0], end=self.model.map_extent[2], bounds=None) self.y_range = Range1d(start=self.model.map_extent[1], end=self.model.map_extent[3], bounds=None) self.fig = Figure(tools='wheel_zoom,pan', x_range=self.x_range, lod_threshold=None, plot_width=self.model.plot_width, plot_height=self.model.plot_height, y_range=self.y_range) self.fig.min_border_top = 0 self.fig.min_border_bottom = 10 self.fig.min_border_left = 0 self.fig.min_border_right = 0 self.fig.axis.visible = False self.fig.xgrid.grid_line_color = None self.fig.ygrid.grid_line_color = None # add tiled basemap self.tile_source = WMTSTileSource(url=self.model.basemap) self.tile_renderer = TileRenderer(tile_source=self.tile_source) self.fig.renderers.append(self.tile_renderer) # add datashader layer self.image_source = ImageSource( url=self.model.service_url, extra_url_vars=self.model.shader_url_vars) self.image_renderer = DynamicImageRenderer( image_source=self.image_source) self.fig.renderers.append(self.image_renderer) # add label layer self.label_source = WMTSTileSource(url=self.model.labels_url) self.label_renderer = TileRenderer(tile_source=self.label_source) self.fig.renderers.append(self.label_renderer) # Add a hover tool hover_layer = HoverLayer() hover_layer.field_name = self.model.field_title hover_layer.is_categorical = self.model.field in self.model.categorical_fields self.fig.renderers.append(hover_layer.renderer) self.fig.add_tools(hover_layer.tool) self.model.hover_layer = hover_layer self.model.legend_side_vbox = VBox() self.model.legend_bottom_vbox = VBox() # add ui components controls = [] axes_select = Select.create(name='Axes', options=self.model.axes) axes_select.on_change('value', self.on_axes_change) controls.append(axes_select) self.field_select = Select.create(name='Field', options=self.model.fields) self.field_select.on_change('value', self.on_field_change) controls.append(self.field_select) self.aggregate_select = Select.create( name='Aggregate', options=self.model.aggregate_functions) self.aggregate_select.on_change('value', self.on_aggregate_change) controls.append(self.aggregate_select) transfer_select = Select.create(name='Transfer Function', options=self.model.transfer_functions) transfer_select.on_change('value', self.on_transfer_function_change) controls.append(transfer_select) color_ramp_select = Select.create(name='Color Ramp', options=self.model.color_ramps) color_ramp_select.on_change('value', self.on_color_ramp_change) controls.append(color_ramp_select) spread_size_slider = Slider(title="Spread Size (px)", value=0, start=0, end=10, step=1) spread_size_slider.on_change('value', self.on_spread_size_change) controls.append(spread_size_slider) hover_size_slider = Slider(title="Hover Size (px)", value=8, start=4, end=30, step=1) hover_size_slider.on_change('value', self.on_hover_size_change) controls.append(hover_size_slider) controls.append(self.model.legend_side_vbox) # add map components basemap_select = Select.create(name='Basemap', value='Imagery', options=self.model.basemaps) basemap_select.on_change('value', self.on_basemap_change) image_opacity_slider = Slider(title="Opacity", value=100, start=0, end=100, step=1) image_opacity_slider.on_change('value', self.on_image_opacity_slider_change) basemap_opacity_slider = Slider(title="Basemap Opacity", value=100, start=0, end=100, step=1) basemap_opacity_slider.on_change('value', self.on_basemap_opacity_slider_change) show_labels_chk = CheckboxGroup(labels=["Show Labels"], active=[0]) show_labels_chk.on_click(self.on_labels_change) map_controls = [ basemap_select, basemap_opacity_slider, image_opacity_slider, show_labels_chk ] self.controls = VBox(width=200, height=600, children=controls) self.map_controls = HBox(width=self.fig.plot_width, children=map_controls) self.map_area = VBox(width=self.fig.plot_width, children=[ self.map_controls, self.fig, self.model.legend_bottom_vbox ]) self.layout = HBox(width=1366, children=[self.controls, self.map_area])
def update_image(self): self.image_renderer.image_source = ImageSource( url=self.model.service_url, extra_url_vars=self.model.shader_url_vars)
def create_layout(self): # create figure self.x_range = Range1d(start=self.model.map_extent[0], end=self.model.map_extent[2], bounds=None) self.y_range = Range1d(start=self.model.map_extent[1], end=self.model.map_extent[3], bounds=None) self.fig = Figure(tools='wheel_zoom,pan', x_range=self.x_range, y_range=self.y_range) self.fig.plot_height = 560 self.fig.plot_width = 800 self.fig.axis.visible = False # add tiled basemap self.tile_source = WMTSTileSource(url=self.model.basemap) self.tile_renderer = TileRenderer(tile_source=self.tile_source) self.fig.renderers.append(self.tile_renderer) # add datashader layer self.image_source = ImageSource( url=self.model.service_url, extra_url_vars=self.model.shader_url_vars) self.image_renderer = DynamicImageRenderer( image_source=self.image_source) self.fig.renderers.append(self.image_renderer) # add label layer self.label_source = WMTSTileSource(url=self.model.labels_url) self.label_renderer = TileRenderer(tile_source=self.label_source) self.fig.renderers.append(self.label_renderer) # add ui components axes_select = Select.create(name='Axes', options=self.model.axes) axes_select.on_change('value', self.on_axes_change) field_select = Select.create(name='Field', options=self.model.fields) field_select.on_change('value', self.on_field_change) aggregate_select = Select.create( name='Aggregate', options=self.model.aggregate_functions) aggregate_select.on_change('value', self.on_aggregate_change) transfer_select = Select.create(name='Transfer Function', options=self.model.transfer_functions) transfer_select.on_change('value', self.on_transfer_function_change) basemap_select = Select.create(name='Basemap', value='Toner', options=self.model.basemaps) basemap_select.on_change('value', self.on_basemap_change) image_opacity_slider = Slider(title="Opacity", value=100, start=0, end=100, step=1) image_opacity_slider.on_change('value', self.on_image_opacity_slider_change) basemap_opacity_slider = Slider(title="Basemap Opacity", value=100, start=0, end=100, step=1) basemap_opacity_slider.on_change('value', self.on_basemap_opacity_slider_change) show_labels_chk = CheckboxGroup(labels=["Show Labels"], active=[0]) show_labels_chk.on_click(self.on_labels_change) controls = [ axes_select, field_select, aggregate_select, transfer_select ] map_controls = [ basemap_select, basemap_opacity_slider, image_opacity_slider, show_labels_chk ] self.controls = VBox(width=200, height=600, children=controls) self.map_controls = HBox(width=self.fig.plot_width, children=map_controls) self.map_area = VBox(width=self.fig.plot_width, children=[self.map_controls, self.fig]) self.layout = HBox(width=1024, children=[self.controls, self.map_area])