|
1 | 1 | import ipyleaflet as L |
2 | | -from htmltools import css |
3 | | -from shiny import * |
| 2 | +from shiny import App, reactive, render, req, ui |
4 | 3 |
|
5 | | -from shinywidgets import output_widget, reactive_read, register_widget |
| 4 | +from shinywidgets import output_widget, reactive_read, render_widget |
6 | 5 |
|
7 | | -app_ui = ui.page_fillable( |
8 | | - ui.div( |
| 6 | +app_ui = ui.page_sidebar( |
| 7 | + ui.sidebar( |
9 | 8 | ui.input_slider("zoom", "Map zoom level", value=4, min=1, max=10), |
| 9 | + ), |
| 10 | + ui.card( |
10 | 11 | ui.output_text("map_bounds"), |
11 | | - style=css( |
12 | | - display="flex", justify_content="center", align_items="center", gap="2rem" |
13 | | - ), |
| 12 | + fill=False |
| 13 | + ), |
| 14 | + ui.card( |
| 15 | + output_widget("lmap") |
14 | 16 | ), |
15 | | - output_widget("map"), |
| 17 | + title="ipyleaflet demo" |
16 | 18 | ) |
17 | 19 |
|
18 | 20 |
|
19 | 21 | def server(input, output, session): |
20 | 22 |
|
21 | | - # Initialize and display when the session starts (1) |
22 | | - map = L.Map(center=(52, 360), zoom=4) |
23 | | - register_widget("map", map) |
| 23 | + @output |
| 24 | + @render_widget |
| 25 | + def lmap(): |
| 26 | + return L.Map(center=(52, 360), zoom=4) |
24 | 27 |
|
25 | 28 | # When the slider changes, update the map's zoom attribute (2) |
26 | 29 | @reactive.Effect |
27 | 30 | def _(): |
28 | | - map.zoom = input.zoom() |
| 31 | + lmap.widget.zoom = input.zoom() |
29 | 32 |
|
30 | 33 | # When zooming directly on the map, update the slider's value (2 and 3) |
31 | 34 | @reactive.Effect |
32 | 35 | def _(): |
33 | | - ui.update_slider("zoom", value=reactive_read(map, "zoom")) |
| 36 | + zoom = reactive_read(lmap.widget, "zoom") |
| 37 | + ui.update_slider("zoom", value=zoom) |
34 | 38 |
|
35 | 39 | # Everytime the map's bounds change, update the output message (3) |
36 | 40 | @output |
37 | 41 | @render.text |
38 | 42 | def map_bounds(): |
39 | | - b = reactive_read(map, "bounds") |
| 43 | + b = reactive_read(lmap.widget, "bounds") |
40 | 44 | req(b) |
41 | | - lat = [b[0][0], b[0][1]] |
42 | | - lon = [b[1][0], b[1][1]] |
43 | | - return f"The current latitude is {lat} and longitude is {lon}" |
| 45 | + lat = [round(x) for x in [b[0][0], b[0][1]]] |
| 46 | + lon = [round(x) for x in [b[1][0], b[1][1]]] |
| 47 | + return f"The map bounds is currently {lat} / {lon}" |
44 | 48 |
|
45 | 49 |
|
46 | 50 | app = App(app_ui, server) |
0 commit comments