giswqs commited on
Commit
57803e8
·
1 Parent(s): 9d76428

Add interactive selection

Browse files
Files changed (2) hide show
  1. pages/01_morocco.py +51 -15
  2. 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=get_catalogs(dataset.value),
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='Show footprints',
59
  style=style,
60
- layout=widgets.Layout(width="130px", padding=padding),
61
  )
62
 
63
  split = widgets.Checkbox(
64
  value=False,
65
  description='Split map',
66
  style=style,
67
- layout=widgets.Layout(width="130px", padding=padding),
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
- event_control = ipyleaflet.WidgetControl(widget=dataset, position='topright')
123
- image_control = ipyleaflet.WidgetControl(widget=image, position='topright')
124
- checkboxes = widgets.HBox([checkbox, split])
125
- checkbox_control = ipyleaflet.WidgetControl(widget=checkboxes, position='topright')
 
 
 
 
 
 
 
 
 
 
 
 
126
 
127
- m.add(event_control)
128
- m.add(image_control)
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=get_catalogs(dataset.value),
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='Show footprints',
59
  style=style,
60
- layout=widgets.Layout(width="130px", padding=padding),
61
  )
62
 
63
  split = widgets.Checkbox(
64
  value=False,
65
  description='Split map',
66
  style=style,
67
- layout=widgets.Layout(width="130px", padding=padding),
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
- event_control = ipyleaflet.WidgetControl(widget=dataset, position='topright')
123
- image_control = ipyleaflet.WidgetControl(widget=image, position='topright')
124
- checkboxes = widgets.HBox([checkbox, split])
125
- checkbox_control = ipyleaflet.WidgetControl(widget=checkboxes, position='topright')
 
 
 
 
 
 
 
 
 
 
 
 
126
 
127
- m.add(event_control)
128
- m.add(image_control)
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