Fichier d'implémentation de la commande mergeNtiff. Plus de détails...
#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <algorithm>#include <boost/log/core.hpp>#include <boost/log/trivial.hpp>#include <boost/log/utility/setup/common_attributes.hpp>#include <boost/log/utility/setup/console.hpp>#include <cstdlib>#include <fstream>#include <iostream>#include <sstream>#include <string>#include <vector>#include <tiffio.h>#include <rok4/utils/CRS.h>#include <rok4/image/ExtendedCompoundImage.h>#include <rok4/image/file/FileImage.h>#include <rok4/enums/Format.h>#include <rok4/utils/CurlPool.h>#include <rok4/enums/Interpolation.h>#include <rok4/processors/PixelConverter.h>#include <rok4/image/ReprojectedImage.h>#include <rok4/image/ResampledImage.h>#include <math.h>#include "config.h"#include <rok4/style/Style.h>#include <rok4/image/StyledImage.h>Fonctions | |
| void | usage () |
| Affiche l'utilisation et les différentes options de la commande mergeNtiff help. Plus de détails... | |
| void | error (std::string message, int error_code) |
| Affiche un message d'erreur, l'utilisation de la commande et sort en erreur. Plus de détails... | |
| int | parse_command_line (int argc, char **argv) |
| Récupère les valeurs passées en paramètres de la commande, et les stocke dans les variables globales. Plus de détails... | |
| bool | load_configuration (std::vector< bool > *masks, std::vector< char * > *paths, std::vector< std::string > *srss, std::vector< BoundingBox< double > > *bboxes, std::vector< double > *resxs, std::vector< double > *resys) |
| Lit l'ensemble de la configuration. Plus de détails... | |
| int | load_images (FileImage **output_image, FileImage **output_mask, std::vector< FileImage * > *input_images) |
| Charge les images en entrée et en sortie depuis le fichier de configuration. Plus de détails... | |
| int | add_converters (std::vector< FileImage * > input_images) |
| Ajoute les éventuel convertisseurs aux images en entrée. Plus de détails... | |
| int | sort_images (std::vector< FileImage * > input_images, std::vector< std::vector< Image * > > *sorted_input_images) |
| Trie les images sources en paquets d'images superposables. Plus de détails... | |
| bool | resample_images (FileImage *output_image, ExtendedCompoundImage *input_images, ResampledImage **resampled_image) |
| Réechantillonne un paquet d'images compatibles. Plus de détails... | |
| bool | reproject_images (FileImage *output_image, ExtendedCompoundImage *input_images, ReprojectedImage **reprojected_image) |
| Reprojette un paquet d'images compatibles. Plus de détails... | |
| int | merge_images (FileImage *output_image, std::vector< std::vector< Image * >> &sorted_input_images, ExtendedCompoundImage **merged_image) |
| Traite chaque paquet d'images en entrée. Plus de détails... | |
| int | main (int argc, char **argv) |
| Fonction principale de l'outil mergeNtiff. Plus de détails... | |
Variables | |
| char | configuration_path [256] |
| char | images_root [256] |
| char | strnodata [256] |
| int * | nodata |
| bool | nodata_provided = false |
| bool | output_format_provided = false |
| uint16_t | samplesperpixel = 0 |
| SampleFormat::eSampleFormat | sampleformat = SampleFormat::UNKNOWN |
| Photometric::ePhotometric | photometric |
| Compression::eCompression | compression = Compression::NONE |
| Interpolation::KernelType | interpolation = Interpolation::CUBIC |
| bool | background_provided = false |
| bool | style_provided = false |
| char | style_file [256] |
| Style * | style |
| bool | debug_logger = false |
| std::string | help |
Fichier d'implémentation de la commande mergeNtiff.
Le fonctionnement général est décrit dans la page Commande mergeNtiff .
| int add_converters | ( | std::vector< FileImage * > | input_images | ) |
Ajoute les éventuel convertisseurs aux images en entrée.
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
| [in] | input_images | images en entrée |
| void error | ( | std::string | message, |
| int | error_code | ||
| ) |
Affiche un message d'erreur, l'utilisation de la commande et sort en erreur.
| [in] | message | message d'erreur |
| [in] | error_code | code de retour |
| bool load_configuration | ( | std::vector< bool > * | masks, |
| std::vector< char * > * | paths, | ||
| std::vector< std::string > * | srss, | ||
| std::vector< BoundingBox< double > > * | bboxes, | ||
| std::vector< double > * | resxs, | ||
| std::vector< double > * | resys | ||
| ) |
Lit l'ensemble de la configuration.
On parse la ligne courante du fichier de configuration, en stockant les valeurs dans les variables fournies. On saute les lignes vides. On lit ensuite la ligne suivante :
| [in,out] | masks | Indicateurs de présence d'un masque |
| [in,out] | paths | Chemins des images |
| [in,out] | srss | Systèmes de coordonnées des images |
| [in,out] | bboxes | Rectangles englobant des images |
| [in,out] | resxs | Résolution en x des images |
| [in,out] | resys | Résolution en y des images |
| int load_images | ( | FileImage ** | output_image, |
| FileImage ** | output_mask, | ||
| std::vector< FileImage * > * | input_images | ||
| ) |
Charge les images en entrée et en sortie depuis le fichier de configuration.
On va récupérer toutes les informations de toutes les images et masques présents dans le fichier de configuration et créer les objets FileImage correspondant. Toutes les images ici manipulées sont de vraies images (physiques) dans ce sens où elles sont des fichiers soit lus, soit qui seront écrits.
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.
| [out] | output_image | image résultante de l'outil |
| [out] | output_mask | masque résultat de l'outil, si demandé |
| [out] | input_images | ensemble des images en entrée |
| int main | ( | int | argc, |
| char ** | argv | ||
| ) |
Fonction principale de l'outil mergeNtiff.
| [in] | argc | nombre de paramètres |
| [in] | argv | tableau des paramètres |
| int merge_images | ( | FileImage * | output_image, |
| std::vector< std::vector< Image * >> & | sorted_input_images, | ||
| ExtendedCompoundImage ** | merged_image | ||
| ) |
Traite chaque paquet d'images en entrée.
On a préalablement trié les images par compatibilité. Pour chaque paquet, on va créer un objet de la classe ExtendedCompoundImage. Ce dernier est à considérer comme une image simple. Cette image peut être :
On obtient donc une liste d'images superposables avec celle de sortie, que l'on va réunir sous un objet de la classe ExtendedCompoundImage, qui sera la source unique utilisée pour écrire l'image de sortie.
Les masques sont gérés en toile de fond, en étant attachés à chacune des images manipulées.
| [in] | output_image | image de sortie |
| [in] | sorted_input_images | paquets d'images en entrée |
| [out] | merged_image | paquet d'images superposable avec l'image de sortie |
| int parse_command_line | ( | int | argc, |
| char ** | argv | ||
| ) |
Récupère les valeurs passées en paramètres de la commande, et les stocke dans les variables globales.
| [in] | argc | nombre de paramètres |
| [in] | argv | tableau des paramètres |
| bool reproject_images | ( | FileImage * | output_image, |
| ExtendedCompoundImage * | input_images, | ||
| ReprojectedImage ** | reprojected_image | ||
| ) |
Reprojette un paquet d'images compatibles.
On crée l'objet ReprojectedImage correspondant à la reprojection du paquet d'images, afin de le rendre compatible avec l'image de sortie. On veut que l'emprise de l'image réechantillonnée ne dépasse ni de l'image de sortie, ni des images en entrée (sans prendre en compte les miroirs, données virtuelles).
L'image reprojetée doit être strictement incluse dans l'image source utilisée, c'est pourquoi on va artificiellement agrandir l'image source (avec du nodata) pour être sur de l'inclusion stricte.
L'image reprojetée peut être nulle, dans le cas où l'image source ne recouvrait pas suffisemment l'image de sortie pour permettre le calcul d'une image (une dimensions de l'image reprojetée aurait été nulle).
| [in] | output_image | image résultante de l'outil |
| [in] | input_images | paquet d'images compatibles, à reprojeter |
| [in] | reprojected_image | image reprojetée |
| bool resample_images | ( | FileImage * | output_image, |
| ExtendedCompoundImage * | input_images, | ||
| ResampledImage ** | resampled_image | ||
| ) |
Réechantillonne un paquet d'images compatibles.
On crée l'objet ResampledImage correspondant au réechantillonnage du paquet d'images, afin de le rendre compatible avec l'image de sortie. On veut que l'emprise de l'image réechantillonnée ne dépasse ni de l'image de sortie, ni des images en entrée (sans prendre en compte les miroirs, données virtuelles).
| [in] | output_image | image résultante de l'outil |
| [in] | input_images | paquet d'images compatibles, à réechantillonner |
| [in] | resampled_image | image réechantillonnée |
| int sort_images | ( | std::vector< FileImage * > | input_images, |
| std::vector< std::vector< Image * > > * | sorted_input_images | ||
| ) |
Trie les images sources en paquets d'images superposables.
On réunit les images en paquets, dans lesquels :
On conserve cependant l'ordre originale des images, quitte à augmenter le nombre de paquets final. Ce tri sert à simplifier le traitement des images et leur réechantillonnage.
| [in] | input_images | images en entrée |
| [out] | sorted_input_images | images en entrée, triées en paquets compatibles |
| void usage | ( | ) |
Affiche l'utilisation et les différentes options de la commande mergeNtiff help.
L'affichage se fait dans le niveau de logger INFO
| bool background_provided = false |
A-t-on précisé une image de fond
| Compression::eCompression compression = Compression::NONE |
Compression de l'image de sortie
| char configuration_path[256] |
Chemin du fichier de configuration des images
| bool debug_logger = false |
Activation du niveau de log debug. Faux par défaut
| std::string help |
Message d'usage de la commande mergeNtiff
| char images_root[256] |
Racine pour les images de sortie
| Interpolation::KernelType interpolation = Interpolation::CUBIC |
Interpolation utilisée pour le réechantillonnage ou la reprojection
| int* nodata |
Valeur de nodata sous forme de tableau d'entiers
| bool nodata_provided = false |
A-t-on précisé une valeur de nodata
| bool output_format_provided = false |
A-t-on précisé le format en sortie, c'est à dire les 3 informations samplesperpixel et sampleformat
| Photometric::ePhotometric photometric |
Photométrie (rgb, gray), déduit du nombre de canaux
| SampleFormat::eSampleFormat sampleformat = SampleFormat::UNKNOWN |
Format du canal (entier, flottant, signé ou non...), pour l'image en sortie
| uint16_t samplesperpixel = 0 |
Nombre de canaux par pixel, pour l'image en sortie
| char strnodata[256] |
Valeur de nodata sous forme de chaîne de caractère (passée en paramètre de la commande)
| Style* style |
Objet style à appliquer
| char style_file[256] |
Chemin du fichier de style à appliquer
| bool style_provided = false |
A-t-on précisé un style