Update pages/12_🌲_VertXtractor.py
Browse files- pages/12_🌲_VertXtractor.py +38 -75
pages/12_🌲_VertXtractor.py
CHANGED
@@ -10,49 +10,39 @@ import io
|
|
10 |
import rasterio
|
11 |
from rasterio.io import MemoryFile
|
12 |
import numpy as np
|
|
|
13 |
|
14 |
-
#
|
15 |
-
st.set_page_config(layout="wide", page_title="Extracteur de données géospatiales")
|
16 |
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
"ESRI - World Imagery": {"id": "WorldImagery", "source": "esri", "type": "image"},
|
23 |
-
"ESRI - World Elevation": {"id": "WorldElevation", "source": "esri", "type": "raster"}
|
24 |
-
}
|
25 |
-
|
26 |
-
def draw_box_on_map():
|
27 |
-
"""Crée une carte interactive pour dessiner une zone d'intérêt."""
|
28 |
-
m = folium.Map(location=[46.8, 8.2], zoom_start=8)
|
29 |
-
Draw(draw_options={'polyline': False, 'polygon': False, 'circle': False, 'marker': False, 'circlemarker': False},
|
30 |
-
edit_options={'edit': False}).add_to(m)
|
31 |
-
return st_folium(m, width=700, height=500)
|
32 |
-
|
33 |
-
def create_geojson_from_box(bbox):
|
34 |
-
"""Crée un GeoJSON à partir d'une boîte englobante."""
|
35 |
-
gdf = gpd.GeoDataFrame({'geometry': [bbox]}, crs="EPSG:4326")
|
36 |
-
return json.loads(gdf.to_json()), json.loads(gdf.to_crs("EPSG:2056").to_json())
|
37 |
-
|
38 |
-
@st.cache_data
|
39 |
-
def extract_swisstopo_data(bbox, layer_id, layer_type):
|
40 |
-
"""Extrait les données de Swisstopo."""
|
41 |
-
api_url = f"https://data.geo.admin.ch/api/stac/v0.9/collections/{layer_id}/items"
|
42 |
-
params = {"bbox": ",".join(map(str, bbox)), "limit": 1}
|
43 |
try:
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
|
57 |
@st.cache_data
|
58 |
def extract_esri_data(bbox, layer_id, layer_type):
|
@@ -63,7 +53,8 @@ def extract_esri_data(bbox, layer_id, layer_type):
|
|
63 |
"bboxSR": 4326,
|
64 |
"size": "1000,1000",
|
65 |
"format": "tiff",
|
66 |
-
"f": "image"
|
|
|
67 |
}
|
68 |
try:
|
69 |
response = requests.get(service_url, params=params)
|
@@ -73,47 +64,19 @@ def extract_esri_data(bbox, layer_id, layer_type):
|
|
73 |
st.error(f"Erreur ESRI: {str(e)}")
|
74 |
return None
|
75 |
|
76 |
-
|
77 |
-
"""Traite et affiche les données extraites."""
|
78 |
-
if data is None:
|
79 |
-
st.warning(f"Pas de données pour {layer_name}")
|
80 |
-
return
|
81 |
-
try:
|
82 |
-
with MemoryFile(data) as memfile:
|
83 |
-
with memfile.open() as src:
|
84 |
-
image = src.read()
|
85 |
-
if image.shape[0] == 3:
|
86 |
-
image = np.transpose(image, (1, 2, 0))
|
87 |
-
elif image.shape[0] == 1:
|
88 |
-
image = image[0]
|
89 |
-
|
90 |
-
st.image(image, caption=layer_name, use_column_width=True)
|
91 |
-
|
92 |
-
output = io.BytesIO()
|
93 |
-
with MemoryFile(output) as memfile:
|
94 |
-
with memfile.open(**src.profile) as dst:
|
95 |
-
dst.write(src.read())
|
96 |
-
|
97 |
-
st.download_button(
|
98 |
-
label=f"Télécharger {layer_name} (GeoTIFF)",
|
99 |
-
data=output.getvalue(),
|
100 |
-
file_name=f"{layer_name.lower().replace(' ', '_')}.tif",
|
101 |
-
mime="image/tiff"
|
102 |
-
)
|
103 |
-
except Exception as e:
|
104 |
-
st.error(f"Erreur de traitement pour {layer_name}: {str(e)}")
|
105 |
|
106 |
def main():
|
107 |
st.title("Extracteur de données Swisstopo et ESRI")
|
108 |
|
|
|
|
|
|
|
109 |
# Création de deux colonnes
|
110 |
col1, col2 = st.columns([1, 3])
|
111 |
|
112 |
-
# Colonne de gauche pour
|
113 |
with col1:
|
114 |
-
st.subheader("Sélection des couches")
|
115 |
-
selected_layers = st.multiselect("Couches à extraire", list(LAYERS.keys()))
|
116 |
-
|
117 |
st.markdown("---")
|
118 |
st.markdown("## À propos\nExtracteur de données géospatiales Swisstopo et ESRI.\nDéveloppé par Vertdure")
|
119 |
|
@@ -149,7 +112,7 @@ def main():
|
|
149 |
bbox = gpd.GeoDataFrame.from_features(st.session_state['geojson_swiss' if layer_info["source"] == "swisstopo" else 'geojson_wgs84']).total_bounds
|
150 |
st.info(f"Traitement de la couche : {layer_name}")
|
151 |
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"])
|
152 |
-
|
153 |
st.success("Extraction terminée !")
|
154 |
|
155 |
if __name__ == "__main__":
|
|
|
10 |
import rasterio
|
11 |
from rasterio.io import MemoryFile
|
12 |
import numpy as np
|
13 |
+
import os
|
14 |
|
15 |
+
# ... (le reste des imports et la définition de LAYERS restent inchangés)
|
|
|
16 |
|
17 |
+
def process_and_save_data(data, layer_name, layer_type):
|
18 |
+
"""Traite et sauvegarde les données extraites."""
|
19 |
+
if data is None:
|
20 |
+
st.warning(f"Pas de données pour {layer_name}")
|
21 |
+
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
try:
|
23 |
+
with MemoryFile(data) as memfile:
|
24 |
+
with memfile.open() as src:
|
25 |
+
# Créer un dossier pour sauvegarder les fichiers
|
26 |
+
output_folder = "extracted_data"
|
27 |
+
os.makedirs(output_folder, exist_ok=True)
|
28 |
+
|
29 |
+
# Nom du fichier de sortie
|
30 |
+
output_filename = os.path.join(output_folder, f"{layer_name.lower().replace(' ', '_')}.tif")
|
31 |
+
|
32 |
+
# Écrire les données dans un nouveau fichier GeoTIFF
|
33 |
+
profile = src.profile
|
34 |
+
if layer_type == "image" and src.count == 4: # Pour les images RGBA
|
35 |
+
profile.update(count=3) # On ne garde que les 3 premières bandes (RGB)
|
36 |
+
|
37 |
+
with rasterio.open(output_filename, 'w', **profile) as dst:
|
38 |
+
if layer_type == "image" and src.count == 4:
|
39 |
+
dst.write(src.read()[0:3, :, :]) # Écrire seulement les bandes RGB
|
40 |
+
else:
|
41 |
+
dst.write(src.read())
|
42 |
+
|
43 |
+
st.success(f"Données sauvegardées : {output_filename}")
|
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):
|
|
|
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)
|
|
|
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 |
|
72 |
+
# Sélecteur de couches
|
73 |
+
selected_layers = st.multiselect("Couches à extraire", list(LAYERS.keys()))
|
74 |
+
|
75 |
# Création de deux colonnes
|
76 |
col1, col2 = st.columns([1, 3])
|
77 |
|
78 |
+
# Colonne de gauche pour les informations
|
79 |
with col1:
|
|
|
|
|
|
|
80 |
st.markdown("---")
|
81 |
st.markdown("## À propos\nExtracteur de données géospatiales Swisstopo et ESRI.\nDéveloppé par Vertdure")
|
82 |
|
|
|
112 |
bbox = gpd.GeoDataFrame.from_features(st.session_state['geojson_swiss' if layer_info["source"] == "swisstopo" else 'geojson_wgs84']).total_bounds
|
113 |
st.info(f"Traitement de la couche : {layer_name}")
|
114 |
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"])
|
115 |
+
process_and_save_data(data, layer_name, layer_info["type"])
|
116 |
st.success("Extraction terminée !")
|
117 |
|
118 |
if __name__ == "__main__":
|