GeolocationΒΆ

This example creates a map that displays the location determined by the value of the user inputted longtitude and latitude. It shows the ability to easily integrate dash_building_blocks with raw dash code.

import dash
from dash.dependencies import Input, Output, State
import dash_html_components as html
import dash_core_components as dcc
import dash_building_blocks as dbb
import json


class Map(dbb.Block):

    def layout(self):
        return dcc.Graph(
            figure=dict(data=[], layout={}),
            id=self.register('map')
        )

    def callbacks(self, input_location):

        @self.app.callback(
            self.output('map', 'figure'),
            [input_location]
        )
        def update_map(location):

            location = json.loads(location)
            lon = location['longitude']
            lat  = location['latitude']

            data = [dict(
                type = 'scattergeo',
                lon = [lon],
                lat = [lat],
                text = 'Here!',
                mode = 'markers',
                marker = dict(
                    size = 8,
                    opacity = 0.8,
                    symbol = 'x',
                    line = dict(
                        width=1,
                        color='rgba(102, 102, 102)'
                    ),
                    color = 'red',
                )
            )]

            layout = dict(title='World Map')

            return dict(data=data, layout=layout)


app = dash.Dash()
app.config.suppress_callback_exceptions = True

map = Map(app)

coords = ['longitude', 'latitude']

input_layout = html.Div(
    [
        html.Div([html.Div(coord), dcc.Input(id=coord, type='text')])
        for coord in coords
    ] + [
        html.Button('Submit', id='submit-button')
    ]
)

store = dbb.Store(app)

@store.register(
    'form',
    inputs=[Input('submit-button', 'n_clicks')],
    state=[State(coord, 'value') for coord in coords]
)
def update_form(n_clicks, lon, lat):
    return json.dumps({
        'longitude': lon,
        'latitude': lat
    })

layout = html.Div(
    children=[map.layout, input_layout, store.layout]
)

app.layout = layout

map.callbacks(store.input('form'))

if __name__ == '__main__':
    app.run_server()