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
../_images/tutorials_wolfarray_surfacevolume_4_1.png

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]
../_images/tutorials_wolfarray_surfacevolume_6_1.png

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: >)
../_images/tutorials_wolfarray_surfacevolume_8_1.png

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]
../_images/tutorials_wolfarray_surfacevolume_11_1.png
[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: >)
../_images/tutorials_wolfarray_surfacevolume_12_1.png

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]
../_images/tutorials_wolfarray_surfacevolume_14_1.png
[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>
../_images/tutorials_wolfarray_surfacevolume_15_1.png

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]'>
../_images/tutorials_wolfarray_surfacevolume_17_2.png

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: >)
../_images/tutorials_wolfarray_surfacevolume_19_1.png
[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))
../_images/tutorials_wolfarray_surfacevolume_20_2.png
[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>
../_images/tutorials_wolfarray_surfacevolume_21_1.png