Vertdure commited on
Commit
1f10f5c
‱
1 Parent(s): 5abcc84

Update pages/12_đŸŒČ_VertXtractor.py

Browse files
Files changed (1) hide show
  1. pages/12_đŸŒČ_VertXtractor.py +30 -78
pages/12_đŸŒČ_VertXtractor.py CHANGED
@@ -6,10 +6,6 @@ from folium.plugins import Draw
6
  import requests
7
  from shapely.geometry import box
8
  import json
9
- import io
10
- import rasterio
11
- from rasterio.io import MemoryFile
12
- import numpy as np
13
 
14
  st.set_page_config(layout="wide", page_title="Extracteur de donnĂ©es gĂ©ospatiales")
15
 
@@ -42,76 +38,34 @@ def create_geojson_from_box(bbox):
42
  return json.loads(gdf.to_json()), json.loads(gdf.to_crs("EPSG:2056").to_json())
43
 
44
  @st.cache_data
45
- def extract_swisstopo_data(bbox, layer_id, layer_type):
46
- api_url = f"https://data.geo.admin.ch/api/stac/v0.9/collections/{layer_id}/items"
47
- params = {"bbox": ",".join(map(str, bbox)), "limit": 1}
48
- try:
49
  response = requests.get(api_url, params=params)
50
- response.raise_for_status()
51
  data = response.json()
52
  if data['features']:
53
  feature = data['features'][0]
54
  asset_keys = feature['assets'].keys()
55
  data_key = 'rgb' if 'rgb' in asset_keys else 'data' if 'data' in asset_keys else next(iter(asset_keys))
56
- data_url = feature['assets'][data_key]['href']
57
- return requests.get(data_url).content
58
- except requests.RequestException as e:
59
- st.error(f"Erreur Swisstopo: {str(e)}")
 
 
 
 
 
 
 
 
 
60
  return None
61
 
62
- @st.cache_data
63
- def extract_esri_data(bbox, layer_id, layer_type):
64
- service_url = f"https://services.arcgisonline.com/arcgis/rest/services/{layer_id}/MapServer/export"
65
- params = {
66
- "bbox": f"{bbox[0]},{bbox[1]},{bbox[2]},{bbox[3]}",
67
- "bboxSR": 4326,
68
- "size": "1000,1000",
69
- "format": "tiff",
70
- "f": "image"
71
- }
72
- try:
73
- response = requests.get(service_url, params=params)
74
- response.raise_for_status()
75
- return response.content
76
- except requests.RequestException as e:
77
- st.error(f"Erreur ESRI: {str(e)}")
78
- return None
79
-
80
- def process_and_display_data(data, layer_name, layer_type):
81
- if data is None:
82
- st.warning(f"Pas de données pour {layer_name}")
83
- return
84
- try:
85
- with MemoryFile(data) as memfile:
86
- with memfile.open() as src:
87
- image = src.read()
88
- if image.shape[0] == 3:
89
- image = np.transpose(image, (1, 2, 0))
90
- elif image.shape[0] == 1:
91
- image = image[0]
92
-
93
- st.image(image, caption=layer_name, use_column_width=True)
94
-
95
- output = io.BytesIO()
96
- with MemoryFile(output) as memfile:
97
- with memfile.open(**src.profile) as dst:
98
- dst.write(src.read())
99
-
100
- st.download_button(
101
- label=f"Télécharger {layer_name} (GeoTIFF)",
102
- data=output.getvalue(),
103
- file_name=f"{layer_name.lower().replace(' ', '_')}.tif",
104
- mime="image/tiff"
105
- )
106
- except Exception as e:
107
- st.error(f"Erreur de traitement pour {layer_name}: {str(e)}")
108
-
109
  def main():
110
  st.title("Extracteur de donnĂ©es Swisstopo et ESRI")
111
 
112
- if 'selected_layers' not in st.session_state:
113
- st.session_state.selected_layers = set()
114
-
115
  col1, col2 = st.columns([1, 3])
116
 
117
  with col1:
@@ -120,11 +74,7 @@ def main():
120
 
121
  layers = SWISSTOPO_LAYERS if source == "Swisstopo" else ESRI_LAYERS
122
 
123
- for layer_name in layers:
124
- if st.checkbox(layer_name, value=layer_name in st.session_state.selected_layers):
125
- st.session_state.selected_layers.add(layer_name)
126
- else:
127
- st.session_state.selected_layers.discard(layer_name)
128
 
129
  st.markdown("---")
130
  st.markdown("## À propos\nExtracteur de donnĂ©es gĂ©ospatiales Swisstopo et ESRI.\nDĂ©veloppĂ© par Vertdure")
@@ -157,20 +107,22 @@ def main():
157
  st.session_state['geojson_swiss'] = json.loads(gdf.to_crs(2056).to_json())
158
  st.success("GeoJSON chargĂ©!")
159
 
