Calculer des relations Hauteur/Surface/Volume depuis une matrice de hauteurs d’eau (seule)
Il est recommandé de lire d’abord le notebook relatif aux calcul des ces grandeurs sur base de données d’altimétrie.
[ ]:
# import _add_path # for debugging purposes only - must be removed in production
import numpy as np
from pathlib import Path
import matplotlib.pyplot as plt
from wolfhece import is_enough
if not is_enough('2.2.35'):
raise ImportError("This code requires wolfhece version 2.2.34 or higher. -- try pip install wolfhece --upgrade")
from wolfhece.wolf_array import WolfArray
from wolfhece.pydownloader import toys_dataset
from wolfhece.PyVertexvectors import Zones, zone, vector, wolfvertex as wv
Importer des données de hauteurs d’eau
On importe la matrice et on masque une portion sur base d’un polygone et d’une contrainte de seuil ( h <= 0.5 m).
[ ]:
a = WolfArray(toys_dataset('SurfaceVolume', 'waterdepth.tif'))
mask = Zones(toys_dataset('SurfaceVolume', 'selection.vec'))
mask_poly = mask[('selection', 'contour')]
a.mask_outsidepoly(mask_poly) # Mask the area outside the polygon
# For the example : Masking the area where the water depth is greater than 0.5 m
# ------------------------------------------------------------------------------
# a.mask_greater(0.5) # mask_greater will replace the current mask with the new one
# If we want to impose the union of the current mask and the new one, we can use the following line:
a.array.mask[:,:] = (a.array.mask) | (a.array.data > 0.5) # '|' is the OR operator
fig, ax = a.plot_matplotlib(first_mask_data= False) # If we do not use first_mask_data, the mask will be change in the routine
i_max, j_max = np.unravel_index(np.ma.argmax(a.array), a.array.shape)
x_max, y_max = a.ij2xy(i_max, j_max)
print('Maximum cell : ', x_max, y_max)
print('Maximum value : ', a.array[i_max, j_max])
ax.scatter(x_max, y_max, color='red', marker='x', s=100, label='Maximum cell')
ax.legend()
Minimum : 5.524059e-11
Maximum : 0.49995255
Maximum cell : 253173.75 136093.25
Maximum value : 0.49995255
<matplotlib.legend.Legend at 0x1902e9f4490>

Calculer les relations Hauteur/Surface/Volume
Dans ce cas, on souhaite calculer les relations surface/volume en fonction des hauteurs d’eau.
On doit ainsi fournir :
la valeur minimale à considérer
la valeur maximale à considérer
le nombre d’intervalles à calculer
la méthode de calcul
Sur cette base, le code va itérer sur les hauteurs d’eau successives. Il va évaluer les grandeurs utiles (surface et volume) et tracer les courbes résultantes.
Les valeurs sont sauvegardées dans un fichier texte qui est par défaut dans le sous-répertoire “surface_volume” de la matrice chargée.
Est également sauvegardée la matrice contenant les mailles utilisées pour les différents intervalles calculés –> ‘surface_volume_extension.tif’. Attention, la numérotation est basée 1.
A l’inverse de la routine se basant sur des altitudes, on va ici exploiter une copie de la matrice dont on va commencer par changer le signe des valeurs. On exploitera alors la même routine que dans le cas des altimétries. Les labels d’axes sont adaptés automatiquement.
ATTENTION : cette approche ne revient pas nécessairement au même résultat que l’intégration des hauteurs d’eau sur base d’une altitude de surface libre croissante. On n’exploite ici qu’une seule matrice (H) et non 2 (DEM et H).
[5]:
fig, axs = a.surface_volume_estimation_from_waterdepth(desired_zmin= 0., # minimum elevation
nb = 100, # number of steps
method= 'all below') # method to select the area below the elevation
100%|██████████| 101/101 [00:00<00:00, 393.48it/s]

Récupérer les extensions
[4]:
ext = WolfArray(Path(a.filename).parent / 'surface_volume' / 'surface_volume_extension.tif')
ext.plot_matplotlib(with_legend=True,)
[4]:
(<Figure size 640x480 with 2 Axes>, <Axes: >)
