import streamlit as st import rasterio import numpy as np import pyvista as pv from pyvistaqt import BackgroundPlotter import tempfile # Fonction pour charger un raster def load_raster(file_path): with rasterio.open(file_path) as src: raster = src.read(1) # Lecture de la première bande transform = src.transform # Transformation affine du raster return raster, transform # Fonction pour créer un modèle 3D def create_3d_model(raster, transform, vertical_exaggeration=1.0): rows, cols = raster.shape x = np.linspace(transform[2], transform[2] + transform[0] * cols, cols) y = np.linspace(transform[5], transform[5] + transform[4] * rows, rows) z = raster * vertical_exaggeration # Création des coordonnées xx, yy = np.meshgrid(x, y) xx = xx.flatten() yy = yy.flatten() zz = z.flatten() # Création de la grille structurée points = np.c_[xx, yy, zz] grid = pv.StructuredGrid() grid.points = points grid.dimensions = (cols, rows, 1) # Dimensions de la grille return grid # Streamlit App st.title("Maquette 3D à partir d'un Raster") uploaded_file = st.file_uploader("Téléchargez un fichier raster (MNT ou MES)", type=["tif"]) if uploaded_file: raster, transform = load_raster(uploaded_file) st.success("Raster chargé avec succès!") # Configuration utilisateur vertical_exaggeration = st.slider("Échelle verticale (exagération)", 0.1, 10.0, 1.0) # Création du modèle 3D st.subheader("Modèle 3D") grid = create_3d_model(raster, transform, vertical_exaggeration) # Visualisation avec PyVista plotter = pv.Plotter(off_screen=True) plotter.add_mesh(grid, scalars=raster.flatten(), cmap="terrain", show_edges=False) plotter.add_scalar_bar("Élévation (m)") plotter.view_isometric() screenshot_path = tempfile.NamedTemporaryFile(suffix=".png").name plotter.show(screenshot=screenshot_path) # Affichage dans Streamlit st.image(screenshot_path, caption="Modèle 3D", use_column_width=True) # Exportation du modèle st.subheader("Exportation du Modèle") export_format = st.selectbox("Format d'exportation", ["STL", "OBJ"]) if st.button("Exporter"): export_file = tempfile.NamedTemporaryFile(suffix=f".{export_format.lower()}", delete=False).name grid.save(export_file) st.success(f"Modèle exporté sous forme de fichier {export_format}.") st.download_button("Télécharger le fichier exporté", data=open(export_file, "rb").read(), file_name=f"model.{export_format.lower()}")