Spaces:
Running
Running
Add interactive selection
Browse files- pages/01_morocco.py +51 -15
- pages/02_libya.py +51 -15
pages/01_morocco.py
CHANGED
@@ -1,15 +1,17 @@
|
|
1 |
import os
|
2 |
import leafmap
|
3 |
import solara
|
4 |
-
import ipyleaflet
|
5 |
import ipywidgets as widgets
|
6 |
import pandas as pd
|
|
|
7 |
import tempfile
|
|
|
8 |
|
9 |
event = 'Morocco-Earthquake-Sept-2023'
|
10 |
url = 'https://raw.githubusercontent.com/opengeos/maxar-open-data/master'
|
11 |
repo = 'https://github.com/opengeos/maxar-open-data/blob/master/datasets'
|
12 |
|
|
|
13 |
def get_datasets():
|
14 |
datasets = f'{url}/datasets.csv'
|
15 |
df = pd.read_csv(datasets)
|
@@ -17,7 +19,6 @@ def get_datasets():
|
|
17 |
|
18 |
|
19 |
def get_catalogs(name):
|
20 |
-
|
21 |
dataset = f'{url}/datasets/{name}.tsv'
|
22 |
basename = os.path.basename(dataset)
|
23 |
tempdir = tempfile.gettempdir()
|
@@ -34,7 +35,7 @@ def get_catalogs(name):
|
|
34 |
|
35 |
def add_widgets(m):
|
36 |
datasets = get_datasets()['dataset'].tolist()
|
37 |
-
|
38 |
style = {"description_width": "initial"}
|
39 |
padding = "0px 0px 0px 5px"
|
40 |
dataset = widgets.Dropdown(
|
@@ -45,9 +46,12 @@ def add_widgets(m):
|
|
45 |
layout=widgets.Layout(width="270px", padding=padding),
|
46 |
)
|
47 |
|
|
|
|
|
|
|
48 |
image = widgets.Dropdown(
|
49 |
value=None,
|
50 |
-
options=
|
51 |
description='Image:',
|
52 |
style=style,
|
53 |
layout=widgets.Layout(width="270px", padding=padding),
|
@@ -55,18 +59,35 @@ def add_widgets(m):
|
|
55 |
|
56 |
checkbox = widgets.Checkbox(
|
57 |
value=True,
|
58 |
-
description='
|
59 |
style=style,
|
60 |
-
layout=widgets.Layout(width="
|
61 |
)
|
62 |
|
63 |
split = widgets.Checkbox(
|
64 |
value=False,
|
65 |
description='Split map',
|
66 |
style=style,
|
67 |
-
layout=widgets.Layout(width="
|
68 |
)
|
69 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
def change_dataset(change):
|
71 |
default_geojson = f'{url}/datasets/{change.new}_union.geojson'
|
72 |
m.layers = m.layers[:2]
|
@@ -79,6 +100,7 @@ def add_widgets(m):
|
|
79 |
else:
|
80 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
81 |
m.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
|
|
82 |
|
83 |
image.options = get_catalogs(change.new)
|
84 |
|
@@ -87,7 +109,7 @@ def add_widgets(m):
|
|
87 |
def change_image(change):
|
88 |
if change.new:
|
89 |
mosaic = f'{url}/datasets/{dataset.value}/{image.value}.json'
|
90 |
-
m.add_stac_layer(mosaic, name=image.value)
|
91 |
|
92 |
image.observe(change_image, names='value')
|
93 |
|
@@ -112,6 +134,8 @@ def add_widgets(m):
|
|
112 |
left_layer=left_layer,
|
113 |
right_layer=right_layer,
|
114 |
add_close_button=True,
|
|
|
|
|
115 |
)
|
116 |
split.value = False
|
117 |
else:
|
@@ -119,14 +143,25 @@ def add_widgets(m):
|
|
119 |
|
120 |
split.observe(change_split, names='value')
|
121 |
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
126 |
|
127 |
-
|
128 |
-
m.
|
129 |
-
m.add(checkbox_control)
|
130 |
|
131 |
|
132 |
zoom = solara.reactive(2)
|
@@ -154,6 +189,7 @@ class Map(leafmap.Map):
|
|
154 |
else:
|
155 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
156 |
self.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
|
|
157 |
|
158 |
|
159 |
@solara.component
|
|
|
1 |
import os
|
2 |
import leafmap
|
3 |
import solara
|
|
|
4 |
import ipywidgets as widgets
|
5 |
import pandas as pd
|
6 |
+
import geopandas as gpd
|
7 |
import tempfile
|
8 |
+
from shapely.geometry import Point
|
9 |
|
10 |
event = 'Morocco-Earthquake-Sept-2023'
|
11 |
url = 'https://raw.githubusercontent.com/opengeos/maxar-open-data/master'
|
12 |
repo = 'https://github.com/opengeos/maxar-open-data/blob/master/datasets'
|
13 |
|
14 |
+
|
15 |
def get_datasets():
|
16 |
datasets = f'{url}/datasets.csv'
|
17 |
df = pd.read_csv(datasets)
|
|
|
19 |
|
20 |
|
21 |
def get_catalogs(name):
|
|
|
22 |
dataset = f'{url}/datasets/{name}.tsv'
|
23 |
basename = os.path.basename(dataset)
|
24 |
tempdir = tempfile.gettempdir()
|
|
|
35 |
|
36 |
def add_widgets(m):
|
37 |
datasets = get_datasets()['dataset'].tolist()
|
38 |
+
setattr(m, 'zoom_to_layer', True)
|
39 |
style = {"description_width": "initial"}
|
40 |
padding = "0px 0px 0px 5px"
|
41 |
dataset = widgets.Dropdown(
|
|
|
46 |
layout=widgets.Layout(width="270px", padding=padding),
|
47 |
)
|
48 |
|
49 |
+
catalog_ids = get_catalogs(dataset.value)
|
50 |
+
setattr(m, 'catalog_ids', catalog_ids)
|
51 |
+
|
52 |
image = widgets.Dropdown(
|
53 |
value=None,
|
54 |
+
options=m.catalog_ids,
|
55 |
description='Image:',
|
56 |
style=style,
|
57 |
layout=widgets.Layout(width="270px", padding=padding),
|
|
|
59 |
|
60 |
checkbox = widgets.Checkbox(
|
61 |
value=True,
|
62 |
+
description='Footprints',
|
63 |
style=style,
|
64 |
+
layout=widgets.Layout(width="90px", padding="0px"),
|
65 |
)
|
66 |
|
67 |
split = widgets.Checkbox(
|
68 |
value=False,
|
69 |
description='Split map',
|
70 |
style=style,
|
71 |
+
layout=widgets.Layout(width="92px", padding=padding),
|
72 |
)
|
73 |
|
74 |
+
reset = widgets.Checkbox(
|
75 |
+
value=False,
|
76 |
+
description='Reset',
|
77 |
+
style=style,
|
78 |
+
layout=widgets.Layout(width="75px", padding='0px'),
|
79 |
+
)
|
80 |
+
|
81 |
+
def reset_map(change):
|
82 |
+
if change.new:
|
83 |
+
image.value = None
|
84 |
+
image.options = m.catalog_ids
|
85 |
+
m.layers = m.layers[:3]
|
86 |
+
m.zoom_to_layer = True
|
87 |
+
reset.value = False
|
88 |
+
|
89 |
+
reset.observe(reset_map, names='value')
|
90 |
+
|
91 |
def change_dataset(change):
|
92 |
default_geojson = f'{url}/datasets/{change.new}_union.geojson'
|
93 |
m.layers = m.layers[:2]
|
|
|
100 |
else:
|
101 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
102 |
m.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
103 |
+
setattr(m, 'gdf', gpd.read_file(default_geojson))
|
104 |
|
105 |
image.options = get_catalogs(change.new)
|
106 |
|
|
|
109 |
def change_image(change):
|
110 |
if change.new:
|
111 |
mosaic = f'{url}/datasets/{dataset.value}/{image.value}.json'
|
112 |
+
m.add_stac_layer(mosaic, name=image.value, fit_bounds=m.zoom_to_layer)
|
113 |
|
114 |
image.observe(change_image, names='value')
|
115 |
|
|
|
134 |
left_layer=left_layer,
|
135 |
right_layer=right_layer,
|
136 |
add_close_button=True,
|
137 |
+
left_label=image.value,
|
138 |
+
right_label='Google Satellite',
|
139 |
)
|
140 |
split.value = False
|
141 |
else:
|
|
|
143 |
|
144 |
split.observe(change_split, names='value')
|
145 |
|
146 |
+
def handle_click(**kwargs):
|
147 |
+
if kwargs.get('type') == 'click':
|
148 |
+
latlon = kwargs.get('coordinates')
|
149 |
+
geometry = Point(latlon[::-1])
|
150 |
+
selected = m.gdf[m.gdf.intersects(geometry)]
|
151 |
+
setattr(m, 'zoom_to_layer', False)
|
152 |
+
if len(selected) > 0:
|
153 |
+
catalog_ids = selected['catalog_id'].values.tolist()
|
154 |
+
|
155 |
+
if len(catalog_ids) > 1:
|
156 |
+
image.options = catalog_ids
|
157 |
+
image.value = catalog_ids[0]
|
158 |
+
else:
|
159 |
+
image.value = None
|
160 |
+
|
161 |
+
m.on_interaction(handle_click)
|
162 |
|
163 |
+
box = widgets.VBox([dataset, image, widgets.HBox([checkbox, split, reset])])
|
164 |
+
m.add_widget(box, position='topright', add_header=False)
|
|
|
165 |
|
166 |
|
167 |
zoom = solara.reactive(2)
|
|
|
189 |
else:
|
190 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
191 |
self.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
192 |
+
setattr(self, 'gdf', gpd.read_file(default_geojson))
|
193 |
|
194 |
|
195 |
@solara.component
|
pages/02_libya.py
CHANGED
@@ -1,15 +1,17 @@
|
|
1 |
import os
|
2 |
import leafmap
|
3 |
import solara
|
4 |
-
import ipyleaflet
|
5 |
import ipywidgets as widgets
|
6 |
import pandas as pd
|
|
|
7 |
import tempfile
|
|
|
8 |
|
9 |
event = 'Libya-Floods-Sept-2023'
|
10 |
url = 'https://raw.githubusercontent.com/opengeos/maxar-open-data/master'
|
11 |
repo = 'https://github.com/opengeos/maxar-open-data/blob/master/datasets'
|
12 |
|
|
|
13 |
def get_datasets():
|
14 |
datasets = f'{url}/datasets.csv'
|
15 |
df = pd.read_csv(datasets)
|
@@ -17,7 +19,6 @@ def get_datasets():
|
|
17 |
|
18 |
|
19 |
def get_catalogs(name):
|
20 |
-
|
21 |
dataset = f'{url}/datasets/{name}.tsv'
|
22 |
basename = os.path.basename(dataset)
|
23 |
tempdir = tempfile.gettempdir()
|
@@ -34,7 +35,7 @@ def get_catalogs(name):
|
|
34 |
|
35 |
def add_widgets(m):
|
36 |
datasets = get_datasets()['dataset'].tolist()
|
37 |
-
|
38 |
style = {"description_width": "initial"}
|
39 |
padding = "0px 0px 0px 5px"
|
40 |
dataset = widgets.Dropdown(
|
@@ -45,9 +46,12 @@ def add_widgets(m):
|
|
45 |
layout=widgets.Layout(width="270px", padding=padding),
|
46 |
)
|
47 |
|
|
|
|
|
|
|
48 |
image = widgets.Dropdown(
|
49 |
value=None,
|
50 |
-
options=
|
51 |
description='Image:',
|
52 |
style=style,
|
53 |
layout=widgets.Layout(width="270px", padding=padding),
|
@@ -55,18 +59,35 @@ def add_widgets(m):
|
|
55 |
|
56 |
checkbox = widgets.Checkbox(
|
57 |
value=True,
|
58 |
-
description='
|
59 |
style=style,
|
60 |
-
layout=widgets.Layout(width="
|
61 |
)
|
62 |
|
63 |
split = widgets.Checkbox(
|
64 |
value=False,
|
65 |
description='Split map',
|
66 |
style=style,
|
67 |
-
layout=widgets.Layout(width="
|
68 |
)
|
69 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
def change_dataset(change):
|
71 |
default_geojson = f'{url}/datasets/{change.new}_union.geojson'
|
72 |
m.layers = m.layers[:2]
|
@@ -79,6 +100,7 @@ def add_widgets(m):
|
|
79 |
else:
|
80 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
81 |
m.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
|
|
82 |
|
83 |
image.options = get_catalogs(change.new)
|
84 |
|
@@ -87,7 +109,7 @@ def add_widgets(m):
|
|
87 |
def change_image(change):
|
88 |
if change.new:
|
89 |
mosaic = f'{url}/datasets/{dataset.value}/{image.value}.json'
|
90 |
-
m.add_stac_layer(mosaic, name=image.value)
|
91 |
|
92 |
image.observe(change_image, names='value')
|
93 |
|
@@ -112,6 +134,8 @@ def add_widgets(m):
|
|
112 |
left_layer=left_layer,
|
113 |
right_layer=right_layer,
|
114 |
add_close_button=True,
|
|
|
|
|
115 |
)
|
116 |
split.value = False
|
117 |
else:
|
@@ -119,14 +143,25 @@ def add_widgets(m):
|
|
119 |
|
120 |
split.observe(change_split, names='value')
|
121 |
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
126 |
|
127 |
-
|
128 |
-
m.
|
129 |
-
m.add(checkbox_control)
|
130 |
|
131 |
|
132 |
zoom = solara.reactive(2)
|
@@ -154,6 +189,7 @@ class Map(leafmap.Map):
|
|
154 |
else:
|
155 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
156 |
self.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
|
|
157 |
|
158 |
|
159 |
@solara.component
|
|
|
1 |
import os
|
2 |
import leafmap
|
3 |
import solara
|
|
|
4 |
import ipywidgets as widgets
|
5 |
import pandas as pd
|
6 |
+
import geopandas as gpd
|
7 |
import tempfile
|
8 |
+
from shapely.geometry import Point
|
9 |
|
10 |
event = 'Libya-Floods-Sept-2023'
|
11 |
url = 'https://raw.githubusercontent.com/opengeos/maxar-open-data/master'
|
12 |
repo = 'https://github.com/opengeos/maxar-open-data/blob/master/datasets'
|
13 |
|
14 |
+
|
15 |
def get_datasets():
|
16 |
datasets = f'{url}/datasets.csv'
|
17 |
df = pd.read_csv(datasets)
|
|
|
19 |
|
20 |
|
21 |
def get_catalogs(name):
|
|
|
22 |
dataset = f'{url}/datasets/{name}.tsv'
|
23 |
basename = os.path.basename(dataset)
|
24 |
tempdir = tempfile.gettempdir()
|
|
|
35 |
|
36 |
def add_widgets(m):
|
37 |
datasets = get_datasets()['dataset'].tolist()
|
38 |
+
setattr(m, 'zoom_to_layer', True)
|
39 |
style = {"description_width": "initial"}
|
40 |
padding = "0px 0px 0px 5px"
|
41 |
dataset = widgets.Dropdown(
|
|
|
46 |
layout=widgets.Layout(width="270px", padding=padding),
|
47 |
)
|
48 |
|
49 |
+
catalog_ids = get_catalogs(dataset.value)
|
50 |
+
setattr(m, 'catalog_ids', catalog_ids)
|
51 |
+
|
52 |
image = widgets.Dropdown(
|
53 |
value=None,
|
54 |
+
options=m.catalog_ids,
|
55 |
description='Image:',
|
56 |
style=style,
|
57 |
layout=widgets.Layout(width="270px", padding=padding),
|
|
|
59 |
|
60 |
checkbox = widgets.Checkbox(
|
61 |
value=True,
|
62 |
+
description='Footprints',
|
63 |
style=style,
|
64 |
+
layout=widgets.Layout(width="90px", padding="0px"),
|
65 |
)
|
66 |
|
67 |
split = widgets.Checkbox(
|
68 |
value=False,
|
69 |
description='Split map',
|
70 |
style=style,
|
71 |
+
layout=widgets.Layout(width="92px", padding=padding),
|
72 |
)
|
73 |
|
74 |
+
reset = widgets.Checkbox(
|
75 |
+
value=False,
|
76 |
+
description='Reset',
|
77 |
+
style=style,
|
78 |
+
layout=widgets.Layout(width="75px", padding='0px'),
|
79 |
+
)
|
80 |
+
|
81 |
+
def reset_map(change):
|
82 |
+
if change.new:
|
83 |
+
image.value = None
|
84 |
+
image.options = m.catalog_ids
|
85 |
+
m.layers = m.layers[:3]
|
86 |
+
m.zoom_to_layer = True
|
87 |
+
reset.value = False
|
88 |
+
|
89 |
+
reset.observe(reset_map, names='value')
|
90 |
+
|
91 |
def change_dataset(change):
|
92 |
default_geojson = f'{url}/datasets/{change.new}_union.geojson'
|
93 |
m.layers = m.layers[:2]
|
|
|
100 |
else:
|
101 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
102 |
m.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
103 |
+
setattr(m, 'gdf', gpd.read_file(default_geojson))
|
104 |
|
105 |
image.options = get_catalogs(change.new)
|
106 |
|
|
|
109 |
def change_image(change):
|
110 |
if change.new:
|
111 |
mosaic = f'{url}/datasets/{dataset.value}/{image.value}.json'
|
112 |
+
m.add_stac_layer(mosaic, name=image.value, fit_bounds=m.zoom_to_layer)
|
113 |
|
114 |
image.observe(change_image, names='value')
|
115 |
|
|
|
134 |
left_layer=left_layer,
|
135 |
right_layer=right_layer,
|
136 |
add_close_button=True,
|
137 |
+
left_label=image.value,
|
138 |
+
right_label='Google Satellite',
|
139 |
)
|
140 |
split.value = False
|
141 |
else:
|
|
|
143 |
|
144 |
split.observe(change_split, names='value')
|
145 |
|
146 |
+
def handle_click(**kwargs):
|
147 |
+
if kwargs.get('type') == 'click':
|
148 |
+
latlon = kwargs.get('coordinates')
|
149 |
+
geometry = Point(latlon[::-1])
|
150 |
+
selected = m.gdf[m.gdf.intersects(geometry)]
|
151 |
+
setattr(m, 'zoom_to_layer', False)
|
152 |
+
if len(selected) > 0:
|
153 |
+
catalog_ids = selected['catalog_id'].values.tolist()
|
154 |
+
|
155 |
+
if len(catalog_ids) > 1:
|
156 |
+
image.options = catalog_ids
|
157 |
+
image.value = catalog_ids[0]
|
158 |
+
else:
|
159 |
+
image.value = None
|
160 |
+
|
161 |
+
m.on_interaction(handle_click)
|
162 |
|
163 |
+
box = widgets.VBox([dataset, image, widgets.HBox([checkbox, split, reset])])
|
164 |
+
m.add_widget(box, position='topright', add_header=False)
|
|
|
165 |
|
166 |
|
167 |
zoom = solara.reactive(2)
|
|
|
189 |
else:
|
190 |
leafmap.download_file(default_geojson, tmp_geojson, quiet=True)
|
191 |
self.add_geojson(default_geojson, layer_name='Footprint', zoom_to_layer=True)
|
192 |
+
setattr(self, 'gdf', gpd.read_file(default_geojson))
|
193 |
|
194 |
|
195 |
@solara.component
|