Référence du fichier mergeNtiff.cpp

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
 

Description détaillée

Fichier d'implémentation de la commande mergeNtiff.

Le fonctionnement général est décrit dans la page Commande mergeNtiff .

Documentation des fonctions

◆ add_converters()

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

Paramètres
[in]input_imagesimages en entrée
Renvoie
code de retour, 0 si réussi, -1 sinon

◆ error()

void error ( std::string  message,
int  error_code 
)

Affiche un message d'erreur, l'utilisation de la commande et sort en erreur.

Paramètres
[in]messagemessage d'erreur
[in]error_codecode de retour

◆ load_configuration()

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 :

  • si elle correspond à un masque, on complète les informations
  • si elle ne correspond pas à un masque, on recule le pointeur
Paramètres
[in,out]masksIndicateurs de présence d'un masque
[in,out]pathsChemins des images
[in,out]srssSystèmes de coordonnées des images
[in,out]bboxesRectangles englobant des images
[in,out]resxsRésolution en x des images
[in,out]resysRésolution en y des images
Renvoie
true en cas de succès, false si échec

◆ load_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.

Paramètres
[out]output_imageimage résultante de l'outil
[out]output_maskmasque résultat de l'outil, si demandé
[out]input_imagesensemble des images en entrée
Renvoie
code de retour, 0 si réussi, -1 sinon

◆ main()

int main ( int  argc,
char **  argv 
)

Fonction principale de l'outil mergeNtiff.

Paramètres
[in]argcnombre de paramètres
[in]argvtableau des paramètres
Renvoie
code de retour, 0 si réussi, -1 sinon

◆ merge_images()

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 :

  • superposable avec l'image de sortie. Elle est directement ajoutée à une liste d'image.
  • non superposable avec l'image de sortie mais dans le même système de coordonnées. On va alors la réechantillonner, en utilisant la classe ResampledImage. C'est l'image réechantillonnée que l'on ajoute à la liste d'image.
  • non superposable avec l'image de sortie et dans un système de coordonnées différent. On va alors la reprojeter, en utilisant la classe ReprojectedImage. C'est l'image reprojetée que l'on ajoute à la liste d'image.

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.

Paramètres
[in]output_imageimage de sortie
[in]sorted_input_imagespaquets d'images en entrée
[out]merged_imagepaquet d'images superposable avec l'image de sortie
Renvoie
0 en cas de succès, -1 en cas d'erreur

◆ parse_command_line()

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.

Paramètres
[in]argcnombre de paramètres
[in]argvtableau des paramètres
Renvoie
code de retour, 0 si réussi, -1 sinon

◆ reproject_images()

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).

Paramètres
[in]output_imageimage résultante de l'outil
[in]input_imagespaquet d'images compatibles, à reprojeter
[in]reprojected_imageimage reprojetée
Renvoie
VRAI si succès, FAUX sinon

◆ resample_images()

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).

Paramètres
[in]output_imageimage résultante de l'outil
[in]input_imagespaquet d'images compatibles, à réechantillonner
[in]resampled_imageimage réechantillonnée
Renvoie
VRAI si succès, FAUX sinon

◆ sort_images()

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 :

  • toutes les images ont la même résolution, en X et en Y
  • toutes les images ont la même phase, en X et en Y

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.

Paramètres
[in]input_imagesimages en entrée
[out]sorted_input_imagesimages en entrée, triées en paquets compatibles
Renvoie
code de retour, 0 si réussi, -1 sinon

◆ usage()

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

Documentation des variables

◆ background_provided

bool background_provided = false

A-t-on précisé une image de fond

◆ compression

Compression::eCompression compression = Compression::NONE

Compression de l'image de sortie

◆ configuration_path

char configuration_path[256]

Chemin du fichier de configuration des images

◆ debug_logger

bool debug_logger = false

Activation du niveau de log debug. Faux par défaut

◆ help

std::string help

Message d'usage de la commande mergeNtiff

◆ images_root

char images_root[256]

Racine pour les images de sortie

◆ interpolation

Interpolation::KernelType interpolation = Interpolation::CUBIC

Interpolation utilisée pour le réechantillonnage ou la reprojection

◆ nodata

int* nodata

Valeur de nodata sous forme de tableau d'entiers

◆ nodata_provided

bool nodata_provided = false

A-t-on précisé une valeur de nodata

◆ output_format_provided

bool output_format_provided = false

A-t-on précisé le format en sortie, c'est à dire les 3 informations samplesperpixel et sampleformat

◆ photometric

Photometric::ePhotometric photometric

Photométrie (rgb, gray), déduit du nombre de canaux

◆ sampleformat

SampleFormat::eSampleFormat sampleformat = SampleFormat::UNKNOWN

Format du canal (entier, flottant, signé ou non...), pour l'image en sortie

◆ samplesperpixel

uint16_t samplesperpixel = 0

Nombre de canaux par pixel, pour l'image en sortie

◆ strnodata

char strnodata[256]

Valeur de nodata sous forme de chaîne de caractère (passée en paramètre de la commande)

◆ style

Style* style

Objet style à appliquer

◆ style_file

char style_file[256]

Chemin du fichier de style à appliquer

◆ style_provided

bool style_provided = false

A-t-on précisé un style