Update pages/12_đČ_VertXtractor.py
Browse files- 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
|
46 |
-
|
47 |
-
|
48 |
-
|
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 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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("
|
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
|
164 |
st.error("SĂ©lectionnez au moins une couche Ă extraire.")
|
165 |
else:
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
|
|
|
|
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()
|