Update pages/12_🌲_VertXtractor.py
Browse files- pages/12_🌲_VertXtractor.py +62 -23
pages/12_🌲_VertXtractor.py
CHANGED
@@ -12,7 +12,68 @@ from rasterio.io import MemoryFile
|
|
12 |
import numpy as np
|
13 |
import os
|
14 |
|
15 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
def process_and_save_data(data, layer_name, layer_type):
|
18 |
"""Traite et sauvegarde les données extraites."""
|
@@ -44,28 +105,6 @@ def process_and_save_data(data, layer_name, layer_type):
|
|
44 |
except Exception as e:
|
45 |
st.error(f"Erreur de traitement pour {layer_name}: {str(e)}")
|
46 |
|
47 |
-
@st.cache_data
|
48 |
-
def extract_esri_data(bbox, layer_id, layer_type):
|
49 |
-
"""Extrait les données d'ESRI."""
|
50 |
-
service_url = "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/export" if layer_type == "image" else "https://elevation.arcgis.com/arcgis/rest/services/WorldElevation/Terrain/ImageServer/exportImage"
|
51 |
-
params = {
|
52 |
-
"bbox": f"{bbox[0]},{bbox[1]},{bbox[2]},{bbox[3]}",
|
53 |
-
"bboxSR": 4326,
|
54 |
-
"size": "1000,1000",
|
55 |
-
"format": "tiff",
|
56 |
-
"f": "image",
|
57 |
-
"imageSR": 4326 # Ajout de cette ligne pour spécifier le système de coordonnées de l'image
|
58 |
-
}
|
59 |
-
try:
|
60 |
-
response = requests.get(service_url, params=params)
|
61 |
-
response.raise_for_status()
|
62 |
-
return response.content
|
63 |
-
except requests.RequestException as e:
|
64 |
-
st.error(f"Erreur ESRI: {str(e)}")
|
65 |
-
return None
|
66 |
-
|
67 |
-
# ... (le reste du code reste inchangé jusqu'à la fonction main())
|
68 |
-
|
69 |
def main():
|
70 |
st.title("Extracteur de données Swisstopo et ESRI")
|
71 |
|
|
|
12 |
import numpy as np
|
13 |
import os
|
14 |
|
15 |
+
# Configuration de la page
|
16 |
+
st.set_page_config(layout="wide", page_title="Extracteur de données géospatiales")
|
17 |
+
|
18 |
+
# Définition des couches disponibles
|
19 |
+
LAYERS = {
|
20 |
+
"Swisstopo - SWISSIMAGE 10 cm": {"id": "ch.swisstopo.swissimage-dop10", "source": "swisstopo", "type": "image"},
|
21 |
+
"Swisstopo - Carte nationale 1:25'000": {"id": "ch.swisstopo.pixelkarte-farbe-pk25.noscale", "source": "swisstopo", "type": "image"},
|
22 |
+
"Swisstopo - MNT": {"id": "ch.swisstopo.swissalti3d", "source": "swisstopo", "type": "raster"},
|
23 |
+
"ESRI - World Imagery": {"id": "WorldImagery", "source": "esri", "type": "image"},
|
24 |
+
"ESRI - World Elevation": {"id": "WorldElevation", "source": "esri", "type": "raster"}
|
25 |
+
}
|
26 |
+
|
27 |
+
def draw_box_on_map():
|
28 |
+
"""Crée une carte interactive pour dessiner une zone d'intérêt."""
|
29 |
+
m = folium.Map(location=[46.8, 8.2], zoom_start=8)
|
30 |
+
Draw(draw_options={'polyline': False, 'polygon': False, 'circle': False, 'marker': False, 'circlemarker': False},
|
31 |
+
edit_options={'edit': False}).add_to(m)
|
32 |
+
return st_folium(m, width=700, height=500)
|
33 |
+
|
34 |
+
def create_geojson_from_box(bbox):
|
35 |
+
"""Crée un GeoJSON à partir d'une boîte englobante."""
|
36 |
+
gdf = gpd.GeoDataFrame({'geometry': [bbox]}, crs="EPSG:4326")
|
37 |
+
return json.loads(gdf.to_json()), json.loads(gdf.to_crs("EPSG:2056").to_json())
|
38 |
+
|
39 |
+
@st.cache_data
|
40 |
+
def extract_swisstopo_data(bbox, layer_id, layer_type):
|
41 |
+
"""Extrait les données de Swisstopo."""
|
42 |
+
api_url = f"https://data.geo.admin.ch/api/stac/v0.9/collections/{layer_id}/items"
|
43 |
+
params = {"bbox": ",".join(map(str, bbox)), "limit": 1}
|
44 |
+
try:
|
45 |
+
response = requests.get(api_url, params=params)
|
46 |
+
response.raise_for_status()
|
47 |
+
data = response.json()
|
48 |
+
if data['features']:
|
49 |
+
feature = data['features'][0]
|
50 |
+
asset_keys = feature['assets'].keys()
|
51 |
+
data_key = 'rgb' if 'rgb' in asset_keys else 'data' if 'data' in asset_keys else next(iter(asset_keys))
|
52 |
+
data_url = feature['assets'][data_key]['href']
|
53 |
+
return requests.get(data_url).content
|
54 |
+
except requests.RequestException as e:
|
55 |
+
st.error(f"Erreur Swisstopo: {str(e)}")
|
56 |
+
return None
|
57 |
+
|
58 |
+
@st.cache_data
|
59 |
+
def extract_esri_data(bbox, layer_id, layer_type):
|
60 |
+
"""Extrait les données d'ESRI."""
|
61 |
+
service_url = "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/export" if layer_type == "image" else "https://elevation.arcgis.com/arcgis/rest/services/WorldElevation/Terrain/ImageServer/exportImage"
|
62 |
+
params = {
|
63 |
+
"bbox": f"{bbox[0]},{bbox[1]},{bbox[2]},{bbox[3]}",
|
64 |
+
"bboxSR": 4326,
|
65 |
+
"size": "1000,1000",
|
66 |
+
"format": "tiff",
|
67 |
+
"f": "image",
|
68 |
+
"imageSR": 4326
|
69 |
+
}
|
70 |
+
try:
|
71 |
+
response = requests.get(service_url, params=params)
|
72 |
+
response.raise_for_status()
|
73 |
+
return response.content
|
74 |
+
except requests.RequestException as e:
|
75 |
+
st.error(f"Erreur ESRI: {str(e)}")
|
76 |
+
return None
|
77 |
|
78 |
def process_and_save_data(data, layer_name, layer_type):
|
79 |
"""Traite et sauvegarde les données extraites."""
|
|
|
105 |
except Exception as e:
|
106 |
st.error(f"Erreur de traitement pour {layer_name}: {str(e)}")
|
107 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
108 |
def main():
|
109 |
st.title("Extracteur de données Swisstopo et ESRI")
|
110 |
|