Calculer des relations Hauteur/Surface/Volume depuis une matrice 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 d’altimétrie
[2]:
a = WolfArray(toys_dataset('SurfaceVolume', 'elevation.tif'))
[3]:
a.plot_matplotlib(with_legend=True)
print('Minimum : ', a.array.min())
print('Maximum : ', a.array.max())
Minimum : 167.037
Maximum : 185.0

Calculer les relations Surface/Volume
Dans ce cas, on souhaite calculer les relations surface/volume en fonction de l’altimétrie.
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 altitudes 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.
[4]:
fig, axs = a.surface_volume_estimation_from_elevation(desired_zmin= 170.5, # minimum elevation
desired_zmax= 172.5, # maximum elevation
nb = 25, # number of steps
method= 'all below') # method to select the area below the elevation
100%|██████████| 26/26 [00:00<00:00, 239.20it/s]

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

Variantes
Il est possible de choisir une autre méthode de sélection parmis :
‘all below’ : exploite toutes les mailles sous l’altitude courante
‘largest area’ : commence par labelliser la matrice et ne conserve que la plus grande étendue
‘selected’ : commence par labelliser la matrice et ne conserve que la/les zone(s) qui contiennent les coordonnées fournies
Méthode ‘largest area’
On ne tiendra compte que de la plus grande surface labellisée.
[6]:
figaxs_largest = a.surface_volume_estimation_from_elevation(desired_zmin= 170.5,
desired_zmax= 172.5,
nb = 25,
method= 'largest area')
100%|██████████| 26/26 [00:00<00:00, 108.64it/s]

[7]:
ext_largest = WolfArray(Path(a.filename).parent / 'surface_volume' / 'surface_volume_extension.tif')
ext_largest.plot_matplotlib(with_legend=True,)
[7]:
(<Figure size 640x480 with 2 Axes>, <Axes: >)

Méthode ‘selected’
On ne tiendra compte que de la surface comprenant les mailles demandées.
[8]:
figaxs_selected = a.surface_volume_estimation_from_elevation(desired_zmin= 170.5,
desired_zmax= 172.5,
nb = 25,
method= 'selected',
selected_cells= [(253000, 136125),])
100%|██████████| 26/26 [00:06<00:00, 3.92it/s]

[9]:
ext_select = WolfArray(Path(a.filename).parent / 'surface_volume' / 'surface_volume_extension.tif')
fig, ax = ext_select.plot_matplotlib(with_legend=True,)
ax.scatter(253000, 136125, color='red', marker='x', s=100, label='Selected cell')
[9]:
<matplotlib.collections.PathCollection at 0x1b619bd9c50>

Accéder aux valeurs numériques du fichier
La routine sauvegarde les valeurs dans un fichier texte qui peut être lu facilement par n’import quel tableur.
Dans un script, il est plus simple d’utiliser Pandas.
Note : le séparateur est la tabulation (pour faciliter l’import dans un tableur comme Excel)
[10]:
import pandas as pd
df = pd.read_csv(Path(a.filename).parent / 'surface_volume' / 'surface_volume_hvs.txt', sep='\t')
print(df.head())
df.plot(x = 'H [m]', y = 'Volume [$m^3$]')
H [m] Z [m DNG] Volume [$m^3$] Surface [$m^2$]
0 0.00 170.50 0.000000e+00 0.00
1 0.08 170.58 0.000000e+00 0.00
2 0.16 170.66 1.905717e+06 8315.50
3 0.24 170.74 2.191867e+06 9316.75
4 0.32 170.82 2.691897e+06 11237.25
[10]:
<Axes: xlabel='H [m]'>

Masquer une partie de la matrice avant le calcul
Il est tout à fait possible de masquer une partie de la matrice sur base d’un polygone.
[11]:
mask = Zones(toys_dataset('SurfaceVolume', 'selection.vec'))
mask_poly = mask[('selection', 'contour')]
a.mask_outsidepoly(mask_poly) # Mask the area outside the polygon
a.plot_matplotlib()
[11]:
(<Figure size 640x480 with 1 Axes>, <Axes: >)

[12]:
a.surface_volume_estimation_from_elevation() # by default, the method is 'largest area'
100%|██████████| 101/101 [00:00<00:00, 109.05it/s]
[12]:
(<Figure size 640x480 with 2 Axes>,
array([<Axes: xlabel='Elevation [m]', ylabel='Volume [$m^3$]'>,
<Axes: xlabel='Elevation [m]', ylabel='Surface [$m^2$]'>],
dtype=object))

[13]:
ext_mask = WolfArray(Path(a.filename).parent / 'surface_volume' / 'surface_volume_extension.tif')
fig, ax = ext_mask.plot_matplotlib()
ax.scatter(253000, 136125, color='red', marker='x', s=100, label='Selected cell')
[13]:
<matplotlib.collections.PathCollection at 0x1b61dffaf90>
