#include "onf_stepbatchrastermerging.h" #include "onf_steppluginmanager.h" #include "tools/ct_readerstools.h" #include "ctlibio/exporters/gdal/pb_gdalexporter.h" #include #include // Constructor : initialization of parameters ONF_StepBatchRasterMerging::ONF_StepBatchRasterMerging() : SuperClass() { mReader = nullptr; } ONF_StepBatchRasterMerging::~ONF_StepBatchRasterMerging() { delete mReader; } // Step description (tooltip of contextual menu) QString ONF_StepBatchRasterMerging::description() const { return tr("Fusion de rasters par lots"); } // Step detailled description QString ONF_StepBatchRasterMerging::detailledDescription() const { return tr("Dans cette étape on choisit un dossier. Pour chacun de ses sous-dossiers contenant des rasters, un raster fusionné sera créé regroupant les données de tous les rasters du sous-dossier."); } QString ONF_StepBatchRasterMerging::outputDescription() const { return SuperClass::outputDescription(); } QString ONF_StepBatchRasterMerging::detailsDescription() const { return tr("L'utilisation la plus habituelle de cette étape est de fusionner des séries de métriques produites sous forme d'ensembles de tuiles rasters."); } // Step copy method CT_VirtualAbstractStep* ONF_StepBatchRasterMerging::createNewInstance() const { return new ONF_StepBatchRasterMerging(); } void ONF_StepBatchRasterMerging::fillPreInputConfigurationDialog(CT_StepConfigurableDialog* preInputConfigDialog) { const QList &readerAvailable = pluginStaticCastT()->readersAvailable(); QList rasterReaderAvailable; QStringList list_readersList; for (int i = 0 ; i < readerAvailable.size() ; i++) { CT_AbstractReader *reader = readerAvailable.at(i); CT_Reader_GDAL *gdalreader = dynamic_cast(reader); if (gdalreader != nullptr && gdalreader->getTypeOfDriver() == "Raster") { rasterReaderAvailable.append(gdalreader); list_readersList.append(gdalreader->uniqueName()); } } preInputConfigDialog->addStringChoice(tr("Choix du type de fichier raster"), "", list_readersList, m_readerSelectedUniqueName); } void ONF_StepBatchRasterMerging::fillPostInputConfigurationDialog(CT_StepConfigurableDialog *postInputConfigDialog) { postInputConfigDialog->addFileChoice(tr("Répertoire source (vide de préférence)"), CT_FileChoiceButton::OneExistingFolder, "", _inRasterFolder, tr("Ce dossier doit contenir des sous-dossiers contenant chacun des séries de rasters à fusionner.")); postInputConfigDialog->addFileChoice(tr("Répertoire d'export (vide de préférence)"), CT_FileChoiceButton::OneExistingFolder, "", _outRasterFolder, tr("Le contenu du dossier sélectionné ne sera pas effacé. Cependant pour plus de clarté il est préférable de choisir un dossier vide.")); } void ONF_StepBatchRasterMerging::finalizePreSettings() { CT_AbstractReader* reader = pluginStaticCastT()->readerAvailableByUniqueName(m_readerSelectedUniqueName); CT_Reader_GDAL *gdalreader = dynamic_cast(reader); if(gdalreader == nullptr) { delete mReader; mReader = nullptr; return; } if((mReader == nullptr) || (gdalreader->uniqueName() != mReader->uniqueName())) { delete mReader; mReader = static_cast(gdalreader->copyFull()); } } void ONF_StepBatchRasterMerging::declareInputModels(CT_StepInModelStructureManager& manager) { manager.setNotNeedInputResult(); } void ONF_StepBatchRasterMerging::declareOutputModels(CT_StepOutModelStructureManager &manager) { } void ONF_StepBatchRasterMerging::compute() { if (_inRasterFolder.isEmpty() || _outRasterFolder.isEmpty()) {return;} if(mReader == nullptr) {return;} QString inRasterFolder = _inRasterFolder.first(); QString outRasterFolder = _outRasterFolder.first(); QDir inDir(inRasterFolder); inDir.setFilter(QDir::Dirs | QDir::NoSymLinks | QDir::NoDot | QDir::NoDotDot); foreach (QFileInfo fileInfo, inDir.entryInfoList()) { if (fileInfo.isDir() && fileInfo.isReadable()) { QDir subDir(fileInfo.absoluteFilePath()); subDir.setFilter(QDir::Files | QDir::NoSymLinks | QDir::NoDot | QDir::NoDotDot); QStringList rasterFileList; Eigen::Vector3d minExtent, maxExtent; minExtent(0) = std::numeric_limits::max(); minExtent(1) = std::numeric_limits::max(); maxExtent(0) = -std::numeric_limits::max(); maxExtent(1) = -std::numeric_limits::max(); foreach (QFileInfo fileInfo, subDir.entryInfoList()) { if (mReader->isExtensionPresentInReadableFormat(fileInfo.suffix())) { mReader->setFilePath(fileInfo.absoluteFilePath()); CT_GDALHeader* header = static_cast(mReader->readHeader()); if (header != nullptr) { rasterFileList.append(fileInfo.absoluteFilePath()); Eigen::Vector3d min, max; header->boundingBox(min, max); if (min(0) < minExtent(0)) {minExtent(0) = min(0);} if (min(1) < minExtent(1)) {minExtent(1) = min(1);} if (max(0) > maxExtent(0)) {maxExtent(0) = max(0);} if (max(1) > maxExtent(1)) {maxExtent(1) = max(1);} } } } QString rasterType = "none"; CT_AbstractImage2D* outRaster = nullptr; foreach (QString filepath, rasterFileList) { mReader->setFilePath(filepath); if (rasterType == "none") { rasterType = mReader->getDataTypeForFirstRaster(); } if (mReader->getDataTypeForFirstRaster() == rasterType) { if (rasterType == "float") { CT_Image2D* inRaster = mReader->firstFloatRaster(); if (outRaster == nullptr) { outRaster = CT_Image2D::createImage2DFromXYCoords(minExtent(0), minExtent(1), maxExtent(0), maxExtent(1), inRaster->resolution(), 0, inRaster->NA(), inRaster->NA()); } CT_Image2D* outRasterCasted = dynamic_cast*>(outRaster); for (size_t index = 0 ; index < inRaster->nCells() ; index++) { Eigen::Vector3d centerCoords; if (inRaster->getCellCenterCoordinates(index, centerCoords)) { outRasterCasted->setValueAtCoords(centerCoords(0), centerCoords(1), inRaster->valueAtIndex(index)); } } delete inRaster; } else if (rasterType == "double") { CT_Image2D* inRaster = mReader->firstDoubleRaster(); if (outRaster == nullptr) { outRaster = CT_Image2D::createImage2DFromXYCoords(minExtent(0), minExtent(1), maxExtent(0), maxExtent(1), inRaster->resolution(), 0, inRaster->NA(), inRaster->NA()); } CT_Image2D* outRasterCasted = dynamic_cast*>(outRaster); for (size_t index = 0 ; index < inRaster->nCells() ; index++) { Eigen::Vector3d centerCoords; if (inRaster->getCellCenterCoordinates(index, centerCoords)) { outRasterCasted->setValueAtCoords(centerCoords(0), centerCoords(1), inRaster->valueAtIndex(index)); } } delete inRaster; } else if (rasterType == "quint8") { CT_Image2D* inRaster = mReader->firstQuint8Raster(); if (outRaster == nullptr) { outRaster = CT_Image2D::createImage2DFromXYCoords(minExtent(0), minExtent(1), maxExtent(0), maxExtent(1), inRaster->resolution(), 0, inRaster->NA(), inRaster->NA()); } CT_Image2D* outRasterCasted = dynamic_cast*>(outRaster); for (size_t index = 0 ; index < inRaster->nCells() ; index++) { Eigen::Vector3d centerCoords; if (inRaster->getCellCenterCoordinates(index, centerCoords)) { outRasterCasted->setValueAtCoords(centerCoords(0), centerCoords(1), inRaster->valueAtIndex(index)); } } delete inRaster; } else if (rasterType == "qint32") { CT_Image2D* inRaster = mReader->firstQint32Raster(); if (outRaster == nullptr) { outRaster = CT_Image2D::createImage2DFromXYCoords(minExtent(0), minExtent(1), maxExtent(0), maxExtent(1), inRaster->resolution(), 0, inRaster->NA(), inRaster->NA()); } CT_Image2D* outRasterCasted = dynamic_cast*>(outRaster); for (size_t index = 0 ; index < inRaster->nCells() ; index++) { Eigen::Vector3d centerCoords; if (inRaster->getCellCenterCoordinates(index, centerCoords)) { outRasterCasted->setValueAtCoords(centerCoords(0), centerCoords(1), inRaster->valueAtIndex(index)); } } delete inRaster; } } } PB_GDALExporter exporter(mReader->getDriver()); QString OutRasterPath = QString("%1/%2").arg(outRasterFolder).arg(fileInfo.fileName()); exporter.setFilePath(OutRasterPath); QList rastersToExport; rastersToExport.append(outRaster); exporter.setRastersToExport(rastersToExport); exporter.exportToFile(); delete outRaster; } } }