1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
/******************************************************************************
*
* Project: GDAL
* Purpose: "write" step of "raster pipeline"
* Author: Even Rouault <even dot rouault at spatialys.com>
*
******************************************************************************
* Copyright (c) 2024, Even Rouault <even dot rouault at spatialys.com>
*
* SPDX-License-Identifier: MIT
****************************************************************************/
#include "gdalalg_raster_write.h"
#include "cpl_string.h"
#include "gdal_utils.h"
#include "gdal_priv.h"
//! @cond Doxygen_Suppress
/************************************************************************/
/* GDALRasterWriteAlgorithm::GDALRasterWriteAlgorithm() */
/************************************************************************/
GDALRasterWriteAlgorithm::GDALRasterWriteAlgorithm()
: GDALRasterPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL,
/* standaloneStep =*/false)
{
AddRasterOutputArgs(/* hiddenForCLI = */ false);
}
/************************************************************************/
/* GDALRasterWriteAlgorithm::RunStep() */
/************************************************************************/
bool GDALRasterWriteAlgorithm::RunStep(GDALPipelineStepRunContext &ctxt)
{
auto pfnProgress = ctxt.m_pfnProgress;
auto pProgressData = ctxt.m_pProgressData;
auto poSrcDS = m_inputDataset[0].GetDatasetRef();
CPLAssert(poSrcDS);
CPLAssert(!m_outputDataset.GetDatasetRef());
if (m_format == "stream")
{
m_outputDataset.Set(poSrcDS);
return true;
}
CPLStringList aosOptions;
if (!m_overwrite)
{
aosOptions.AddString("--no-overwrite");
}
if (m_appendRaster)
{
aosOptions.AddString("-co");
aosOptions.AddString("APPEND_SUBDATASET=YES");
}
if (!m_format.empty())
{
aosOptions.AddString("-of");
aosOptions.AddString(m_format.c_str());
}
for (const auto &co : m_creationOptions)
{
aosOptions.AddString("-co");
aosOptions.AddString(co.c_str());
}
GDALTranslateOptions *psOptions =
GDALTranslateOptionsNew(aosOptions.List(), nullptr);
GDALTranslateOptionsSetProgress(psOptions, pfnProgress, pProgressData);
// Backup error state since GDALTranslate() resets it multiple times
const auto nLastErrorNum = CPLGetLastErrorNo();
const auto nLastErrorType = CPLGetLastErrorType();
const std::string osLastErrorMsg = CPLGetLastErrorMsg();
const auto nLastErrorCounter = CPLGetErrorCounter();
GDALDatasetH hSrcDS = GDALDataset::ToHandle(poSrcDS);
auto poRetDS = GDALDataset::FromHandle(GDALTranslate(
m_outputDataset.GetName().c_str(), hSrcDS, psOptions, nullptr));
GDALTranslateOptionsFree(psOptions);
if (nLastErrorCounter > 0 && CPLGetErrorCounter() == 0)
{
CPLErrorSetState(nLastErrorType, nLastErrorNum, osLastErrorMsg.c_str(),
&nLastErrorCounter);
}
if (!poRetDS)
return false;
m_outputDataset.Set(std::unique_ptr<GDALDataset>(poRetDS));
return true;
}
//! @endcond
|