From 59964c460cd97243b7c93e34e34282d13e54d113 Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Fri, 3 Oct 2025 14:32:29 +0200
Subject: [PATCH 01/14] Adaptation des import pour l'export de CurlPool en
dehors de Cache
---
src/cache2work.cpp | 1 +
src/mergeNtiff.cpp | 1 +
src/pbf2cache.cpp | 1 +
src/work2cache.cpp | 1 +
4 files changed, 4 insertions(+)
diff --git a/src/cache2work.cpp b/src/cache2work.cpp
index 562fc2c..5925a8d 100644
--- a/src/cache2work.cpp
+++ b/src/cache2work.cpp
@@ -59,6 +59,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include "config.h"
diff --git a/src/mergeNtiff.cpp b/src/mergeNtiff.cpp
index 84323fb..bd6cd5c 100644
--- a/src/mergeNtiff.cpp
+++ b/src/mergeNtiff.cpp
@@ -76,6 +76,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include
#include
#include
diff --git a/src/pbf2cache.cpp b/src/pbf2cache.cpp
index 6359860..36ed715 100644
--- a/src/pbf2cache.cpp
+++ b/src/pbf2cache.cpp
@@ -58,6 +58,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include
#include "config.h"
diff --git a/src/work2cache.cpp b/src/work2cache.cpp
index 09de411..515584a 100644
--- a/src/work2cache.cpp
+++ b/src/work2cache.cpp
@@ -62,6 +62,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include
#include "config.h"
From df66999b09f7bd2c0ae09c04491445383e2cdda6 Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Fri, 3 Oct 2025 17:58:47 +0200
Subject: [PATCH 02/14] Adaptation de l'export de ProjPool en dehors de Cache
---
src/cache2work.cpp | 1 +
src/composeNtiff.cpp | 2 ++
src/decimateNtiff.cpp | 1 +
src/manageNodata.cpp | 1 +
src/merge4tiff.cpp | 2 --
src/mergeNtiff.cpp | 1 -
src/overlayNtiff.cpp | 1 -
src/pbf2cache.cpp | 1 -
src/work2cache.cpp | 1 -
9 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/cache2work.cpp b/src/cache2work.cpp
index 5925a8d..ef36f74 100644
--- a/src/cache2work.cpp
+++ b/src/cache2work.cpp
@@ -60,6 +60,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include "config.h"
diff --git a/src/composeNtiff.cpp b/src/composeNtiff.cpp
index 0641921..b8cc0e4 100644
--- a/src/composeNtiff.cpp
+++ b/src/composeNtiff.cpp
@@ -66,6 +66,8 @@ namespace keywords = boost::log::keywords;
#include
#include
#include "config.h"
+#include
+
/** \~french Nombre d'images dans le sens de la largeur */
int images_widthwise = 0;
diff --git a/src/decimateNtiff.cpp b/src/decimateNtiff.cpp
index 59191f6..bfe2360 100644
--- a/src/decimateNtiff.cpp
+++ b/src/decimateNtiff.cpp
@@ -66,6 +66,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include
#include
diff --git a/src/manageNodata.cpp b/src/manageNodata.cpp
index 173d66a..59c5e93 100644
--- a/src/manageNodata.cpp
+++ b/src/manageNodata.cpp
@@ -73,6 +73,7 @@ using namespace std;
#include
#include
+#include
#include
#include
diff --git a/src/merge4tiff.cpp b/src/merge4tiff.cpp
index 0530768..d9eeedf 100644
--- a/src/merge4tiff.cpp
+++ b/src/merge4tiff.cpp
@@ -62,9 +62,7 @@ namespace keywords = boost::log::keywords;
#include
#include
-#include
#include
-
#include "config.h"
/* Valeurs de nodata */
diff --git a/src/mergeNtiff.cpp b/src/mergeNtiff.cpp
index bd6cd5c..353a8d8 100644
--- a/src/mergeNtiff.cpp
+++ b/src/mergeNtiff.cpp
@@ -75,7 +75,6 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
-#include
#include
#include
#include
diff --git a/src/overlayNtiff.cpp b/src/overlayNtiff.cpp
index cbbb73a..bfd92cb 100644
--- a/src/overlayNtiff.cpp
+++ b/src/overlayNtiff.cpp
@@ -65,7 +65,6 @@ namespace keywords = boost::log::keywords;
#include
#include
#include "config.h"
-#include
/** \~french Chemin du fichier de configuration des images */
char configuration_path[256];
diff --git a/src/pbf2cache.cpp b/src/pbf2cache.cpp
index 36ed715..43580ab 100644
--- a/src/pbf2cache.cpp
+++ b/src/pbf2cache.cpp
@@ -57,7 +57,6 @@ namespace keywords = boost::log::keywords;
#include
#include
-#include
#include
#include
#include "config.h"
diff --git a/src/work2cache.cpp b/src/work2cache.cpp
index 515584a..fb89fdf 100644
--- a/src/work2cache.cpp
+++ b/src/work2cache.cpp
@@ -61,7 +61,6 @@ namespace keywords = boost::log::keywords;
#include
#include
-#include
#include
#include
#include "config.h"
From ff2952dff3a45d04a5895338d60445d3d029ae51 Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Mon, 6 Oct 2025 16:36:57 +0200
Subject: [PATCH 03/14] =?UTF-8?q?Changement=20li=C3=A9=20=C3=A0=20l'export?=
=?UTF-8?q?=20de=20StoragePool=20en=20dehors=20de=20la=20classe=20Cache=20?=
=?UTF-8?q?dans=20core-cpp?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/cache2work.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/cache2work.cpp b/src/cache2work.cpp
index ef36f74..80591f6 100644
--- a/src/cache2work.cpp
+++ b/src/cache2work.cpp
@@ -56,7 +56,6 @@ namespace keywords = boost::log::keywords;
#include
#include
-#include
#include
#include
#include
From c791c4293c52efa18ddd2e7e0c0cd4f4470bb2e4 Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Thu, 9 Oct 2025 12:15:02 +0200
Subject: [PATCH 04/14] =?UTF-8?q?Ajout=20des=20imports=20suite=20=C3=A0=20?=
=?UTF-8?q?l'export=20de=20StoragePool=20hors=20de=20Cache?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/cache2work.cpp | 1 +
src/pbf2cache.cpp | 1 +
src/work2cache.cpp | 1 +
3 files changed, 3 insertions(+)
diff --git a/src/cache2work.cpp b/src/cache2work.cpp
index 80591f6..89e6d76 100644
--- a/src/cache2work.cpp
+++ b/src/cache2work.cpp
@@ -60,6 +60,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include "config.h"
diff --git a/src/pbf2cache.cpp b/src/pbf2cache.cpp
index 43580ab..f54c361 100644
--- a/src/pbf2cache.cpp
+++ b/src/pbf2cache.cpp
@@ -58,6 +58,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include
#include "config.h"
diff --git a/src/work2cache.cpp b/src/work2cache.cpp
index fb89fdf..3605cee 100644
--- a/src/work2cache.cpp
+++ b/src/work2cache.cpp
@@ -62,6 +62,7 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
#include
#include "config.h"
From 4d103456211caf5de82ee50df16bca5fff94c5ee Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Fri, 17 Oct 2025 17:02:17 +0200
Subject: [PATCH 05/14] =?UTF-8?q?Mise=20=C3=A0=20jour=20Changelog?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5a0100d..deabc02 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## Unreleased
+
+### [Added]
+### [Changed]
+### [Deprecated]
+### [Removed]
+### [Fixed]
+
+
+* Changement des imports de Cache au imports spécifiques des classes suite à la séparation du fichier cache dans core-cpp
+
+### Security
+
## 5.0.0
### [Changed]
From 02367fa46885f3db9bdb52c2fb8f58be448cbc9f Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Mon, 20 Oct 2025 09:45:45 +0200
Subject: [PATCH 06/14] Correction erreurs changelog
---
CHANGELOG.md | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index deabc02..a03a567 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,14 +2,13 @@
### [Added]
### [Changed]
+
+* Changement des imports de Cache aux imports spécifiques des classes suite à la séparation du fichier Cache dans core-cpp.
+
### [Deprecated]
### [Removed]
### [Fixed]
-
-
-* Changement des imports de Cache au imports spécifiques des classes suite à la séparation du fichier cache dans core-cpp
-
-### Security
+### [Security]
## 5.0.0
From 2c00426f49630c90b2bf43263deb327552528d11 Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Mon, 20 Oct 2025 10:46:31 +0200
Subject: [PATCH 07/14] =?UTF-8?q?Retrait=20des=20imports=20de=20Cache=20d?=
=?UTF-8?q?=C3=A9pr=C3=A9ci=C3=A9s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/composeNtiff.cpp | 1 -
src/decimateNtiff.cpp | 1 -
src/manageNodata.cpp | 1 -
3 files changed, 3 deletions(-)
diff --git a/src/composeNtiff.cpp b/src/composeNtiff.cpp
index b8cc0e4..c2f4717 100644
--- a/src/composeNtiff.cpp
+++ b/src/composeNtiff.cpp
@@ -64,7 +64,6 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
-#include
#include "config.h"
#include
diff --git a/src/decimateNtiff.cpp b/src/decimateNtiff.cpp
index bfe2360..d3d3bb1 100644
--- a/src/decimateNtiff.cpp
+++ b/src/decimateNtiff.cpp
@@ -65,7 +65,6 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
-#include
#include
#include
diff --git a/src/manageNodata.cpp b/src/manageNodata.cpp
index 59c5e93..00113fb 100644
--- a/src/manageNodata.cpp
+++ b/src/manageNodata.cpp
@@ -72,7 +72,6 @@
using namespace std;
#include
-#include
#include
#include
From a0594d0abe5af959ff00f6e9404f6bd0bf39a0bd Mon Sep 17 00:00:00 2001
From: Theo Satabin
Date: Mon, 3 Nov 2025 17:25:00 +0100
Subject: [PATCH 08/14] Passage du changelog au format keepachangelog
---
CHANGELOG.md | 101 ++++++++++++++++++++++++++----------------------
CONTRIBUTING.md | 16 ++++----
README.md | 1 +
3 files changed, 63 insertions(+), 55 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5a0100d..4961e2e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,57 +1,66 @@
-## 5.0.0
-
-### [Changed]
-
-* Le format des canaux contient la taille en bits
-* Passage en snake case
-
-### [Fixed]
-
-* Correction de l'utilisation d'un style "identité"
-
-### [Removed]
-
-* Suppression de l'option crop dans work2cache
-
-## 4.2.0
-
-### [Added]
-
-* Stockage objet (S3, Swift et Ceph)
- * Possibilité de définir un nombre de tentatives pour les lectures (1 par défaut) : variable d'environnement `ROK4_OBJECT_READ_ATTEMPTS`
- * Possibilité de définir un nombre de tentatives pour les écritures (1 par défaut) : variable d'environnement `ROK4_OBJECT_WRITE_ATTEMPTS`
+# Changelog
+Tous les changements sont consignés dans ce fichier.
+
+Le format est basé sur [Keep a Changelog](https://keepachangelog.com/) et ce projet respecte le [Semantic Versioning](https://semver.org/).
+
+## [Unreleased]
+### Added
+- Possibilité de définir un timeout via la variable d'environnement `ROK4_NETWORK_TIMEOUT` (valeur à fournir en seconde) pour les intéraction avec le stockage Swift ou S3
+
+### Changed
+- Refonte du CHANGELOG au format [Keep a Changelog](https://keepachangelog.com/)
+### Deprecated
+### Removed
+### Fixed
+### Security
+
+## [5.0.0] - 2025-06-13
+### Changed
+- Le format des canaux contient la taille en bits
+- Passage en snake case
+
+### Removed
+- Suppression de l'option crop dans work2cache
+
+### Fixed
+- Correction de l'utilisation d'un style "identité"
+
+## [4.2.0] - 2024-03-21
+### Added
+- Stockage objet (S3, Swift et Ceph)
+ * Possibilité de définir un nombre de tentatives pour les lectures (1 par défaut) : variable d'environnement `ROK4_OBJECT_READ_ATTEMPTS`
+ * Possibilité de définir un nombre de tentatives pour les écritures (1 par défaut) : variable d'environnement `ROK4_OBJECT_WRITE_ATTEMPTS`
* Possibilité de définir un temps d'attente, en secondes, entre les tentatives (5 par défaut) : variable d'environnement `ROK4_OBJECT_ATTEMPTS_WAIT`
-## 4.1.5
-
-### [Fixed]
-
-* Outil `mergeNtiff` : correction du cas mergeNtiff + image de fond + style. L'image de fond provient d'une pyramide, donc est déjà au format cible. Il ne faut pas lui appliquer de style.
-
-## 4.1.4
+## [4.1.5] - 2023-08-30
+### Fixed
+- Outil `mergeNtiff` : correction du cas mergeNtiff + image de fond + style. L'image de fond provient d'une pyramide, donc est déjà au format cible. Il ne faut pas lui appliquer de style.
-### [Fixed]
+## [4.1.4] - 2023-03-14
+### Changed
+- Prise en compte du nouveau nommage dans l'utilisation de l'annuaire de contexte de stockage
+- Compilation avec core-cpp en librairie dynamique
-* Outil `manageNodata` : une erreur lors de la lecture initiale (et complète) de l'image de données en entrée fait sortir en erreur la commande
-* Outil `mergeNtiff` : gestion correcte d'un style de pente pur (sans palette), dans le cas d'images en entrée phasée avec la sortie (pas de réechantillonnage ou reprojection)
-* Include de la librairie d'annuaire (stockage, proj...)
-
-### [Changed]
-
-* Prise en compte du nouveau nommage dans l'utilisation de l'annuaire de contexte de stockage
-* Compilation avec core-cpp en librairie dynamique
-
-## 4.0.0
+### Fixed
+- Outil `manageNodata` : une erreur lors de la lecture initiale (et complète) de l'image de données en entrée fait sortir en erreur la commande
+- Outil `mergeNtiff` : gestion correcte d'un style de pente pur (sans palette), dans le cas d'images en entrée phasée avec la sortie (pas de réechantillonnage ou reprojection)
+- Include de la librairie d'annuaire (stockage, proj...)
+## [4.0.0] - 2022-06-26
Le projet ROK4 a été totalement refondu, dans son organisation et sa mise à disposition. Les composants sont désormais disponibles dans des releases sur GitHub au format debian.
Cette release contient les outils de génération des pyramides de données, permettant les reprojections, le sous echantillonnage, ou encore la mise au format final des données.
-### [Added]
-
-* L'outil mergeNtiff peut prendre en compte un style à appliquer aux données, avant l'éventuelle reprojection
+### Added
+- L'outil mergeNtiff peut prendre en compte un style à appliquer aux données, avant l'éventuelle reprojection
-### [Changed]
+### Changed
+- Les chemins des dalles finales sont fournis dans un format précisant le type de stockage : `(file|ceph|s3|swift)://`. Dans le cas du stockage objet, le chemin est de la forme `/`
+- Passage de la librairie PROJ à la version 6
-* Les chemins des dalles finales sont fournis dans un format précisant le type de stockage : `(file|ceph|s3|swift)://`. Dans le cas du stockage objet, le chemin est de la forme `/`
-* Passage de la librairie PROJ à la version 6
\ No newline at end of file
+[Unreleased]: https://github.com/rok4/generation/compare/v5.0.0...HEAD
+[5.0.0]: https://github.com/rok4/generation/compare/v4.2.0...v5.0.0
+[4.2.0]: https://github.com/rok4/generation/compare/v4.1.5...v4.2.0
+[4.1.5]: https://github.com/rok4/generation/compare/v4.1.4...v4.1.5
+[4.1.4]: https://github.com/rok4/generation/compare/v4.0.0...v4.1.4
+[4.0.0]: https://github.com/rok4/generation/releases/tag/v4.0.0
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4c3895d..8ef75cf 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,32 +4,30 @@ Merci d'envisager de contribuer à ce projet !
## Pull request
-Le titre de la PR est utilisé pour constituer automatiquement les notes de release. Vous pouvez préciser en commentaire de votre PR des détails qui seront ajoutés dans le fichier `CHANGELOG.md` par les mainteneurs du projet.
-
-Le formalisme du changelog est le suivant, en markdown :
+Complétez le fichier `CHANGELOG.md`, dans la partie `[Unreleased]`, en précisant les modifications fonctionnelles apportées. Celles ci seront utilisées pour rédiger le message de release sur GitHub. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/). Les sections sont les suivantes :
```md
-### [Added]
+### Added
Liste de nouvelles fonctionnalités.
-### [Changed]
+### Changed
Liste de fonctionnalités existantes modifiées.
-### [Deprecated]
+### Deprecated
Liste de fonctionnalités dépréciées.
-### [Removed]
+### Removed
Liste de foncitonnalités retirées.
-### [Fixed]
+### Fixed
Liste de corrections fonctionnelles.
-### [Security]
+### Security
Liste de corrections de sécurité.
```
diff --git a/README.md b/README.md
index c37aa73..430e950 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,7 @@ Leur définition est contrôlée à l'usage.
- `ROK4_KEYSTONE_PROJECTID`
- `ROK4_SWIFT_TOKEN_FILE` afin de sauvegarder le token d'accès, et ne pas le demander si ce fichier en contient un
* Pour configurer l'usage de libcurl (intéraction SWIFT et S3)
+ - `ROK4_NETWORK_TIMEOUT` : temps en secondes d'inactivité d'une requête avant de la stopper. Aucun temps défini côté client si aucune valeur fournie
- `ROK4_SSL_NO_VERIFY`
- `HTTP_PROXY`
- `HTTPS_PROXY`
From 6ca056ac8b1ded8fd4eb3b937188a97b7becda3f Mon Sep 17 00:00:00 2001
From: Theo Satabin
Date: Mon, 3 Nov 2025 17:25:00 +0100
Subject: [PATCH 09/14] Passage du changelog au format keepachangelog
---
CHANGELOG.md | 114 ++++++++++++++++++++++++------------------------
CONTRIBUTING.md | 16 +++----
README.md | 1 +
3 files changed, 64 insertions(+), 67 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a03a567..ba4cbda 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,69 +1,67 @@
-## Unreleased
-
-### [Added]
-### [Changed]
-
-* Changement des imports de Cache aux imports spécifiques des classes suite à la séparation du fichier Cache dans core-cpp.
-
-### [Deprecated]
-### [Removed]
-### [Fixed]
-### [Security]
-
-## 5.0.0
-
-### [Changed]
-
-* Le format des canaux contient la taille en bits
-* Passage en snake case
-
-### [Fixed]
-
-* Correction de l'utilisation d'un style "identité"
-
-### [Removed]
-
-* Suppression de l'option crop dans work2cache
-
-## 4.2.0
-
-### [Added]
-
-* Stockage objet (S3, Swift et Ceph)
- * Possibilité de définir un nombre de tentatives pour les lectures (1 par défaut) : variable d'environnement `ROK4_OBJECT_READ_ATTEMPTS`
- * Possibilité de définir un nombre de tentatives pour les écritures (1 par défaut) : variable d'environnement `ROK4_OBJECT_WRITE_ATTEMPTS`
+# Changelog
+Tous les changements sont consignés dans ce fichier.
+
+Le format est basé sur [Keep a Changelog](https://keepachangelog.com/) et ce projet respecte le [Semantic Versioning](https://semver.org/).
+
+## [Unreleased]
+### Added
+- Possibilité de définir un timeout via la variable d'environnement `ROK4_NETWORK_TIMEOUT` (valeur à fournir en seconde) pour les intéraction avec le stockage Swift ou S3
+
+### Changed
+- Refonte du CHANGELOG au format [Keep a Changelog](https://keepachangelog.com/)
+- Changement des imports de Cache aux imports spécifiques des classes suite à la séparation du fichier Cache dans core-cpp.
+### Deprecated
+### Removed
+### Fixed
+### Security
+
+## [5.0.0] - 2025-06-13
+### Changed
+- Le format des canaux contient la taille en bits
+- Passage en snake case
+
+### Removed
+- Suppression de l'option crop dans work2cache
+
+### Fixed
+- Correction de l'utilisation d'un style "identité"
+
+## [4.2.0] - 2024-03-21
+### Added
+- Stockage objet (S3, Swift et Ceph)
+ * Possibilité de définir un nombre de tentatives pour les lectures (1 par défaut) : variable d'environnement `ROK4_OBJECT_READ_ATTEMPTS`
+ * Possibilité de définir un nombre de tentatives pour les écritures (1 par défaut) : variable d'environnement `ROK4_OBJECT_WRITE_ATTEMPTS`
* Possibilité de définir un temps d'attente, en secondes, entre les tentatives (5 par défaut) : variable d'environnement `ROK4_OBJECT_ATTEMPTS_WAIT`
-## 4.1.5
-
-### [Fixed]
-
-* Outil `mergeNtiff` : correction du cas mergeNtiff + image de fond + style. L'image de fond provient d'une pyramide, donc est déjà au format cible. Il ne faut pas lui appliquer de style.
+## [4.1.5] - 2023-08-30
+### Fixed
+- Outil `mergeNtiff` : correction du cas mergeNtiff + image de fond + style. L'image de fond provient d'une pyramide, donc est déjà au format cible. Il ne faut pas lui appliquer de style.
-## 4.1.4
+## [4.1.4] - 2023-03-14
+### Changed
+- Prise en compte du nouveau nommage dans l'utilisation de l'annuaire de contexte de stockage
+- Compilation avec core-cpp en librairie dynamique
-### [Fixed]
-
-* Outil `manageNodata` : une erreur lors de la lecture initiale (et complète) de l'image de données en entrée fait sortir en erreur la commande
-* Outil `mergeNtiff` : gestion correcte d'un style de pente pur (sans palette), dans le cas d'images en entrée phasée avec la sortie (pas de réechantillonnage ou reprojection)
-* Include de la librairie d'annuaire (stockage, proj...)
-
-### [Changed]
-
-* Prise en compte du nouveau nommage dans l'utilisation de l'annuaire de contexte de stockage
-* Compilation avec core-cpp en librairie dynamique
-
-## 4.0.0
+### Fixed
+- Outil `manageNodata` : une erreur lors de la lecture initiale (et complète) de l'image de données en entrée fait sortir en erreur la commande
+- Outil `mergeNtiff` : gestion correcte d'un style de pente pur (sans palette), dans le cas d'images en entrée phasée avec la sortie (pas de réechantillonnage ou reprojection)
+- Include de la librairie d'annuaire (stockage, proj...)
+## [4.0.0] - 2022-06-26
Le projet ROK4 a été totalement refondu, dans son organisation et sa mise à disposition. Les composants sont désormais disponibles dans des releases sur GitHub au format debian.
Cette release contient les outils de génération des pyramides de données, permettant les reprojections, le sous echantillonnage, ou encore la mise au format final des données.
-### [Added]
-
-* L'outil mergeNtiff peut prendre en compte un style à appliquer aux données, avant l'éventuelle reprojection
+### Added
+- L'outil mergeNtiff peut prendre en compte un style à appliquer aux données, avant l'éventuelle reprojection
-### [Changed]
+### Changed
+- Les chemins des dalles finales sont fournis dans un format précisant le type de stockage : `(file|ceph|s3|swift)://`. Dans le cas du stockage objet, le chemin est de la forme `/`
+- Passage de la librairie PROJ à la version 6
-* Les chemins des dalles finales sont fournis dans un format précisant le type de stockage : `(file|ceph|s3|swift)://`. Dans le cas du stockage objet, le chemin est de la forme `/`
-* Passage de la librairie PROJ à la version 6
\ No newline at end of file
+[Unreleased]: https://github.com/rok4/generation/compare/v5.0.0...HEAD
+[5.0.0]: https://github.com/rok4/generation/compare/v4.2.0...v5.0.0
+[4.2.0]: https://github.com/rok4/generation/compare/v4.1.5...v4.2.0
+[4.1.5]: https://github.com/rok4/generation/compare/v4.1.4...v4.1.5
+[4.1.4]: https://github.com/rok4/generation/compare/v4.0.0...v4.1.4
+[4.0.0]: https://github.com/rok4/generation/releases/tag/v4.0.0
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4c3895d..8ef75cf 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,32 +4,30 @@ Merci d'envisager de contribuer à ce projet !
## Pull request
-Le titre de la PR est utilisé pour constituer automatiquement les notes de release. Vous pouvez préciser en commentaire de votre PR des détails qui seront ajoutés dans le fichier `CHANGELOG.md` par les mainteneurs du projet.
-
-Le formalisme du changelog est le suivant, en markdown :
+Complétez le fichier `CHANGELOG.md`, dans la partie `[Unreleased]`, en précisant les modifications fonctionnelles apportées. Celles ci seront utilisées pour rédiger le message de release sur GitHub. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/). Les sections sont les suivantes :
```md
-### [Added]
+### Added
Liste de nouvelles fonctionnalités.
-### [Changed]
+### Changed
Liste de fonctionnalités existantes modifiées.
-### [Deprecated]
+### Deprecated
Liste de fonctionnalités dépréciées.
-### [Removed]
+### Removed
Liste de foncitonnalités retirées.
-### [Fixed]
+### Fixed
Liste de corrections fonctionnelles.
-### [Security]
+### Security
Liste de corrections de sécurité.
```
diff --git a/README.md b/README.md
index c37aa73..430e950 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,7 @@ Leur définition est contrôlée à l'usage.
- `ROK4_KEYSTONE_PROJECTID`
- `ROK4_SWIFT_TOKEN_FILE` afin de sauvegarder le token d'accès, et ne pas le demander si ce fichier en contient un
* Pour configurer l'usage de libcurl (intéraction SWIFT et S3)
+ - `ROK4_NETWORK_TIMEOUT` : temps en secondes d'inactivité d'une requête avant de la stopper. Aucun temps défini côté client si aucune valeur fournie
- `ROK4_SSL_NO_VERIFY`
- `HTTP_PROXY`
- `HTTPS_PROXY`
From 2e89871b962561d13534a6f3ebf00a826f4a1bfe Mon Sep 17 00:00:00 2001
From: Theo Satabin
Date: Tue, 4 Nov 2025 13:55:21 +0100
Subject: [PATCH 10/14] =?UTF-8?q?Suppression=20des=20warnings=20li=C3=A9s?=
=?UTF-8?q?=20aux=20types=20uint8=20et=20uint32?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/merge4tiff.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/merge4tiff.cpp b/src/merge4tiff.cpp
index d9eeedf..54c2561 100644
--- a/src/merge4tiff.cpp
+++ b/src/merge4tiff.cpp
@@ -580,8 +580,8 @@ int fill_background_line ( FileImage* background_image, T* image_line, uint8_t*
template
int merge ( FileImage* background_image, FileImage* input_images[2][2], FileImage* output_image, FileImage* output_mask, T* nodata ) {
- uint8 merge_weights[1024];
- for ( int i = 0; i <= 1020; i++ ) merge_weights[i] = 255 - ( uint8 ) round ( pow ( double ( 1020 - i ) /1020., local_gamma ) * 255. );
+ uint8_t merge_weights[1024];
+ for ( int i = 0; i <= 1020; i++ ) merge_weights[i] = 255 - ( uint8_t ) round ( pow ( double ( 1020 - i ) /1020., local_gamma ) * 255. );
int samples_count = width * samplesperpixel;
int left,right;
@@ -613,7 +613,7 @@ int merge ( FileImage* background_image, FileImage* input_images[2][2], FileImag
if ( input_images[y][1] ) right = 2*width;
else right = width;
- for ( uint32 h = 0; h < height / 2; h++ ) {
+ for ( uint32_t h = 0; h < height / 2; h++ ) {
int line = y * height / 2 + h;
From 732b2793833554681e4f8b5116a86b4be41f5a20 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20Satabin?=
Date: Tue, 13 Jan 2026 11:28:22 +0100
Subject: [PATCH 11/14] Refonte de l'outil merge4tiff
Le coeur du calcul est fait dans les classes Image de core-cpp, dont la nouvelle SubsampledImage
---
CHANGELOG.md | 1 +
src/merge4tiff.cpp | 563 +++++++++++++++++----------------------------
2 files changed, 217 insertions(+), 347 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ba4cbda..817b6e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ Le format est basé sur [Keep a Changelog](https://keepachangelog.com/) et ce pr
### Changed
- Refonte du CHANGELOG au format [Keep a Changelog](https://keepachangelog.com/)
- Changement des imports de Cache aux imports spécifiques des classes suite à la séparation du fichier Cache dans core-cpp.
+- Merge4tiff utilise désormais les classes Image, dont la nouvelle SubsampledImage, pour faire le calcul raster
### Deprecated
### Removed
### Fixed
diff --git a/src/merge4tiff.cpp b/src/merge4tiff.cpp
index 54c2561..ce580dc 100644
--- a/src/merge4tiff.cpp
+++ b/src/merge4tiff.cpp
@@ -35,12 +35,33 @@
* knowledge of the CeCILL-C license and that you accept its terms.
*/
+
/**
- * \file merge4tiff.cpp
+ * \page merge4tiff Commande merge4tiff
* \author Institut national de l'information géographique et forestière
+ * \~ \image html merge4tiff.png \~french
* \~french \brief Sous echantillonage de 4 images disposées en carré, avec utilisation possible de fond et de masques de données
* \~english \brief Four images subsampling, formed a square, might use a background and data masks
- * \~ \image html merge4tiff.png
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref merge4tiff.cpp
+ * \section diagram Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{merge4tiff}
+ *
+ */
+
+/** \file merge4tiff.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande merge4tiff
+ *
+ * Le fonctionnement général est décrit dans la page \ref merge4tiff .
+ *
+ * \~english
+ * \brief Implementation file for command merge4tiff
+ *
+ * Global operation is described into page \ref merge4tiff .
*/
#include
@@ -63,29 +84,33 @@ namespace keywords = boost::log::keywords;
#include
#include
#include
+#include
+#include
+#include
#include "config.h"
/* Valeurs de nodata */
/** \~french Valeur de nodata sour forme de chaîne de caractère (passée en paramètre de la commande) */
-char* strnodata;
+char* strnodata = 0;
/* Chemins des images en entrée et en sortie */
/** \~french Chemin de l'image de fond */
-char* background_image_path;
+std::string background_image_path;
/** \~french Chemin du masque associé à l'image de fond */
-char* background_mask_path;
+std::string background_mask_path;
/** \~french Chemins des images en entrée */
-char* input_images_paths[4];
+std::vector input_images_paths = {"", "", "", ""};
+;
/** \~french Chemins des masques associés aux images en entrée */
-char* input_masks_paths[4];
+std::vector input_masks_paths = {"", "", "", ""};
/** \~french Chemin de l'image en sortie */
-char* output_image_path;
+std::string output_image_path;
/** \~french Chemin du masque associé à l'image en sortie */
-char* output_mask_path;
+std::string output_mask_path;
/* Caractéristiques des images en entrée et en sortie */
/** \~french Valeur de gamma, pour foncer ou éclaircir des images en entier */
-double local_gamma;
+double local_gamma = 1.;
/** \~french Largeur des images */
uint32_t width;
/** \~french Hauteur des images */
@@ -181,18 +206,6 @@ void error ( std::string message, int error_code ) {
* \return code de retour, 0 si réussi, -1 sinon
*/
int parse_command_line ( int argc, char* argv[] ) {
- // Initialisation
- local_gamma = 1.;
- strnodata = 0;
- compression = Compression::NONE;
- background_image_path = 0;
- background_mask_path = 0;
- for ( int i=0; i<4; i++ ) {
- input_images_paths[i] = 0;
- input_masks_paths[i] = 0;
- }
- output_image_path = 0;
- output_mask_path = 0;
for ( int i = 1; i < argc; i++ ) {
if ( argv[i][0] == '-' ) {
@@ -246,22 +259,22 @@ int parse_command_line ( int argc, char* argv[] ) {
}
switch ( argv[i-1][2] ) {
case '1':
- input_images_paths[0] = argv[i];
+ input_images_paths[0] = std::string(argv[i]);
break;
case '2':
- input_images_paths[1] = argv[i];
+ input_images_paths[1] = std::string(argv[i]);
break;
case '3':
- input_images_paths[2] = argv[i];
+ input_images_paths[2] = std::string(argv[i]);
break;
case '4':
- input_images_paths[3] = argv[i];
+ input_images_paths[3] = std::string(argv[i]);
break;
case 'b':
- background_image_path = argv[i];
+ background_image_path = std::string(argv[i]);
break;
case 'o':
- output_image_path = argv[i];
+ output_image_path = std::string(argv[i]);
break;
default:
BOOST_LOG_TRIVIAL(error) << "Unknown image's indice : -m" << argv[i-1][2] ;
@@ -275,22 +288,22 @@ int parse_command_line ( int argc, char* argv[] ) {
}
switch ( argv[i-1][2] ) {
case '1':
- input_masks_paths[0] = argv[i];
+ input_masks_paths[0] = std::string(argv[i]);
break;
case '2':
- input_masks_paths[1] = argv[i];
+ input_masks_paths[1] = std::string(argv[i]);
break;
case '3':
- input_masks_paths[2] = argv[i];
+ input_masks_paths[2] = std::string(argv[i]);
break;
case '4':
- input_masks_paths[3] = argv[i];
+ input_masks_paths[3] = std::string(argv[i]);
break;
case 'b':
- background_mask_path = argv[i];
+ background_mask_path = std::string(argv[i]);
break;
case 'o':
- output_mask_path = argv[i];
+ output_mask_path = std::string(argv[i]);
break;
default:
BOOST_LOG_TRIVIAL(error) << "Unknown mask's indice : -m" << argv[i-1][2] ;
@@ -342,7 +355,7 @@ int parse_command_line ( int argc, char* argv[] ) {
BOOST_LOG_TRIVIAL(error) << "Missing nodata value" ;
return -1;
}
- if ( output_image_path == 0 ) {
+ if ( output_image_path.empty() ) {
BOOST_LOG_TRIVIAL(error) << "Missing output file" ;
return -1;
}
@@ -355,10 +368,10 @@ int parse_command_line ( int argc, char* argv[] ) {
* \brief Contrôle les caractéristiques d'une image (format des canaux, tailles) et de son éventuel masque.
* \details Si les composantes sont bonnes, le masque est attaché à l'image.
* \param[in] image image à contrôler
- * \param[in] mask précise éventuellement un masque de donnée
+ * \param[in] position position de l'image (0, 1, 2 ou 3)
* \return code de retour, 0 si réussi, -1 sinon
*/
-int check_components ( FileImage* image, FileImage* mask) {
+int check_components ( FileImage* image, int position ) {
if ( width == 0 ) { // read the parameters of the first input file
width = image->get_width();
@@ -406,19 +419,24 @@ int check_components ( FileImage* image, FileImage* mask) {
}
}
- if (mask != NULL) {
- if ( ! ( mask->get_width() == width && mask->get_height() == height && mask->get_sample_format() == SampleFormat::UINT8 &&
- mask->get_photometric() == Photometric::GRAY && mask->get_channels() == 1 ) ) {
-
- BOOST_LOG_TRIVIAL(error) << "Error : all input masks must have the same parameters (width, height, etc...) : " << mask->get_filename();
- return -1;
- }
-
- if ( ! image->set_mask(mask) ) {
- BOOST_LOG_TRIVIAL(error) << "Cannot add associated mask to the input FileImage " << image->get_filename() ;
- return -1;
- }
-
+ // On va ajouter une bbox pour que le positionnement dans l'ExtendedCompoundImage soit correct
+ switch (position)
+ {
+ case -1:
+ image->set_bbox(BoundingBox (0., 0., width, height));
+ break;
+ case 0:
+ image->set_bbox(BoundingBox (0., height / 2., width / 2., height));
+ break;
+ case 1:
+ image->set_bbox(BoundingBox (width / 2., height / 2., width, height));
+ break;
+ case 2:
+ image->set_bbox(BoundingBox (0., 0., width / 2., height / 2.));
+ break;
+ case 3:
+ image->set_bbox(BoundingBox (width / 2., 0., width, height / 2.));
+ break;
}
if (output_format_provided) {
@@ -436,317 +454,180 @@ int check_components ( FileImage* image, FileImage* mask) {
* \~french
* \brief Contrôle l'ensemble des images et masques, en entrée et sortie
* \details Crée les objets TIFF, contrôle la cohérence des caractéristiques des images en entrée, ouvre les flux de lecture et écriture. Les éventuels masques associés sont ajoutés aux objets FileImage.
- * \param[in] input_images images en entrée
- * \param[in] background_image image de fond en entrée
* \param[in] output_image image en sortie
+ * \param[in] output_mask masque en sortie
+ * \param[in] input_images image composée en entrée
* \return code de retour, 0 si réussi, -1 sinon
*/
-int check_images ( FileImage* input_images[2][2], FileImage*& background_image, FileImage*& output_image, FileImage*& output_mask) {
+int load_images ( FileImage** output_image, FileImage** output_mask, Image **input_image) {
width = 0;
+ std::vector input_images;
+
+ bool missing_image = false;
+ bool with_mask = false;
+
+ BOOST_LOG_TRIVIAL(debug) << "Pack input images" ;
+
for ( int i = 0; i < 4; i++ ) {
BOOST_LOG_TRIVIAL(debug) << "Place " << i ;
// Initialisation
- if ( input_images_paths[i] == 0 ) {
+ if ( input_images_paths[i].empty() ) {
BOOST_LOG_TRIVIAL(debug) << "No image" ;
- input_images[i/2][i%2] = NULL;
+ missing_image = true;
continue;
}
// Image en entrée
FileImage* inputi = FileImage::create_to_read(input_images_paths[i]);
if ( inputi == NULL ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to open input image: " + std::string ( input_images_paths[i] ) ;
+ BOOST_LOG_TRIVIAL(error) << "Unable to open input image: " << input_images_paths[i] ;
return -1;
}
- input_images[i/2][i%2] = inputi;
-
- // Eventuelle masque associé
- FileImage* input_mask = NULL;
- if ( input_masks_paths[i] != 0 ) {
- input_mask = FileImage::create_to_read(input_masks_paths[i]);
- if ( input_mask == NULL ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to open input mask: " << std::string ( input_masks_paths[i] ) ;
+
+ // Eventuel masque associé
+ if ( ! input_masks_paths[i].empty() ) {
+ FileImage* inputm = FileImage::create_to_read(input_masks_paths[i]);
+ if ( inputm == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to open input mask: " << input_masks_paths[i] ;
return -1;
}
+ if (! inputi->set_mask(inputm)) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to associate mask to image input mask: " << input_masks_paths[i] ;
+ return -1;
+ }
+
+ with_mask = true;
}
// Controle des composantes des images/masques et association
BOOST_LOG_TRIVIAL(debug) << "Check" ;
- if ( check_components ( inputi, input_mask ) < 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unvalid components for the image " << std::string ( input_images_paths[i] ) << " (or its mask)" ;
- return -1;
- }
- }
-
- background_image = NULL;
-
- // Si on a quatre image et pas de masque (images considérées comme pleines), le fond est inutile
- if ( input_images_paths[0] && input_images_paths[1] && input_images_paths[2] && input_images_paths[3] &&
- ! input_masks_paths[0] && ! input_masks_paths[1] && ! input_masks_paths[2] && ! input_masks_paths[3] )
-
- background_image_path=0;
-
- if ( background_image_path ) {
- background_image = FileImage::create_to_read(background_image_path);
- if ( background_image == NULL ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to open background image: " + std::string ( background_image_path ) ;
+ if ( check_components ( inputi, i ) < 0 ) {
+ BOOST_LOG_TRIVIAL(error) << "Unvalid components for the image " << input_images_paths[i];
return -1;
}
- FileImage* background_mask = NULL;
-
- if ( background_mask_path ) {
- background_mask = FileImage::create_to_read(background_mask_path);
- if ( background_mask == NULL ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to open background mask: " + std::string ( background_mask_path ) ;
- return -1;
- }
- }
-
- // Controle des composantes des images/masques
- if ( check_components ( background_image, background_mask ) < 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unvalid components for the background image " << std::string ( background_image_path ) << " (or its mask)" ;
- return -1;
- }
+ input_images.push_back(inputi);
}
- /********************** EN SORTIE ***********************/
-
- output_image = NULL;
- output_mask = NULL;
+ BOOST_LOG_TRIVIAL(debug) << "Nodata interpretation" ;
+ // Conversion string->int[] du paramètre nodata
+ int int_nodata[samplesperpixel];
- output_image = FileImage::create_to_write(output_image_path, BoundingBox(0,0,0,0), -1, -1, width, height,
- samplesperpixel, sampleformat, photometric, compression);
- if ( output_image == NULL ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to open output image: " + std::string ( output_image_path ) ;
+ std::vector vector_nodata;
+ boost::split(vector_nodata, strnodata, boost::is_any_of(","));
+ if (vector_nodata.size() != samplesperpixel) {
+ BOOST_LOG_TRIVIAL(error) << "Error with option -n : a value for nodata is missing (" << vector_nodata.size() << " value(s) provided for " << samplesperpixel << " band output)";
+ BOOST_LOG_TRIVIAL(error) << output_format_provided;
return -1;
}
-
- if ( output_mask_path ) {
- output_mask = FileImage::create_to_write(output_mask_path, BoundingBox(0,0,0,0), -1, -1, width, height,
- 1, SampleFormat::UINT8, Photometric::MASK, Compression::DEFLATE);
- if ( output_mask == NULL ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to open output mask: " + std::string ( output_mask_path ) ;
- return -1;
- }
-
- output_image->set_mask(output_mask);
+
+ for ( int i = 0; i < samplesperpixel; i++ ) {
+ int_nodata[i] = atoi ( vector_nodata.at(i).c_str() );
}
- return 0;
-}
-
-
-/**
- * \~french
- * \brief Remplit un buffer à partir d'une ligne d'une image et d'un potentiel masque associé
- * \details les pixels qui ne contiennent pas de donnée sont remplis avec la valeur de nodata
- * \param[in] background_image image de fond à lire
- * \param[out] image_line ligne de l'image en sortie
- * \param[out] mask_line ligne du masque en sortie
- * \param[in] line indice de la ligne source dans l'image (et son masque)
- * \param[in] nodata valeur de nodata
- * \return code de retour, 0 si réussi, -1 sinon
- */
-template
-int fill_background_line ( FileImage* background_image, T* image_line, uint8_t* mask_line, int line, T* nodata ) {
- if ( background_image->get_line( image_line, line ) == 0 ) return 1;
-
- if ( background_image->get_mask() != NULL ) {
- if ( background_image->get_mask()->get_line( mask_line, line ) == 0 ) return 1;
- for ( int w = 0; w < width; w++ ) {
- if ( mask_line[w] == 0 ) {
- memcpy ( image_line + w*samplesperpixel, nodata,samplesperpixel*sizeof ( T ) );
- }
- }
- } else {
- memset ( mask_line,255,width );
+ ExtendedCompoundImage* eci = ExtendedCompoundImage::create(input_images, int_nodata, 0);
+ if ( eci == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to pack input images";
+ return -1;
}
+ ExtendedCompoundMask* ecm = new ExtendedCompoundMask(eci);
- return 0;
-}
-
-/**
- * \~french
- * \brief Fusionne les 4 images en entrée et le masque de fond dans l'image de sortie
- * \details Dans le cas entier, lors de la moyenne des 4 pixels, on utilise une valeur de gamma qui éclaircit (si supérieure à 1.0) ou fonce (si inférieure à 1.0) le résultat. Si gamma vaut 1, le résultat est une moyenne classique. Les masques sont déjà associé aux objets FileImage, sauf pour l'image de sortie.
- * \param[in] background_image image de fond en entrée
- * \param[in] input_images images en entrée
- * \param[in] output_image image en sortie
- * \param[in] output_image éventuel masque en sortie
- * \return code de retour, 0 si réussi, -1 sinon
- */
-template
-int merge ( FileImage* background_image, FileImage* input_images[2][2], FileImage* output_image, FileImage* output_mask, T* nodata ) {
-
- uint8_t merge_weights[1024];
- for ( int i = 0; i <= 1020; i++ ) merge_weights[i] = 255 - ( uint8_t ) round ( pow ( double ( 1020 - i ) /1020., local_gamma ) * 255. );
-
- int samples_count = width * samplesperpixel;
- int left,right;
-
- T background_image_line[samples_count];
- uint8_t background_mask_line[width];
-
- int data_count;
- float pixel[samplesperpixel];
-
- T input_images_line_1[2*samples_count];
- uint8_t input_masks_line_1[2*width];
-
- T input_images_line_2[2*samples_count];
- uint8_t input_masks_line_2[2*width];
-
- T output_image_line[samples_count];
- uint8_t output_mask_line[width];
-
- // ----------- initialisation du fond -----------
- for ( int i = 0; i < samples_count ; i++ )
- background_image_line[i] = nodata[i%samplesperpixel];
+ if (! eci->set_mask(ecm)) {
+ BOOST_LOG_TRIVIAL(error) << "Cannot add mask to the Image's pack";
+ return -1;
+ }
- memset ( background_mask_line,0,width );
+ SubsampledImage* si = SubsampledImage::create(eci, 2, 2);
+ if ( si == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to subsample input images";
+ return -1;
+ }
- for ( int y = 0; y < 2; y++ ) {
- if ( input_images[y][0] ) left = 0;
- else left = width;
- if ( input_images[y][1] ) right = 2*width;
- else right = width;
+ SubsampledImage* sm = SubsampledImage::create(ecm, 2, 2);
+ if ( si == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to subsample input masks";
+ return -1;
+ }
- for ( uint32_t h = 0; h < height / 2; h++ ) {
+ if (! si->set_mask(sm)) {
+ BOOST_LOG_TRIVIAL(error) << "Cannot add mask to the Subsmapled image";
+ return -1;
+ }
- int line = y * height / 2 + h;
+ *input_image = si;
- // ------------------- le fond ------------------
- if ( background_image )
- if ( fill_background_line ( background_image, background_image_line, background_mask_line, line, nodata ) ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read background line" ;
- return -1;
- }
+ // Si il manque une image ou qu'on a au moins un masque, on doit prendre en compte le fond
+ if ( (missing_image || with_mask) && ! background_image_path.empty() ) {
+ BOOST_LOG_TRIVIAL(debug) << "Add background" ;
- if ( left == right ) {
- // On n'a pas d'image en entrée pour cette ligne, on stocke le fond et on passe à la suivante
- if ( output_image->write_line( background_image_line, line ) == -1 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to write image's line " << line ;
- return -1;
- }
- if ( output_mask )
- if ( output_mask->write_line( background_mask_line, line ) == -1 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to write mask's line " << line ;
- return -1;
- }
+ FileImage* bgi = FileImage::create_to_read(background_image_path);
+ if ( bgi == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to open background image: " << background_image_path ;
+ return -1;
+ }
- continue;
+ if ( ! background_mask_path.empty() ) {
+ FileImage* bgm = FileImage::create_to_read(background_mask_path);
+ if ( bgm == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to open background mask: " << background_mask_path ;
+ return -1;
}
-
- // -- initialisation de la sortie avec le fond --
- memcpy ( output_image_line,background_image_line,samples_count*sizeof ( T ) );
- memcpy ( output_mask_line,background_mask_line,width );
-
- memset ( input_masks_line_1,255,2*width );
- memset ( input_masks_line_2,255,2*width );
-
- // ----------------- les images -----------------
- // ------ et les éventuels masques --------------
- if ( input_images[y][0] ) {
- if ( input_images[y][0]->get_line( input_images_line_1, 2*h ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
- if ( input_images[y][0]->get_line( input_images_line_2, 2*h+1 ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
-
- if ( input_images[y][0]->get_mask() ) {
- if ( input_images[y][0]->get_mask()->get_line( input_masks_line_1, 2*h ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
- if ( input_images[y][0]->get_mask()->get_line( input_masks_line_2, 2*h+1 ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
- }
+ if (! bgi->set_mask(bgm)) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to associate background mask to background image: " << background_mask_path ;
+ return -1;
}
+ }
- if ( input_images[y][1] ) {
- if ( input_images[y][1]->get_line( input_images_line_1 + samples_count, 2*h ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
- if ( input_images[y][1]->get_line( input_images_line_2 + samples_count, 2*h+1 ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
-
- if ( input_images[y][1]->get_mask() ) {
- if ( input_images[y][1]->get_mask()->get_line( input_masks_line_1 + width, 2*h ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
- if ( input_images[y][1]->get_mask()->get_line( input_masks_line_2 + width, 2*h+1 ) == 0 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to read data line" ;
- return -1;
- }
- }
- }
+ // Controle des composantes des images/masques
+ BOOST_LOG_TRIVIAL(debug) << "Check" ;
+ if ( check_components ( bgi, -1 ) < 0 ) {
+ BOOST_LOG_TRIVIAL(error) << "Unvalid components for the background image " << background_image_path << " (or its mask)" ;
+ return -1;
+ }
- // ----------------- la moyenne ----------------
- for ( int input_pixel = left, input_sample = left * samplesperpixel; input_pixel < right;
- input_pixel += 2, input_sample += 2*samplesperpixel ) {
+ std::vector with_bg = {bgi, si};
+ MergeImage* mi = MergeImage::create(with_bg, samplesperpixel, int_nodata, NULL, Merge::NORMAL );
- memset ( pixel,0,samplesperpixel*sizeof ( float ) );
- data_count = 0;
+ MergeMask* merged_mask = new MergeMask ( mi );
- if ( input_masks_line_1[input_pixel] ) {
- data_count++;
- for ( int c = 0; c < samplesperpixel; c++ ) pixel[c] += input_images_line_1[input_sample+c];
- }
+ if (! mi->set_mask(merged_mask)) {
+ BOOST_LOG_TRIVIAL(error) << "Cannot add mask to the Image's pack with background";
+ return -1;
+ }
- if ( input_masks_line_1[input_pixel+1] ) {
- data_count++;
- for ( int c = 0; c < samplesperpixel; c++ ) pixel[c] += input_images_line_1[input_sample+samplesperpixel+c];
- }
+ *input_image = mi;
+ }
- if ( input_masks_line_2[input_pixel] ) {
- data_count++;
- for ( int c = 0; c < samplesperpixel; c++ ) pixel[c] += input_images_line_2[input_sample+c];
- }
+ /********************** EN SORTIE ***********************/
- if ( input_masks_line_2[input_pixel+1] ) {
- data_count++;
- for ( int c = 0; c < samplesperpixel; c++ ) pixel[c] += input_images_line_2[input_sample+samplesperpixel+c];
- }
+ *output_image = NULL;
+ *output_mask = NULL;
- if ( data_count > 1 ) {
- output_mask_line[input_pixel/2] = 255;
- if ( sizeof ( T ) == 1 ) {
- // Cas entier : utilisation d'un gamma
- for ( int c = 0; c < samplesperpixel; c++ ) output_image_line[input_sample/2+c] = merge_weights[ ( int ) pixel[c]*4/data_count];
- } else if ( sizeof ( T ) == 4 ) {
- for ( int c = 0; c < samplesperpixel; c++ ) output_image_line[input_sample/2+c] = pixel[c]/ ( float ) data_count;
- }
- }
- }
+ *output_image = FileImage::create_to_write(output_image_path, BoundingBox(0,0,0,0), -1, -1, width, height,
+ samplesperpixel, sampleformat, photometric, compression);
+ if ( output_image == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to open output image: " << output_image_path ;
+ return -1;
+ }
- if ( output_image->write_line( output_image_line, line ) == -1 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to write image" ;
- return -1;
- }
- if ( output_mask ) {
- if ( output_mask->write_line( output_mask_line, line ) == -1 ) {
- BOOST_LOG_TRIVIAL(error) << "Unable to write mask" ;
- return -1;
- }
- }
+ if ( ! output_mask_path.empty() ) {
+ *output_mask = FileImage::create_to_write(output_mask_path, BoundingBox(0,0,0,0), -1, -1, width, height,
+ 1, SampleFormat::UINT8, Photometric::MASK, Compression::DEFLATE);
+ if ( *output_mask == NULL ) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to open output mask: " << output_mask_path ;
+ return -1;
}
}
return 0;
}
+// uint8_t merge_weights[1024];
+// for ( int i = 0; i <= 1020; i++ ) merge_weights[i] = 255 - ( uint8_t ) round ( pow ( double ( 1020 - i ) /1020., local_gamma ) * 255. );
+
+
/**
** \~french
* \brief Fonction principale de l'outil merge4tiff
@@ -761,9 +642,7 @@ int merge ( FileImage* background_image, FileImage* input_images[2][2], FileImag
* \return 0 if success, -1 otherwise
*/
int main ( int argc, char* argv[] ) {
- FileImage* input_images[2][2];
- for ( int i = 0; i < 2; i++ ) for ( int j = 0; j < 2; j++ ) input_images[i][j] = NULL;
- FileImage* background_image = NULL;
+ Image* input_image = NULL;
FileImage* output_image = NULL;
FileImage* output_mask = NULL;
@@ -792,61 +671,51 @@ int main ( int argc, char* argv[] ) {
output_format_provided = true;
}
- BOOST_LOG_TRIVIAL(debug) << "Check images" ;
- // Controle des images
- if ( check_images ( input_images, background_image, output_image, output_mask ) < 0 ) {
- if ( background_image ) delete background_image;
+ BOOST_LOG_TRIVIAL(debug) << "Load images" ;
+ // Chargement des images
+ if ( load_images ( &output_image, &output_mask, &input_image ) < 0 ) {
+ if (input_image) delete input_image;
+ if (output_image) delete output_image;
+ if (output_mask) delete output_mask;
- for ( int i = 0; i < 2; i++ ) for ( int j = 0; j < 2; j++ ) {
- if ( input_images[i][j] ) {
- delete input_images[i][j] ;
- }
- }
- error ( "Echec controle des images",-1 );
+ error ( "Echec chargement des images",-1 );
}
- BOOST_LOG_TRIVIAL(debug) << "Nodata interpretation" ;
- // Conversion string->int[] du paramètre nodata
- int int_nodata[samplesperpixel];
-
- std::vector vector_nodata;
- boost::split(vector_nodata, strnodata, boost::is_any_of(","));
- if (vector_nodata.size() != samplesperpixel) error ( "Error with option -n : a value for nodata is missing",-1 );
-
- for ( int i = 0; i < samplesperpixel; i++ ) {
- int_nodata[i] = atoi ( vector_nodata.at(i).c_str() );
+ BOOST_LOG_TRIVIAL(debug) << "Save image";
+ // Enregistrement de l'image fusionnée
+ if (output_image->write_image(input_image) < 0) {
+ if (input_image) delete input_image;
+ if (output_image) delete output_image;
+ if (output_mask) delete output_mask;
+ CrsBook::clean_crss();
+ ProjPool::clean_projs();
+ proj_cleanup();
+ error("Echec enregistrement de l image finale", -1);
}
- // Cas MNT
- if ( sampleformat == SampleFormat::FLOAT32 ) {
- BOOST_LOG_TRIVIAL(debug) << "Merge images (float)" ;
- float nodata[samplesperpixel];
- for ( int i = 0; i < samplesperpixel; i++ ) nodata[i] = ( float ) int_nodata[i];
- if ( merge ( background_image, input_images, output_image, output_mask, nodata ) < 0 ) error ( "Unable to merge float images",-1 );
- }
- // Cas images
- else if ( sampleformat == SampleFormat::UINT8 ) {
- BOOST_LOG_TRIVIAL(debug) << "Merge images (uint8_t)" ;
- uint8_t nodata[samplesperpixel];
- for ( int i = 0; i < samplesperpixel; i++ ) nodata[i] = ( uint8_t ) int_nodata[i];
- if ( merge ( background_image, input_images, output_image, output_mask, nodata ) < 0 ) error ( "Unable to merge integer images",-1 );
- } else {
- error ( "Unhandled sample's format",-1 );
+ if (output_mask != NULL) {
+ BOOST_LOG_TRIVIAL(debug) << "Save mask";
+ // Enregistrement du masque fusionné, si demandé
+ if (output_mask->write_image(input_image->Image::get_mask()) < 0) {
+ if (input_image) delete input_image;
+ if (output_image) delete output_image;
+ if (output_mask) delete output_mask;
+ CrsBook::clean_crss();
+ ProjPool::clean_projs();
+ proj_cleanup();
+ error("Echec enregistrement du masque final", -1);
+ }
}
BOOST_LOG_TRIVIAL(debug) << "Clean" ;
+ if (input_image) delete input_image;
+ if (output_image) delete output_image;
+ if (output_mask) delete output_mask;
+
CrsBook::clean_crss();
ProjPool::clean_projs();
proj_cleanup();
-
- if ( background_image ) delete background_image;
-
- for ( int i = 0; i < 2; i++ ) for ( int j = 0; j < 2; j++ ) {
- if ( input_images[i][j] ) delete input_images[i][j] ;
- }
-
- delete output_image;
}
From 18711d01241d1615e4e916338a2d148682d71b54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20Satabin?=
Date: Tue, 13 Jan 2026 14:53:36 +0100
Subject: [PATCH 12/14] =?UTF-8?q?Am=C3=A9lioration=20de=20la=20documentati?=
=?UTF-8?q?on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Ajout d'une page d'accueil dans la documentation doxygen
* Ajout de diagrammes pour expliciter l'usage des classes Image dans les outils
---
CHANGELOG.md | 2 +
CMakeLists.txt | 7 +-
docs/diagrams/cache2work.mmd | 21 +++++
docs/diagrams/checkWork.mmd | 14 ++++
docs/diagrams/composeNtiff.mmd | 27 +++++++
docs/diagrams/decimateNtiff.mmd | 39 +++++++++
docs/diagrams/manageNodata.mmd | 35 ++++++++
docs/diagrams/merge4tiff.mmd | 45 +++++++++++
docs/diagrams/mergeNtiff.mmd | 75 ++++++++++++++++++
docs/diagrams/overlayNtiff.mmd | 27 +++++++
docs/diagrams/pbf2cache.mmd | 24 ++++++
docs/diagrams/work2cache.mmd | 22 +++++
docs/doxygen/doxygen-awesome.css | 2 +
docs/doxygen/footer.html | 12 +++
docs/doxygen/header.html | 4 +-
docs/doxygen/main.doxygen.md | 1 -
docs/doxygen/mainpage.cpp | 26 ++++++
.../{mergeNtiff_legende.png => legende.png} | Bin
src/cache2work.cpp | 30 +++++--
src/checkWork.cpp | 23 +++++-
src/composeNtiff.cpp | 26 +++++-
src/decimateNtiff.cpp | 43 +++++++---
src/manageNodata.cpp | 31 ++++++--
src/merge4tiff.cpp | 8 +-
src/mergeNtiff.cpp | 45 ++++++++---
src/overlayNtiff.cpp | 26 +++++-
src/pbf2cache.cpp | 26 +++++-
src/work2cache.cpp | 32 ++++++--
28 files changed, 622 insertions(+), 51 deletions(-)
create mode 100644 docs/diagrams/cache2work.mmd
create mode 100644 docs/diagrams/checkWork.mmd
create mode 100644 docs/diagrams/composeNtiff.mmd
create mode 100644 docs/diagrams/decimateNtiff.mmd
create mode 100644 docs/diagrams/manageNodata.mmd
create mode 100644 docs/diagrams/merge4tiff.mmd
create mode 100644 docs/diagrams/mergeNtiff.mmd
create mode 100644 docs/diagrams/overlayNtiff.mmd
create mode 100644 docs/diagrams/pbf2cache.mmd
create mode 100644 docs/diagrams/work2cache.mmd
create mode 100644 docs/doxygen/footer.html
delete mode 100644 docs/doxygen/main.doxygen.md
create mode 100644 docs/doxygen/mainpage.cpp
rename docs/images/{mergeNtiff_legende.png => legende.png} (100%)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 817b6e5..383f42f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ Le format est basé sur [Keep a Changelog](https://keepachangelog.com/) et ce pr
## [Unreleased]
### Added
- Possibilité de définir un timeout via la variable d'environnement `ROK4_NETWORK_TIMEOUT` (valeur à fournir en seconde) pour les intéraction avec le stockage Swift ou S3
+- Ajout de diagrammes pour comprendre l'usage des classes Image dans les différents outils
+- Amélioration de la documentation Doxygen
### Changed
- Refonte du CHANGELOG au format [Keep a Changelog](https://keepachangelog.com/)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bf22fcb..49e685d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -88,15 +88,18 @@ if(DOC_ENABLED)
set(DOXYGEN_OUTPUT_LANGUAGE french)
set(DOXYGEN_INPUT_ENCODING UTF-8)
set(DOXYGEN_IMAGE_PATH docs/images)
+ set(DOXYGEN_EXAMPLE_PATH docs/diagrams)
set(DOXYGEN_RECURSIVE YES)
+ set(DOXYGEN_PROJECT_NAME "Suite d'outils de génération ROK4")
set(DOXYGEN_GENERATE_HTML YES)
set(DOXYGEN_GENERATE_LATEX NO)
- set(DOXYGEN_USE_MDFILE_AS_MAINPAGE docs/main.doxygen.md)
+ set(DOXYGEN_ALIASES mermaid{1}=\"@htmlonly ^^ @endhtmlonly @htmlinclude \\\"\\1.mmd\\\" @htmlonly ^^
@endhtmlonly\")
set(DOXYGEN_GENERATE_TREEVIEW YES)
- set(DOXYGEN_DISABLE_INDEX NO)
+ set(DOXYGEN_DISABLE_INDEX YES)
set(DOXYGEN_HAVE_DOT NO)
set(DOXYGEN_FULL_SIDEBAR NO)
set(DOXYGEN_HTML_HEADER docs/doxygen/header.html)
+ set(DOXYGEN_HTML_FOOTER docs/doxygen/footer.html)
set(DOXYGEN_HTML_EXTRA_STYLESHEET ${CMAKE_CURRENT_SOURCE_DIR}/docs/doxygen/doxygen-awesome.css)
set(DOXYGEN_HTML_COLORSTYLE LIGHT)
diff --git a/docs/diagrams/cache2work.mmd b/docs/diagrams/cache2work.mmd
new file mode 100644
index 0000000..2a68ab6
--- /dev/null
+++ b/docs/diagrams/cache2work.mmd
@@ -0,0 +1,21 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "Rok4Image"}
+ img1_notes@{ shape: braces, label: "image en entrée
+en lecture"}
+ img1 -.- img1_notes
+
+ img2@{ shape: proc, label: "FileImage"}
+ img2_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img2 -.- img2_notes
+
+ img1 write@-- est lue ligne par ligne pour écrire --> img2
+ write@{ animate: true }
+
diff --git a/docs/diagrams/checkWork.mmd b/docs/diagrams/checkWork.mmd
new file mode 100644
index 0000000..4db535a
--- /dev/null
+++ b/docs/diagrams/checkWork.mmd
@@ -0,0 +1,14 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "image en entrée
+en lecture
+si la création est en succès, la commande sort en succès"}
+ img1 -.- img1_notes
+
diff --git a/docs/diagrams/composeNtiff.mmd b/docs/diagrams/composeNtiff.mmd
new file mode 100644
index 0000000..8701f91
--- /dev/null
+++ b/docs/diagrams/composeNtiff.mmd
@@ -0,0 +1,27 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "1 par image en entrée
+en lecture"}
+ img1 -.- img1_notes
+
+ img2@{ shape: proc, label: "CompoundImage"}
+
+ img2 --> img1
+
+ img8@{ shape: proc, label: "FileImage"}
+ img8_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img8 -.- img8_notes
+
+ img2 write@-- est lue ligne par ligne pour écrire --> img8
+ write@{ animate: true }
+
+ classDef optionnal stroke-dasharray: 5 5;
+ class img5,img4 optionnal
diff --git a/docs/diagrams/decimateNtiff.mmd b/docs/diagrams/decimateNtiff.mmd
new file mode 100644
index 0000000..1cf3d02
--- /dev/null
+++ b/docs/diagrams/decimateNtiff.mmd
@@ -0,0 +1,39 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "1 par image en entrée à décimer
+en lecture
+avec un éventuel convertisseur"}
+ img1 -.- img1_notes
+
+ img2@{ shape: proc, label: "FileImage"}
+ img2_notes@{ shape: braces, label: "1 pour l'image de fond
+en lecture"}
+ img2 -.- img2_notes
+
+ img3@{ shape: proc, label: "ExtendedCompoundImage"}
+
+ img4@{ shape: proc, label: "DecimatedImage"}
+ img4 --> img3 --> img1
+
+ img5@{ shape: proc, label: "ExtendedCompoundImage"}
+
+ img5 --> img4
+ img5 -- si il y a un fond --> img2
+
+ img8@{ shape: proc, label: "FileImage"}
+ img8_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img8 -.- img8_notes
+
+ img5 write@-- est lue ligne par ligne pour écrire --> img8
+ write@{ animate: true }
+
+ classDef optionnal stroke-dasharray: 5 5;
+ class img2 optionnal
diff --git a/docs/diagrams/manageNodata.mmd b/docs/diagrams/manageNodata.mmd
new file mode 100644
index 0000000..625d108
--- /dev/null
+++ b/docs/diagrams/manageNodata.mmd
@@ -0,0 +1,35 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+
+ subgraph tnm["TiffNodataManager"]
+ direction TB
+
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "1 seul image en entrée
+ en lecture"}
+ img1 -.- img1_notes
+
+ proc{{determine les pixels de nodata}}
+
+ img1 write1@-- est lue en entier --> proc
+ write1@{ animate: true }
+
+ img8@{ shape: proc, label: "FileImage"}
+ img8_notes@{ shape: braces, label: "image en sortie
+ en écriture"}
+ img8 -.- img8_notes
+
+ proc write2@-- donnée bufferisée écrite --> img8
+ write2@{ animate: true }
+
+ end
+
+
+ classDef optionnal stroke-dasharray: 5 5;
+ class img2 optionnal
diff --git a/docs/diagrams/merge4tiff.mmd b/docs/diagrams/merge4tiff.mmd
new file mode 100644
index 0000000..b2a7bb4
--- /dev/null
+++ b/docs/diagrams/merge4tiff.mmd
@@ -0,0 +1,45 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "1 par image de coin en entrée
+jusqu'à 4
+en lecture
+avec un éventuel convertisseur"}
+ img1 -.- img1_notes
+
+ img2@{ shape: proc, label: "ExtendedCompoundImage"}
+ img3@{ shape: proc, label: "SubsampledImage"}
+
+ img3 --> img2 --> img1
+
+ img5@{ shape: proc, label: "MergeImage"}
+ img4@{ shape: proc, label: "FileImage"}
+ img4_notes@{ shape: braces, label: "1 seule pour l'image de fond
+en lecture"}
+ img4 -.- img4_notes
+ img5 --> img4
+ img5 --> img3
+
+ input{Au choix}
+
+
+ img8@{ shape: proc, label: "FileImage"}
+ img8_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img8 -.- img8_notes
+
+ input write1@-- est lue ligne par ligne pour écrire --> img8
+ img3 write2@-- si pas de fond fourni --> input
+ img5 write3@-- si un fond est fourni --> input
+ write1@{ animate: true }
+ write2@{ animate: true }
+ write3@{ animate: true }
+
+ classDef optionnal stroke-dasharray: 5 5;
+ class img5,img4 optionnal
diff --git a/docs/diagrams/mergeNtiff.mmd b/docs/diagrams/mergeNtiff.mmd
new file mode 100644
index 0000000..9f6c603
--- /dev/null
+++ b/docs/diagrams/mergeNtiff.mmd
@@ -0,0 +1,75 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "1 par image en entrée
+en lecture
+avec un éventuel convertisseur"}
+ img1 -.- img1_notes
+
+ subgraph paquet[" "]
+ direction TB
+ img2@{ shape: proc, label: "MirrorImage"}
+ img2_notes@{ shape: braces, label: "4 par image en entrée
+ si reprojection ou réechantillonnage"}
+ img2 -.- img2_notes
+
+ img3@{ shape: proc, label: "ExtendedCompoundImage"}
+ img3_notes@{ shape: braces, label: "1 par paquet d'image en entrée compatibles entre elles"}
+ img3 -.- img3_notes
+
+ subgraph styled["Si un style est appliqué"]
+ direction TB
+ subgraph img4["Au choix"]
+ direction LR
+ img41@{ shape: proc, label: "EstompageImage"}
+ img42@{ shape: proc, label: "PenteImage"}
+ img43@{ shape: proc, label: "AspectImage"}
+ img41 ~~~ img42 ~~~ img43
+ end
+ img4_notes@{ shape: braces, label: "Si le style contient une section associée"}
+ img4 -.- img4_notes
+
+ img5@{ shape: proc, label: "PaletteImage"}
+ img5_notes@{ shape: braces, label: "Si le style contient une palette non vide"}
+ img5 -.- img5_notes
+ end
+
+ subgraph img6["Au choix"]
+ direction LR
+ img61@{ shape: proc, label: "None"}
+ img62@{ shape: proc, label: "ResampledImage"}
+ img63@{ shape: proc, label: "ReprojectedImage"}
+ end
+ end
+ paquet_notes@{ shape: braces, label: "Par paquet d'images en entrée compatibles entre elles"}
+ paquet -.- paquet_notes
+
+ img7@{ shape: proc, label: "ExtendedCompoundImage"}
+
+ img3 -- en fin des images sources --> img1
+ img3 -- en tête des images sources --> img2 --> img1
+ img5 --> img4
+ styled --> img3
+
+ img7 -- "Si le paquet d'images en entrée est en phase avec la sortie" --- img61
+ img7 -- "Si le paquet d'images en entrée a la même projection que la sortie déphasé" --> img62
+ img7 -- "Si le paquet d'images en entrée a une projection différente de la sortie" --> img63
+ img6 --> styled
+
+ img8@{ shape: proc, label: "FileImage"}
+ img8_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img8 -.- img8_notes
+
+ img7 write@-- est lue ligne par ligne pour écrire --> img8
+ write@{ animate: true }
+
+ classDef optionnal stroke-dasharray: 5 5;
+ class img2,img41,img42,img43,img5,styled optionnal
+ class img61 invisible
diff --git a/docs/diagrams/overlayNtiff.mmd b/docs/diagrams/overlayNtiff.mmd
new file mode 100644
index 0000000..017009d
--- /dev/null
+++ b/docs/diagrams/overlayNtiff.mmd
@@ -0,0 +1,27 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "1 par image en entrée
+en lecture"}
+ img1 -.- img1_notes
+
+ img2@{ shape: proc, label: "MergeImage"}
+
+ img2 --> img1
+
+ img8@{ shape: proc, label: "FileImage"}
+ img8_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img8 -.- img8_notes
+
+ img2 write@-- est lue ligne par ligne pour écrire --> img8
+ write@{ animate: true }
+
+ classDef optionnal stroke-dasharray: 5 5;
+ class img2 optionnal
diff --git a/docs/diagrams/pbf2cache.mmd b/docs/diagrams/pbf2cache.mmd
new file mode 100644
index 0000000..d3f2fb1
--- /dev/null
+++ b/docs/diagrams/pbf2cache.mmd
@@ -0,0 +1,24 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+
+ pbf[[ifstream]]
+ pbf_notes@{ shape: braces, label: "1 par tuile PBF en entrée
+en lecture"}
+ pbf -.- pbf_notes
+
+ img8@{ shape: proc, label: "Rok4Image"}
+ img8_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img8 -.- img8_notes
+
+ pbf write@-- est lue en entier pour écrire tuile par tuile --> img8
+ write@{ animate: true }
+
+ classDef optionnal stroke-dasharray: 5 5;
+ class img2 optionnal
diff --git a/docs/diagrams/work2cache.mmd b/docs/diagrams/work2cache.mmd
new file mode 100644
index 0000000..06dd6f8
--- /dev/null
+++ b/docs/diagrams/work2cache.mmd
@@ -0,0 +1,22 @@
+---
+config:
+ theme: neutral
+ flowchart:
+ htmlLabels: false
+---
+
+flowchart TB
+ img1@{ shape: proc, label: "FileImage"}
+ img1_notes@{ shape: braces, label: "image en entrée
+en lecture
+avec un éventuel convertisseur"}
+ img1 -.- img1_notes
+
+ img2@{ shape: proc, label: "Rok4Image"}
+ img2_notes@{ shape: braces, label: "image en sortie
+en écriture"}
+ img2 -.- img2_notes
+
+ img1 write@-- est lue ligne par ligne pour écrire --> img2
+ write@{ animate: true }
+
diff --git a/docs/doxygen/doxygen-awesome.css b/docs/doxygen/doxygen-awesome.css
index e8399cb..f35e4bf 100644
--- a/docs/doxygen/doxygen-awesome.css
+++ b/docs/doxygen/doxygen-awesome.css
@@ -1985,6 +1985,8 @@ hr {
.contents img, .contents .center, .contents center, .contents div.image object {
max-width: 100%;
overflow: auto;
+ margin-top: 20px;
+ margin-bottom: 20px;
}
@media screen and (max-width: 767px) {
diff --git a/docs/doxygen/footer.html b/docs/doxygen/footer.html
new file mode 100644
index 0000000..552ff3f
--- /dev/null
+++ b/docs/doxygen/footer.html
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/docs/doxygen/main.doxygen.md b/docs/doxygen/main.doxygen.md
deleted file mode 100644
index bd2192f..0000000
--- a/docs/doxygen/main.doxygen.md
+++ /dev/null
@@ -1 +0,0 @@
-Ces outils s'appuient sur la [librairie ROK4 C++](https://rok4.github.io/core-cpp/). Ils sont à la base du calcul des pyramides, format des données central du projet.
\ No newline at end of file
diff --git a/docs/doxygen/mainpage.cpp b/docs/doxygen/mainpage.cpp
new file mode 100644
index 0000000..186d00c
--- /dev/null
+++ b/docs/doxygen/mainpage.cpp
@@ -0,0 +1,26 @@
+
+/** \mainpage Suite d'outils de génération ROK4
+ *
+ * \~french
+ *
+ * Ces outils s'appuient sur la librairie ROK4 C++ . Ils sont à la base du calcul des pyramides, format des données central du projet.
+ *
+ * \li \ref cache2work
+ * \li \ref checkWork
+ * \li \ref composeNtiff
+ * \li \ref decimateNtiff
+ * \li \ref manageNodata
+ * \li \ref merge4tiff
+ * \li \ref mergeNtiff
+ * \li \ref overlayNtiff
+ * \li \ref pbf2cache
+ * \li \ref work2cache
+ *
+ * La légende utilisée dans tous les schémas de la documentation sera la suivante
+ *
+ * \~english Global operation is described into page \ref mergeNtiff . Used legend for next schemas will be next one
+ *
+ * \~ \image html legende.png
+ *
+ * \~ \image html formats.png
+*/
\ No newline at end of file
diff --git a/docs/images/mergeNtiff_legende.png b/docs/images/legende.png
similarity index 100%
rename from docs/images/mergeNtiff_legende.png
rename to docs/images/legende.png
diff --git a/src/cache2work.cpp b/src/cache2work.cpp
index 89e6d76..3d799c1 100644
--- a/src/cache2work.cpp
+++ b/src/cache2work.cpp
@@ -36,12 +36,32 @@
*/
/**
- * \file cache2work.cpp
+ * \page cache2work Commande cache2work
* \author Institut national de l'information géographique et forestière
- * \~french \brief Convertit une image d'une pyramide ROK4 (TIFF tuilé) en une image TIFF, lisible avec LibtiffImage
- * \~french \details Certains formats sont propres aux spécifications d'une pyramide d'images ROK4 (format PNG).
- * Vision libimage : Rok4Image -> FileImage
- * \~english \brief Convert a ROK4 pyramide's image (tiled TIFF) to a TIFF image, readable with LibtiffImage
+ * \~ \image html cache2work.png \~french
+ * \~french \brief Convertit une image d'une pyramide ROK4 (TIFF tuilé) en une image TIFF standard
+ * \~english \brief Convert a ROK4 pyramide's image (tiled TIFF) to a standard TIFF image
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref cache2work.cpp
+ *
+ * \section diagram_cache2work Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{cache2work}
+ *
+ */
+
+/** \file cache2work.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande cache2work
+ *
+ * Le fonctionnement général est décrit dans la page \ref cache2work .
+ *
+ * \~english
+ * \brief Implementation file for command cache2work
+ *
+ * Global operation is described into page \ref cache2work .
*/
#include
diff --git a/src/checkWork.cpp b/src/checkWork.cpp
index dab2c0e..4d9d826 100644
--- a/src/checkWork.cpp
+++ b/src/checkWork.cpp
@@ -36,10 +36,31 @@
*/
/**
- * \file checkWork.cpp
+ * \page checkWork Commande checkWork
* \author Institut national de l'information géographique et forestière
* \~french \brief Contrôle la validité d'une image
* \~english \brief Control image validity
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref checkWork.cpp
+ *
+ * \section diagram_checkWork Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{checkWork}
+ *
+ */
+
+/** \file checkWork.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande checkWork
+ *
+ * Le fonctionnement général est décrit dans la page \ref checkWork .
+ *
+ * \~english
+ * \brief Implementation file for command checkWork
+ *
+ * Global operation is described into page \ref checkWork .
*/
#include
diff --git a/src/composeNtiff.cpp b/src/composeNtiff.cpp
index c2f4717..23ff98e 100644
--- a/src/composeNtiff.cpp
+++ b/src/composeNtiff.cpp
@@ -36,10 +36,32 @@
*/
/**
- * \file composeNtiff.cpp
+ * \page composeNtiff Commande composeNtiff
* \author Institut national de l'information géographique et forestière
+ * \~ \image html composeNtiff.png \~french
* \~french \brief Montage de N images TIFF aux mêmes dimensions et caractéristiques
* \~english \brief Monte N TIFF images with same dimensions and attributes
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref composeNtiff.cpp
+ *
+ * \section diagram_composeNtiff Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{composeNtiff}
+ *
+ */
+
+/** \file composeNtiff.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande composeNtiff
+ *
+ * Le fonctionnement général est décrit dans la page \ref composeNtiff .
+ *
+ * \~english
+ * \brief Implementation file for command composeNtiff
+ *
+ * Global operation is described into page \ref composeNtiff .
*/
#include
@@ -222,7 +244,7 @@ int parse_command_line ( int argc, char** argv ) {
/**
* \~french
* \brief Charge les images contenues dans le dossier en entrée et l'image de sortie
- * \details Toutes les images doivent avoir les mêmes caractéristiques, dimensions et type des canaux. Les images en entrée seront gérée par un objet de la classe #CompoundImage, et l'image en sortie sera une image TIFF.
+ * \details Toutes les images doivent avoir les mêmes caractéristiques, dimensions et type des canaux. Les images en entrée seront gérée par un objet de la classe CompoundImage, et l'image en sortie sera une image TIFF.
*
* \param[out] output_image image résultante de l'outil
* \param[out] compound_image ensemble des images en entrée
diff --git a/src/decimateNtiff.cpp b/src/decimateNtiff.cpp
index d3d3bb1..dd614b0 100644
--- a/src/decimateNtiff.cpp
+++ b/src/decimateNtiff.cpp
@@ -36,13 +36,35 @@
*/
/**
- * \file decimateNtiff.cpp
+ * \page decimateNtiff Commande decimateNtiff
* \author Institut national de l'information géographique et forestière
- * \~french \brief Création d'une image TIFF géoréférencée à partir de n images sources géoréférencées
- * \~english \brief Create one georeferenced TIFF image from several georeferenced images
* \~ \image html decimateNtiff.png \~french
+ * \~french \brief Création d'une image TIFF géoréférencée à partir de n images sources géoréférencées par décimation
+ * \~english \brief Create one georeferenced TIFF image from several georeferenced images with decimation
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref decimateNtiff.cpp
+ *
+ * \section diagram_decimateNtiff Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{decimateNtiff}
+ *
+ */
+
+/** \file decimateNtiff.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande decimateNtiff
+ *
+ * Le fonctionnement général est décrit dans la page \ref decimateNtiff .
+ *
+ * \~english
+ * \brief Implementation file for command decimateNtiff
+ *
+ * Global operation is described into page \ref decimateNtiff .
*/
+
#include
#include
#include
@@ -71,13 +93,6 @@ namespace keywords = boost::log::keywords;
#include
#include "config.h"
-#ifndef __max
-#define __max(a, b) ( ((a) > (b)) ? (a) : (b) )
-#endif
-#ifndef __min
-#define __min(a, b) ( ((a) < (b)) ? (a) : (b) )
-#endif
-
// Paramètres de la ligne de commande déclarés en global
/** \~french Chemin du fichier de configuration des images */
char configuration_path[256];
@@ -496,6 +511,14 @@ int load_images ( FileImage** output_image, FileImage** output_mask, std::vector
return 0;
}
+/**
+ * \~french
+ * \brief Ajoute les éventuel convertisseurs aux images en entrée
+ * \details Si un format de sortie a été spécifié et qu'il n'est pas identique à celui des images en entrée, on ajoute un convertisseur
+ *
+ * \param[in] input_images images en entrée
+ * \return code de retour, 0 si réussi, -1 sinon
+ */
int add_converters(std::vector input_images) {
if (! output_format_provided) {
// On n'a pas précisé de format en sortie, donc toutes les images doivent avoir le même
diff --git a/src/manageNodata.cpp b/src/manageNodata.cpp
index 00113fb..a1f536a 100644
--- a/src/manageNodata.cpp
+++ b/src/manageNodata.cpp
@@ -36,11 +36,15 @@
*/
/**
- * \file manageNodata.cpp
+ * \page manageNodata Commande manageNodata
* \author Institut national de l'information géographique et forestière
+ * \~ \image html manageNodata.png \~french
* \~french \brief Gère la couleur des pixels de nodata
* \~english \brief Manage nodata pixel color
- * \~french \details Cet outil est destiné à :
+ *
+ * \~french
+ *
+ * Cet outil est destiné à :
* \li identifier les pixels de nodata à partir d'une valeur et d'une tolérance
* \li modifier les pixels qui contiennent cette valeur
* \li écrire le masque de données associé à l'image
@@ -61,12 +65,29 @@
* \li la couleur cible (obligatoire) : les pixels de cette couleur sont ceux potentiellement considérés comme du nodata et modifiés. On peut également préciser une tolérance en complément de la valeur. L'option "touche les bords" précise la façon dont on identifie les pixels de nodata.
* \li la nouvelle couleur de nodata : si elle n'est pas précisée, cela veut dire qu'on ne veut pas la modifier
* \li la nouvelle couleur de donnée : si elle n'est pas précisée, cela veut dire qu'on ne veut pas la modifier
- *
- * \~ \image html manageNodata.png \~french
- *
+ *
* Cet outil n'est qu'une interface permettant l'utilisation de la classe TiffNodataManager, qui réalise réellement tous les traitements.
*
* Le nombre de canaux du fichier en entrée et les valeurs de nodata renseignée doivent être cohérents.
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref manageNodata.cpp
+ *
+ * \section diagram_manageNodata Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{manageNodata}
+ *
+ */
+
+/** \file manageNodata.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande manageNodata
+ *
+ * Le fonctionnement général est décrit dans la page \ref manageNodata .
+ *
+ * \~english
+ * \brief Implementation file for command manageNodata
+ *
+ * Global operation is described into page \ref manageNodata .
*/
using namespace std;
diff --git a/src/merge4tiff.cpp b/src/merge4tiff.cpp
index ce580dc..8c7ae90 100644
--- a/src/merge4tiff.cpp
+++ b/src/merge4tiff.cpp
@@ -35,7 +35,6 @@
* knowledge of the CeCILL-C license and that you accept its terms.
*/
-
/**
* \page merge4tiff Commande merge4tiff
* \author Institut national de l'information géographique et forestière
@@ -46,7 +45,8 @@
* \~french
*
* L'implémentation de cette commande se trouve dans le fichier \ref merge4tiff.cpp
- * \section diagram Détails du chaînage des différentes classes d'image :
+ *
+ * \section diagram_merge4tiff Détails du chaînage des différentes classes d'image :
*
* @mermaid{merge4tiff}
*
@@ -456,7 +456,7 @@ int check_components ( FileImage* image, int position ) {
* \details Crée les objets TIFF, contrôle la cohérence des caractéristiques des images en entrée, ouvre les flux de lecture et écriture. Les éventuels masques associés sont ajoutés aux objets FileImage.
* \param[in] output_image image en sortie
* \param[in] output_mask masque en sortie
- * \param[in] input_images image composée en entrée
+ * \param[in] input_image image composée en entrée
* \return code de retour, 0 si réussi, -1 sinon
*/
int load_images ( FileImage** output_image, FileImage** output_mask, Image **input_image) {
@@ -551,7 +551,7 @@ int load_images ( FileImage** output_image, FileImage** output_mask, Image **inp
}
if (! si->set_mask(sm)) {
- BOOST_LOG_TRIVIAL(error) << "Cannot add mask to the Subsmapled image";
+ BOOST_LOG_TRIVIAL(error) << "Cannot add mask to the Subsampled image";
return -1;
}
diff --git a/src/mergeNtiff.cpp b/src/mergeNtiff.cpp
index 353a8d8..75f0e10 100644
--- a/src/mergeNtiff.cpp
+++ b/src/mergeNtiff.cpp
@@ -36,19 +36,37 @@
*/
/**
- * \file mergeNtiff.cpp
+ * \page mergeNtiff Commande mergeNtiff
* \author Institut national de l'information géographique et forestière
- * \~french \brief Création d'une image TIFF géoréférencée à partir de n images sources géoréférencées
- * \~english \brief Create one georeferenced TIFF image from several georeferenced images
* \~ \image html mergeNtiff.png \~french
- *
- * La légende utilisée dans tous les schémas de la documentation de ce fichier sera la suivante
- * \~ \image html mergeNtiff_legende.png \~french
- *
+ * \~french \brief Création d'une image TIFF géoréférencée à partir de plusieurs images sources géoréférencées
+ * \~english \brief Create one georeferenced TIFF image from several georeferenced images
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref mergeNtiff.cpp
+ *
* Pour réaliser la fusion des images en entrée, on traite différemment :
* \li les images qui sont superposables à l'image de sortie (même SRS, mêmes résolutions, mêmes phases) : on parle alors d'images compatibles, pas de réechantillonnage nécessaire.
* \li les images non compatibles mais de même SRS : un passage par le réechantillonnage (plus lourd en calcul) est indispensable.
* \li les images non compatibles et de SRS différents : un passage par la reprojection (encore plus lourd en calcul) est indispensable.
+ *
+ * \section diagram_mergeNtiff Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{mergeNtiff}
+ *
+ */
+
+/** \file mergeNtiff.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande mergeNtiff
+ *
+ * Le fonctionnement général est décrit dans la page \ref mergeNtiff .
+ *
+ * \~english
+ * \brief Implementation file for command mergeNtiff
+ *
+ * Global operation is described into page \ref mergeNtiff .
*/
#include
@@ -97,6 +115,7 @@ char images_root[256];
/** \~french Valeur de nodata sous forme de chaîne de caractère (passée en paramètre de la commande) */
char strnodata[256];
+/** \~french Valeur de nodata sous forme de tableau d'entiers */
int* nodata;
/** \~french A-t-on précisé une valeur de nodata */
bool nodata_provided = false;
@@ -437,7 +456,7 @@ bool load_configuration(
* Le chemin vers le fichier de configuration est stocké dans la variables globale configuration_path et images_root va être concaténer au chemin vers les fichiers de sortie.
* \param[out] output_image image résultante de l'outil
* \param[out] output_mask masque résultat de l'outil, si demandé
- * \param[out] sorted_input_images ensemble des images en entrée
+ * \param[out] input_images ensemble des images en entrée
* \return code de retour, 0 si réussi, -1 sinon
*/
int load_images(FileImage** output_image, FileImage** output_mask, std::vector* input_images) {
@@ -627,6 +646,14 @@ int load_images(FileImage** output_image, FileImage** output_mask, std::vector input_images) {
if (! output_format_provided) {
// On n'a pas précisé de format en sortie, donc toutes les images doivent avoir le même
@@ -977,7 +1004,7 @@ bool reproject_images(FileImage* output_image, ExtendedCompoundImage* input_imag
*
* Les masques sont gérés en toile de fond, en étant attachés à chacune des images manipulées.
* \param[in] output_image image de sortie
- * \param[in] input_images paquets d'images en entrée
+ * \param[in] sorted_input_images paquets d'images en entrée
* \param[out] merged_image paquet d'images superposable avec l'image de sortie
* \return 0 en cas de succès, -1 en cas d'erreur
*/
diff --git a/src/overlayNtiff.cpp b/src/overlayNtiff.cpp
index bfd92cb..7c2b287 100644
--- a/src/overlayNtiff.cpp
+++ b/src/overlayNtiff.cpp
@@ -36,10 +36,32 @@
*/
/**
- * \file overlayNtiff.cpp
+ * \page overlayNtiff Commande overlayNtiff
* \author Institut national de l'information géographique et forestière
+ * \~ \image html overlayNtiff.png \~french
* \~french \brief Fusion de N images aux mêmes dimensions, selon différentes méthodes
* \~english \brief Merge N images with same dimensions, according to different merge methods
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref overlayNtiff.cpp
+ *
+ * \section diagram_overlayNtiff Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{overlayNtiff}
+ *
+ */
+
+/** \file overlayNtiff.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande overlayNtiff
+ *
+ * Le fonctionnement général est décrit dans la page \ref overlayNtiff .
+ *
+ * \~english
+ * \brief Implementation file for command overlayNtiff
+ *
+ * Global operation is described into page \ref overlayNtiff .
*/
#include
@@ -358,7 +380,7 @@ int read_configuration_line ( std::ifstream& configuration_file, char* image_pat
*
* \param[out] output_image image résultante de l'outil
* \param[out] output_mask masque résultat de l'outil, si demandé
- * \param[out] pImageIn ensemble des images en entrée
+ * \param[out] merged_image ensemble des images en entrée
* \return code de retour, 0 si réussi, -1 sinon
*/
int load_images ( FileImage** output_image, FileImage** output_mask, MergeImage** merged_image ) {
diff --git a/src/pbf2cache.cpp b/src/pbf2cache.cpp
index f54c361..618b1d7 100644
--- a/src/pbf2cache.cpp
+++ b/src/pbf2cache.cpp
@@ -36,10 +36,32 @@
*/
/**
- * \file pbf2cache.cpp
+ * \page pbf2cache Commande pbf2cache
* \author Institut national de l'information géographique et forestière
+ * \~ \image html pbf2cache.png \~french
* \~french \brief Consitution d'une dalle vecteur ROK4 à partir des tuiles PBF
- * \~english \brief Build a vector ROK4 slab from PBD tiles
+ * \~english \brief Build a vector ROK4 slab from PBF tiles
+ *
+ * \~french
+ *
+ * L'implémentation de cette commande se trouve dans le fichier \ref pbf2cache.cpp
+ *
+ * \section diagram_pbf2cache Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{pbf2cache}
+ *
+ */
+
+/** \file pbf2cache.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande pbf2cache
+ *
+ * Le fonctionnement général est décrit dans la page \ref pbf2cache .
+ *
+ * \~english
+ * \brief Implementation file for command pbf2cache
+ *
+ * Global operation is described into page \ref pbf2cache .
*/
#include
diff --git a/src/work2cache.cpp b/src/work2cache.cpp
index 3605cee..a1bfa91 100644
--- a/src/work2cache.cpp
+++ b/src/work2cache.cpp
@@ -35,14 +35,32 @@
* knowledge of the CeCILL-C license and that you accept its terms.
*/
-/**
- * \file work2cache.cpp
+ /**
+ * \page work2cache Commande work2cache
* \author Institut national de l'information géographique et forestière
- * \~french \brief Formattage d'une image, respectant les spécifications d'une pyramide de données ROK4
- * \~english \brief Image formatting, according to ROK4 specifications
- * \~french \details Le serveur ROK4 s'attend à trouver dans une pyramide d'images des images au format TIFF, tuilées, potentiellement compressées, avec une en-tête de taille fixe (2048 octets). C'est cet outil, via l'utilisation de la classe TiledTiffWriter, qui va "mettre au normes" les images.
- *
- * Vision libimage : FileImage -> Rok4Image
+ * \~french \details Formattage d'une image, respectant les spécifications d'une pyramide de données ROK4
+ * \~english \details Image formatting, according to ROK4 specifications
+ *
+ * \~french
+ *
+ * Le serveur ROK4 s'attend à trouver dans une pyramide d'images des images au format TIFF, tuilées, potentiellement compressées, avec une en-tête de taille fixe (2048 octets).
+ *
+ * \section diagram_work2cache Détails du chaînage des différentes classes d'image :
+ *
+ * @mermaid{work2cache}
+ *
+ */
+
+/** \file work2cache.cpp
+ * \~french
+ * \brief Fichier d'implémentation de la commande work2cache
+ *
+ * Le fonctionnement général est décrit dans la page \ref work2cache .
+ *
+ * \~english
+ * \brief Implementation file for command mergeNtiff
+ *
+ * Global operation is described into page \ref mergeNtiff .
*/
#include
From b5763c789263f678041ed01d8fdb5b51d0bb4c18 Mon Sep 17 00:00:00 2001
From: VincentMiras
Date: Tue, 30 Sep 2025 10:47:32 +0200
Subject: [PATCH 13/14] Ajout du style terrainrgb dans le traitement mergeNtiff
et utilisation de StyledImage de la lib core
---
CHANGELOG.md | 9 +++++
src/mergeNtiff.cpp | 84 ++++++----------------------------------------
2 files changed, 19 insertions(+), 74 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 383f42f..e8b4570 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,18 +1,27 @@
# Changelog
+
Tous les changements sont consignés dans ce fichier.
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/) et ce projet respecte le [Semantic Versioning](https://semver.org/).
## [Unreleased]
+
### Added
+
- Possibilité de définir un timeout via la variable d'environnement `ROK4_NETWORK_TIMEOUT` (valeur à fournir en seconde) pour les intéraction avec le stockage Swift ou S3
- Ajout de diagrammes pour comprendre l'usage des classes Image dans les différents outils
- Amélioration de la documentation Doxygen
+- `mergeNtiff` : Ajout du cas du style terrainrgb lors des applications des styles
### Changed
+
- Refonte du CHANGELOG au format [Keep a Changelog](https://keepachangelog.com/)
- Changement des imports de Cache aux imports spécifiques des classes suite à la séparation du fichier Cache dans core-cpp.
- Merge4tiff utilise désormais les classes Image, dont la nouvelle SubsampledImage, pour faire le calcul raster
+- `mergeNtiff` :
+ - Vérification de l'existance d'une palette avant d'accéder aux éléments de palette.
+ - Changement de la manière de faire le traitement de style pour utiliser la classe StyledImage de la lib core-cpp.
+
### Deprecated
### Removed
### Fixed
diff --git a/src/mergeNtiff.cpp b/src/mergeNtiff.cpp
index 75f0e10..0c07da1 100644
--- a/src/mergeNtiff.cpp
+++ b/src/mergeNtiff.cpp
@@ -102,10 +102,7 @@ namespace keywords = boost::log::keywords;
#include "config.h"
#include
-#include
-#include
-#include
-#include
+#include
// Paramètres de la ligne de commande déclarés en global
/** \~french Chemin du fichier de configuration des images */
@@ -778,29 +775,8 @@ bool resample_images(FileImage* output_image, ExtendedCompoundImage* input_image
// Reechantillonnage
Image* input_to_resample = input_images;
if (style_provided) {
- Image* styled_image = NULL;
-
- if (style->estompage_defined()) {
- styled_image = new EstompageImage (input_images, style->get_estompage());
- }
- else if (style->pente_defined()) {
- styled_image = new PenteImage (input_images, style->get_pente());
- }
- else if (style->aspect_defined()) {
- styled_image = new AspectImage (input_images, style->get_aspect()) ;
- }
-
- if ( input_to_resample->get_channels() == 1 && ! ( style->get_palette()->is_empty() ) ) {
- if (styled_image != NULL) {
- input_to_resample = new PaletteImage ( styled_image , style->get_palette() );
- } else {
- input_to_resample = new PaletteImage ( input_images , style->get_palette() );
- }
- } else {
- if (styled_image != NULL) {
- input_to_resample = styled_image;
- }
- }
+ StyledImage* s_image = StyledImage::create(input_images,style);
+ input_to_resample=s_image;
}
*resampled_image = new ResampledImage(input_to_resample, width_dst, height_dst, resx_dst, resy_dst, bbox_dst, interpolation, input_images->use_masks());
@@ -809,7 +785,7 @@ bool resample_images(FileImage* output_image, ExtendedCompoundImage* input_image
BOOST_LOG_TRIVIAL(error) << "Cannot add mask to the ResampledImage";
return false;
}
-
+
return true;
}
@@ -938,30 +914,9 @@ bool reproject_images(FileImage* output_image, ExtendedCompoundImage* input_imag
/********************** Application du style **********************/
Image* input_to_reproject = input_images;
if (style_provided) {
- Image* styled_image = NULL;
-
- if (style->estompage_defined()) {
- styled_image = new EstompageImage (input_images, style->get_estompage());
- }
- else if (style->pente_defined()) {
- styled_image = new PenteImage (input_images, style->get_pente());
- }
- else if (style->aspect_defined()) {
- styled_image = new AspectImage (input_images, style->get_aspect()) ;
- }
-
- if ( input_to_reproject->get_channels() == 1 && ! ( style->get_palette()->is_empty() ) ) {
- if (styled_image != NULL) {
- input_to_reproject = new PaletteImage ( styled_image , style->get_palette() );
- } else {
- input_to_reproject = new PaletteImage ( input_images , style->get_palette() );
- }
- } else {
- if (styled_image != NULL) {
- input_to_reproject = styled_image;
- }
- }
-
+ StyledImage* s_image = StyledImage::create(input_images,style);
+
+ input_to_reproject = s_image;
input_to_reproject->set_crs(input_images->get_crs());
}
@@ -978,7 +933,7 @@ bool reproject_images(FileImage* output_image, ExtendedCompoundImage* input_imag
*reprojected_image = new ReprojectedImage(input_to_reproject, bbox_dst, resx_dst, resy_dst, grid, interpolation, input_images->use_masks());
(*reprojected_image)->set_crs(output_image->get_crs());
-
+
if (!(*reprojected_image)->set_mask(reprojected_mask)) {
BOOST_LOG_TRIVIAL(error) << "Cannot add mask to the ReprojectedImage";
return false;
@@ -1049,27 +1004,8 @@ int merge_images(FileImage *output_image, // Sortie
* on n'aura donc pas besoin de reechantillonnage.*/
if (style_provided && ! (i == 0 && background_provided)) {
// Un style est fourni et nous ne sommes pas dans le cas de la première entrée qui est une image de fond
- Image* styled_image = NULL;
-
- if (style->estompage_defined()) {
- styled_image = new EstompageImage (stackable_image, style->get_estompage());
- }
- else if (style->pente_defined()) {
- styled_image = new PenteImage (stackable_image, style->get_pente());
- }
- else if (style->aspect_defined()) {
- styled_image = new AspectImage (stackable_image, style->get_aspect()) ;
- }
-
- if ( stackable_image->get_channels() == 1 && ! ( style->get_palette()->is_empty() ) ) {
- if (styled_image != NULL) {
- stackable_images.push_back(new PaletteImage ( styled_image , style->get_palette() ));
- } else {
- stackable_images.push_back(new PaletteImage ( stackable_image , style->get_palette() ));
- }
- } else {
- stackable_images.push_back(styled_image);
- }
+ StyledImage* s_image = StyledImage::create(stackable_image,style);
+ stackable_images.push_back(s_image);
} else {
stackable_images.push_back(stackable_image);
}
From 971dc2d2cf8dba4b6086204a01e662eac885637a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20Satabin?=
Date: Mon, 16 Mar 2026 10:05:28 +0100
Subject: [PATCH 14/14] =?UTF-8?q?Mise=20=C3=A0=20jour=20du=20CHANGELOG=20p?=
=?UTF-8?q?our=20la=20release=205.1.0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e8b4570..f65df5d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ Le format est basé sur [Keep a Changelog](https://keepachangelog.com/) et ce pr
## [Unreleased]
+## [5.1.0] - 2026-03-16
+
### Added
- Possibilité de définir un timeout via la variable d'environnement `ROK4_NETWORK_TIMEOUT` (valeur à fournir en seconde) pour les intéraction avec le stockage Swift ou S3
@@ -71,7 +73,8 @@ Cette release contient les outils de génération des pyramides de données, per
- Les chemins des dalles finales sont fournis dans un format précisant le type de stockage : `(file|ceph|s3|swift)://`. Dans le cas du stockage objet, le chemin est de la forme `/`
- Passage de la librairie PROJ à la version 6
-[Unreleased]: https://github.com/rok4/generation/compare/v5.0.0...HEAD
+[Unreleased]: https://github.com/rok4/generation/compare/v5.1.0...HEAD
+[5.1.0]: https://github.com/rok4/generation/compare/v5.0.0...v5.1.0
[5.0.0]: https://github.com/rok4/generation/compare/v4.2.0...v5.0.0
[4.2.0]: https://github.com/rok4/generation/compare/v4.1.5...v4.2.0
[4.1.5]: https://github.com/rok4/generation/compare/v4.1.4...v4.1.5