Vertdure commited on
Commit
71cfbc3
•
1 Parent(s): 847f6a2

Update pages/5_đź“Ť_VertXtractor.py

Browse files
Files changed (1) hide show
  1. pages/5_đź“Ť_VertXtractor.py +110 -4
pages/5_đź“Ť_VertXtractor.py CHANGED
@@ -40,8 +40,22 @@ def load_swiss_dem(bbox):
40
  data = response.json()
41
 
42
  if 'features' in data and data['features']:
43
- asset_url = data['features'][0].get('assets', {}).get('data', {}).get('href')
44
- if asset_url:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  response = requests.get(asset_url)
46
  response.raise_for_status()
47
  with MemoryFile(response.content) as memfile:
@@ -50,7 +64,7 @@ def load_swiss_dem(bbox):
50
  transform = dataset.transform
51
  return dem, transform
52
  else:
53
- st.error("URL de l'asset non trouvée dans la réponse")
54
  else:
55
  st.error("Aucune donnĂ©e trouvĂ©e dans la rĂ©ponse de l'API")
56
  except requests.RequestException as e:
@@ -62,7 +76,99 @@ def load_swiss_dem(bbox):
62
 
63
  return None, None
64
 
65
- # Les autres fonctions restent inchangées...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
  def main():
68
  st.title("Mesh Tiler CH - Streamlit Edition")
 
40
  data = response.json()
41
 
42
  if 'features' in data and data['features']:
43
+ feature = data['features'][0]
44
+ assets = feature.get('assets', {})
45
+
46
+ # Chercher le fichier GeoTIFF avec la meilleure résolution
47
+ tiff_asset = None
48
+ best_resolution = float('inf')
49
+ for asset_name, asset_info in assets.items():
50
+ if asset_info['type'].startswith('image/tiff'):
51
+ resolution = float(asset_info.get('eo', float('inf')))
52
+ if resolution < best_resolution:
53
+ best_resolution = resolution
54
+ tiff_asset = asset_info
55
+
56
+ if tiff_asset:
57
+ asset_url = tiff_asset['href']
58
+ st.write(f"URL de l'asset sélectionné : {asset_url}")
59
  response = requests.get(asset_url)
60
  response.raise_for_status()
61
  with MemoryFile(response.content) as memfile:
 
64
  transform = dataset.transform
65
  return dem, transform
66
  else:
67
+ st.error("Aucun fichier GeoTIFF trouvé dans les assets")
68
  else:
69
  st.error("Aucune donnĂ©e trouvĂ©e dans la rĂ©ponse de l'API")
70
  except requests.RequestException as e:
 
76
 
77
  return None, None
78
 
79
+ def extract_dem_region(dem, transform, bbox):
80
+ """
81
+ Extrait une région spécifique du MNT basée sur une boîte englobante.
82
+ """
83
+ minx, miny, maxx, maxy = bbox
84
+ rows, cols = rasterio.transform.rowcol(transform, [minx, maxx], [miny, maxy])
85
+ window = ((min(rows), max(rows)), (min(cols), max(cols)))
86
+ dem_region = dem[window[0][0]:window[0][1], window[1][0]:window[1][1]]
87
+ new_transform = rasterio.transform.from_bounds(minx, miny, maxx, maxy,
88
+ dem_region.shape[1], dem_region.shape[0])
89
+ return dem_region, new_transform
90
+
91
+ def check_invalid_values(dem):
92
+ invalid_values = []
93
+ if np.any(np.isnan(dem)):
94
+ invalid_values.append('Le DEM contient des valeurs NaN.')
95
+ if np.any(np.isinf(dem)):
96
+ invalid_values.append('Le DEM contient des valeurs infinies.')
97
+ return invalid_values
98
+
99
+ def create_mesh(dem, transform, resolution):
100
+ """
101
+ Crée un maillage 3D à partir des données du MNT.
102
+ """
103
+ try:
104
+ height, width = dem.shape
105
+ if height < 3 or width < 3:
106
+ raise ValueError('Le MNT est trop petit pour créer un maillage.')
107
+
108
+ invalid_values = check_invalid_values(dem)
109
+ if invalid_values:
110
+ raise ValueError('\n'.join(invalid_values))
111
+
112
+ x, y = np.meshgrid(np.arange(width), np.arange(height))
113
+ lon, lat = rasterio.transform.xy(transform, y, x)
114
+
115
+ vertices = np.column_stack((lon.flatten(), lat.flatten(), dem.flatten()))
116
+ faces = []
117
+ for i in range(height - 1):
118
+ for j in range(width - 1):
119
+ idx = i * width + j
120
+ faces.append([idx, idx + 1, idx + width])
121
+ faces.append([idx + 1, idx + width + 1, idx + width])
122
+
123
+ mesh = trimesh.Trimesh(vertices=vertices, faces=faces)
124
+
125
+ target_faces = (height * width) // (resolution ** 2)
126
+ mesh = mesh.simplify_quadric_decimation(target_faces)
127
+
128
+ return mesh
129
+ except Exception as e:
130
+ logger.error(f"Erreur lors de la création du maillage: {str(e)}")
131
+ st.error(f"Erreur lors de la création du maillage: {str(e)}")
132
+ return None
133
+
134
+ def visualize_mesh(mesh):
135
+ """
136
+ Crée une visualisation du maillage en 3D Trisurf.
137
+ """
138
+ fig = plt.figure()
139
+ ax = fig.add_subplot(111, projection='3d')
140
+ ax.plot_trisurf(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2],
141
+ triangles=mesh.faces, cmap='viridis')
142
+ ax.set_xlabel('X')
143
+ ax.set_ylabel('Y')
144
+ ax.set_zlabel('Z')
145
+ return fig
146
+
147
+ def visualize_mesh_wireframe(mesh):
148
+ """
149
+ Crée une visualisation du maillage en wireframe.
150
+ """
151
+ fig = plt.figure()
152
+ ax = fig.add_subplot(111, projection='3d')
153
+ ax.plot_wireframe(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2],
154
+ triangles=mesh.faces, color='black')
155
+ ax.set_xlabel('X')
156
+ ax.set_ylabel('Y')
157
+ ax.set_zlabel('Z')
158
+ return fig
159
+
160
+ def export_for_blender(mesh):
161
+ """
162
+ Exporte le maillage dans un format compatible avec Blender.
163
+ """
164
+ try:
165
+ obj_file = BytesIO()
166
+ mesh.export(obj_file, file_type='obj')
167
+ return obj_file.getvalue()
168
+ except Exception as e:
169
+ logger.error(f"Erreur lors de l'export pour Blender: {str(e)}")
170
+ st.error(f"Erreur lors de l'export pour Blender: {str(e)}")
171
+ return None
172
 
173
  def main():
174
  st.title("Mesh Tiler CH - Streamlit Edition")