giswqs commited on
Commit
c5ce07d
·
1 Parent(s): 1aa8b8c

Add Libya flooding web app

Browse files
Files changed (1) hide show
  1. pages/02_libya.py +153 -0
pages/02_libya.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import leafmap
3
+ import solara
4
+ import ipyleaflet
5
+ import ipywidgets as widgets
6
+ import pandas as pd
7
+
8
+ event = 'Libya-Floods-Sept-2023'
9
+ url = 'https://raw.githubusercontent.com/opengeos/maxar-open-data/master'
10
+ repo = 'https://github.com/opengeos/maxar-open-data/blob/master/datasets'
11
+
12
+ def get_datasets():
13
+ datasets = f'{url}/datasets.csv'
14
+ df = pd.read_csv(datasets)
15
+ return df
16
+
17
+
18
+ def get_catalogs(name):
19
+ dataset = f'{url}/datasets/{name}.tsv'
20
+ dataset_df = pd.read_csv(dataset, sep='\t')
21
+ catalog_ids = dataset_df['catalog_id'].unique().tolist()
22
+ catalog_ids.sort()
23
+ return catalog_ids
24
+
25
+
26
+ def add_widgets(m):
27
+ datasets = get_datasets()['dataset'].tolist()
28
+
29
+ style = {"description_width": "initial"}
30
+ padding = "0px 0px 0px 5px"
31
+ dataset = widgets.Dropdown(
32
+ options=datasets,
33
+ description='Event:',
34
+ value=event,
35
+ style=style,
36
+ layout=widgets.Layout(width="270px", padding=padding),
37
+ )
38
+
39
+ image = widgets.Dropdown(
40
+ value=None,
41
+ options=get_catalogs(dataset.value),
42
+ description='Image:',
43
+ style=style,
44
+ layout=widgets.Layout(width="270px", padding=padding),
45
+ )
46
+
47
+ checkbox = widgets.Checkbox(
48
+ value=True,
49
+ description='Show footprints',
50
+ style=style,
51
+ layout=widgets.Layout(width="130px", padding=padding),
52
+ )
53
+
54
+ split = widgets.Checkbox(
55
+ value=False,
56
+ description='Split map',
57
+ style=style,
58
+ layout=widgets.Layout(width="130px", padding=padding),
59
+ )
60
+
61
+ def change_dataset(change):
62
+ default_geojson = f'{url}/datasets/{change.new}.geojson'
63
+ m.layers = m.layers[:2]
64
+ m.controls = m.controls[:-1]
65
+ m.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
66
+ image.options = get_catalogs(change.new)
67
+
68
+ dataset.observe(change_dataset, names='value')
69
+
70
+ def change_image(change):
71
+ if change.new:
72
+ mosaic = f'{url}/datasets/{dataset.value}/{image.value}.json'
73
+ m.add_stac_layer(mosaic, name=image.value)
74
+
75
+ image.observe(change_image, names='value')
76
+
77
+ def change_footprint(change):
78
+ geojson_layer = m.find_layer('Footprint')
79
+ if change.new:
80
+ geojson_layer.visible = True
81
+ else:
82
+ geojson_layer.visible = False
83
+
84
+ checkbox.observe(change_footprint, names='value')
85
+
86
+ def change_split(change):
87
+ if change.new:
88
+ if image.value is not None:
89
+ left_layer = m.find_layer(image.value)
90
+ right_layer = m.find_layer('Google Satellite')
91
+ right_layer.visible = True
92
+ footprint_layer = m.find_layer('Footprint')
93
+ footprint_layer.visible = False
94
+ m.split_map(
95
+ left_layer=left_layer,
96
+ right_layer=right_layer,
97
+ add_close_button=True,
98
+ )
99
+ split.value = False
100
+ else:
101
+ left_layer = None
102
+
103
+ split.observe(change_split, names='value')
104
+
105
+ event_control = ipyleaflet.WidgetControl(widget=dataset, position='topright')
106
+ image_control = ipyleaflet.WidgetControl(widget=image, position='topright')
107
+ checkboxes = widgets.HBox([checkbox, split])
108
+ checkbox_control = ipyleaflet.WidgetControl(widget=checkboxes, position='topright')
109
+
110
+ m.add(event_control)
111
+ m.add(image_control)
112
+ m.add(checkbox_control)
113
+
114
+
115
+ zoom = solara.reactive(2)
116
+ center = solara.reactive((20, 0))
117
+
118
+
119
+ class Map(leafmap.Map):
120
+ def __init__(self, **kwargs):
121
+ kwargs['toolbar_control'] = False
122
+ super().__init__(**kwargs)
123
+ basemap = {
124
+ "url": "https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",
125
+ "attribution": "Google",
126
+ "name": "Google Satellite",
127
+ }
128
+ self.add_tile_layer(**basemap, shown=False)
129
+ self.add_layer_manager(opened=False)
130
+ add_widgets(self)
131
+ default_geojson = f'{url}/datasets/{event}.geojson'
132
+ self.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
133
+
134
+
135
+ @solara.component
136
+ def Page():
137
+ with solara.Column(style={"min-width": "500px"}):
138
+ # solara components support reactive variables
139
+ # solara.SliderInt(label="Zoom level", value=zoom, min=1, max=20)
140
+ # using 3rd party widget library require wiring up the events manually
141
+ # using zoom.value and zoom.set
142
+ Map.element( # type: ignore
143
+ zoom=zoom.value,
144
+ on_zoom=zoom.set,
145
+ center=center.value,
146
+ on_center=center.set,
147
+ scroll_wheel_zoom=True,
148
+ toolbar_ctrl=False,
149
+ data_ctrl=False,
150
+ height="780px",
151
+ )
152
+ solara.Text(f"Center: {center.value}")
153
+ solara.Text(f"Zoom: {zoom.value}")