Créer un rapport de comparaison entre deux matrices géolocalisées

L’objectif de ce script est de comparer deux matrices géolocalisées, identifier les différences en des zones distinctes, et générer un rapport PDF détaillé.

Import des modules nécessaires

[ ]:
# import _add_path # For debugging purposes only, cen be removed in production

from packaging import version
from wolfhece import __version__
minimmum_version = '2.2.29'
if version.parse(__version__) < version.parse(minimmum_version):
    raise ImportError(f"HECEPython version {minimmum_version} or higher is required, but found {__version__}. Please update wolfhece.")

import numpy as np

from wolfhece.report.compare_arrays import CompareArrays, WolfArray, header_wolf

# for testing purposes - not needed in production
from wolfhece.report.compare_arrays import ArrayDifferenceLayout, CompareArraysLayout, CompareArraysLayout2
pdfviewer using PyMuPDF (GPL)

Layouts utilisés

Le rapport PDF est généré en utilisant le paquet PyMuPdf.

Le layout de chaque page est défini par des classes spécifiques, qui peuvent être modifiées sur base de zones vectorielles.

La première page du rapport présentera :

  • Des éléments globaux de comparaison (nombre de zones identifiées, surface…)

  • Un graphique de la matrice de référence (à gauche)

  • Un graphique de la matrice de comparaison (à droite)

  • Un graphique de la différence entre les deux matrices (en bas au centre)

La deuxième page du rapport présentera :

  • Un graphique de distribution des surfaces des zones (à gauche)

  • Un graphique de distribution des volumes nets des zones (à droite)

  • Des graphiques de positionnement spatial (photo aérienne, carte IGN, etc.) de la zone globale de comparaison

Les pages suivantes du rapport présenteront pour chaque zone identifiée :

  • Un graphique de la distribution des valeurs de référence et de comparaison (en haut)

  • Un graphique de la distribution des valeurs de différence (en dessous)

  • Une localisation précise de la zone sur la carte et sur une zone plus élargie (photo aérienne) avec un cadre vectoriel indiquant la zone de comparaison

  • Une représentation de la matrice de référence et de comparaison pour la zone identifiée

  • Une représentation de la matrice de différence pour la zone identifiée

  • Des infortations sur la zone (surface, volume, etc.)

[2]:
comp_layout = CompareArraysLayout('Comparison')
comp_layout.plot()

comp_layout = CompareArraysLayout2('Comparison')
comp_layout.plot()

diff_layout = ArrayDifferenceLayout('For each part of the array, the difference is shown in a separate page.')
diff_layout.plot()
[2]:
(<Figure size 826.772x1169.29 with 1 Axes>,
 <Axes: title={'center': 'Layout of the report'}, xlabel='Width (cm)', ylabel='Height (cm)'>)
../_images/tutorials_array_differences_4_1.png
../_images/tutorials_array_differences_4_2.png
../_images/tutorials_array_differences_4_3.png

Exemple sur une matrice simple

Définition des deux matrices à comparer

Remplissage par des valeurs aléatoires pour l’exemple

[3]:
h = header_wolf()
h.set_origin(250_000., 150_000.)
h.set_resolution(0.5, 0.5)
h.shape = (1000, 1000)

ref = WolfArray(srcheader=h)
to_compare = WolfArray(srcheader=h)

zones = [[10,10,100,100],
         [200,200,300,300],
         [500,500,600,520],
         [710,730,722,800]]

# Fill the arrays with random values in the defined zones
for zone in zones:
    ref.array[zone[0]:zone[2], zone[1]:zone[3]] = np.random.random((zone[2]-zone[0], zone[3]-zone[1])) * 100
    to_compare.array[zone[0]:zone[2], zone[1]:zone[3]] = np.random.random((zone[2]-zone[0], zone[3]-zone[1])) * 100

ref.mask_data(0.)
to_compare.mask_data(0.)

ref.updatepalette()
to_compare.updatepalette()

Comparaison des matrices

[4]:
comp = CompareArrays(ref, to_compare) # Initialisation de la comparaison
comp.localize_differences(ignored_patche_area = 0.) # Localisation des différences entre les deux tableaux
comp.create_report() # Le chemin du pdf peut être précisé en argument, sinon il est créé dans le répertoire courant.
Processing features: 0feature [00:00, ?feature/s]Processing features: 4feature [00:00, 2005.40feature/s]
Plotting external borders: 100%|██████████| 4/4 [00:00<?, ?it/s]
Plotting contours: 100%|██████████| 4/4 [00:00<00:00, 18.12it/s]
Calculating volumes: 100%|██████████| 4/4 [00:00<?, ?it/s]
Creating individual difference reports: 100%|██████████| 4/4 [00:22<00:00,  5.57s/it]
Compiling PDFs: 100%|██████████| 5/5 [00:00<00:00, 44.92it/s]