Vertdure commited on
Commit
195f57b
1 Parent(s): 16af22d

Update pages/12_🌲_VertXtractor.py

Browse files
Files changed (1) hide show
  1. 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
- # Configuration de la page
15
- st.set_page_config(layout="wide", page_title="Extracteur de données géospatiales")
16
 
17
- # Définition des couches disponibles
18
- LAYERS = {
19
- "Swisstopo - SWISSIMAGE 10 cm": {"id": "ch.swisstopo.swissimage-dop10", "source": "swisstopo", "type": "image"},
20
- "Swisstopo - Carte nationale 1:25'000": {"id": "ch.swisstopo.pixelkarte-farbe-pk25.noscale", "source": "swisstopo", "type": "image"},
21
- "Swisstopo - MNT": {"id": "ch.swisstopo.swissalti3d", "source": "swisstopo", "type": "raster"},
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
- response = requests.get(api_url, params=params)
45
- response.raise_for_status()
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
- data_url = feature['assets'][data_key]['href']
52
- return requests.get(data_url).content
53
- except requests.RequestException as e:
54
- st.error(f"Erreur Swisstopo: {str(e)}")
55
- return None
 
 
 
 
 
 
 
 
 
 
 
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
- def process_and_display_data(data, layer_name, layer_type):
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 le sélecteur de couches
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
- process_and_display_data(data, layer_name, layer_info["type"])
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__":