160
- if st.button("Extraire les données"):
161
  if 'geojson_wgs84' not in st.session_state or 'geojson_swiss' not in st.session_state:
162
  st.error("DĂ©finissez d'abord une zone d'intĂ©rĂȘt.")
163
- elif not st.session_state.selected_layers:
164
  st.error("SĂ©lectionnez au moins une couche Ă  extraire.")
165
  else:
166
- with st.spinner("Extraction des données en cours..."):
167
- for layer_name in st.session_state.selected_layers:
168
- layer_info = SWISSTOPO_LAYERS.get(layer_name) or ESRI_LAYERS.get(layer_name)
169
- bbox = gpd.GeoDataFrame.from_features(st.session_state['geojson_swiss' if layer_info["source"] == "swisstopo" else 'geojson_wgs84']).total_bounds
170
- st.info(f"Traitement de la couche : {layer_name}")
171
- data = extract_swisstopo_data(bbox, layer_info["id"], layer_info["type"]) if layer_info["source"] == "swisstopo" else extract_esri_data(bbox, layer_info["id"], layer_info["type"])
172
- process_and_display_data(data, layer_name, layer_info["type"])
173
- st.success("Extraction terminée !")
 
 
174
 
175
  if __name__ == "__main__":
176
  main()
 
6
  import requests
7
  from shapely.geometry import box
8
  import json
 
 
 
 
9
 
10
  st.set_page_config(layout="wide", page_title="Extracteur de donnĂ©es gĂ©ospatiales")
11
 
 
38
  return json.loads(gdf.to_json()), json.loads(gdf.to_crs("EPSG:2056").to_json())
39
 
40
  @st.cache_data
41
+ def get_download_url(bbox, layer_info):
42
+ if layer_info["source"] == "swisstopo":
43
+ api_url = f"https://data.geo.admin.ch/api/stac/v0.9/collections/{layer_info['id']}/items"
44
+ params = {"bbox": ",".join(map(str, bbox)), "limit": 1}
45
  response = requests.get(api_url, params=params)
 
46
  data = response.json()
47
  if data['features']:
48
  feature = data['features'][0]
49
  asset_keys = feature['assets'].keys()
50
  data_key = 'rgb' if 'rgb' in asset_keys else 'data' if 'data' in asset_keys else next(iter(asset_keys))
51
+ return feature['assets'][data_key]['href']
52
+ else: # ESRI
53
+ service_url = f"https://services.arcgisonline.com/arcgis/rest/services/{layer_info['id']}/MapServer/export"
54
+ params = {
55
+ "bbox": f"{bbox[0]},{bbox[1]},{bbox[2]},{bbox[3]}",
56
+ "bboxSR": 4326,
57
+ "size": "1000,1000",
58
+ "format": "png",
59
+ "f": "html",
60
+ "imageSR": 4326,
61
+ "transparent": "true"
62
+ }
63
+ return f"{service_url}?{'&'.join([f'{k}={v}' for k, v in params.items()])}"
64
  return None
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  def main():
67
  st.title("Extracteur de donnĂ©es Swisstopo et ESRI")
68
 
 
 
 
69
  col1, col2 = st.columns([1, 3])
70
 
71
  with col1:
 
74
 
75
  layers = SWISSTOPO_LAYERS if source == "Swisstopo" else ESRI_LAYERS
76
 
77
+ selected_layers = st.multiselect("Couches Ă  extraire", list(layers.keys()))
 
 
 
 
78
 
79
  st.markdown("---")
80
  st.markdown("## À propos\nExtracteur de donnĂ©es gĂ©ospatiales Swisstopo et ESRI.\nDĂ©veloppĂ© par Vertdure")
 
107
  st.session_state['geojson_swiss'] = json.loads(gdf.to_crs(2056).to_json())
108
  st.success("GeoJSON chargĂ©!")
109
 
110
+ if st.button("Obtenir les liens de téléchargement"):
111
  if 'geojson_wgs84' not in st.session_state or 'geojson_swiss' not in st.session_state:
112
  st.error("DĂ©finissez d'abord une zone d'intĂ©rĂȘt.")
113
+ elif not selected_layers:
114
  st.error("SĂ©lectionnez au moins une couche Ă  extraire.")
115
  else:
116
+ for layer_name in selected_layers:
117
+ layer_info = layers[layer_name]
118
+ bbox = gpd.GeoDataFrame.from_features(st.session_state['geojson_swiss' if layer_info["source"] == "swisstopo" else 'geojson_wgs84']).total_bounds
119
+ st.write(f"Traitement de la couche : {layer_name}")
120
+ st.write(f"Bbox : {bbox}")
121
+ download_url = get_download_url(bbox, layer_info)
122
+ if download_url:
123
+ st.markdown(f"[Télécharger {layer_name}]({download_url})")
124
+ else:
125
+ st.error(f"Impossible d'obtenir le lien pour {layer_name}")
126
 
127
  if __name__ == "__main__":
128
  main()