Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: gdal "raster convert" subcommand 5 : * Author: Even Rouault <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2024, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "gdalalg_raster_convert.h" 14 : 15 : #include "cpl_conv.h" 16 : #include "gdal_priv.h" 17 : #include "gdal_utils.h" 18 : 19 : //! @cond Doxygen_Suppress 20 : 21 : #ifndef _ 22 : #define _(x) (x) 23 : #endif 24 : 25 : /************************************************************************/ 26 : /* GDALRasterConvertAlgorithm::GDALRasterConvertAlgorithm() */ 27 : /************************************************************************/ 28 : 29 51 : GDALRasterConvertAlgorithm::GDALRasterConvertAlgorithm( 30 51 : bool /* standalone */, bool openForMixedRasterVector) 31 51 : : GDALAlgorithm(NAME, DESCRIPTION, HELP_URL) 32 : { 33 51 : AddProgressArg(); 34 51 : AddOutputFormatArg(&m_outputFormat) 35 : .AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES, 36 153 : {GDAL_DCAP_RASTER, GDAL_DCAP_CREATECOPY}); 37 51 : AddOpenOptionsArg(&m_openOptions); 38 51 : AddInputFormatsArg(&m_inputFormats) 39 102 : .AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES, {GDAL_DCAP_RASTER}); 40 : AddInputDatasetArg(&m_inputDataset, openForMixedRasterVector 41 : ? GDAL_OF_RASTER | GDAL_OF_VECTOR 42 51 : : GDAL_OF_RASTER); 43 51 : AddOutputDatasetArg(&m_outputDataset, GDAL_OF_RASTER); 44 51 : AddCreationOptionsArg(&m_creationOptions); 45 51 : const char *exclusionGroup = "overwrite-append"; 46 51 : AddOverwriteArg(&m_overwrite).SetMutualExclusionGroup(exclusionGroup); 47 : AddArg(GDAL_ARG_NAME_APPEND, 0, 48 102 : _("Append as a subdataset to existing output"), &m_append) 49 51 : .SetDefault(false) 50 51 : .SetMutualExclusionGroup(exclusionGroup); 51 51 : } 52 : 53 : /************************************************************************/ 54 : /* GDALRasterConvertAlgorithm::RunImpl() */ 55 : /************************************************************************/ 56 : 57 14 : bool GDALRasterConvertAlgorithm::RunImpl(GDALProgressFunc pfnProgress, 58 : void *pProgressData) 59 : { 60 14 : CPLAssert(m_inputDataset.GetDatasetRef()); 61 14 : CPLAssert(!m_outputDataset.GetDatasetRef()); 62 : 63 28 : CPLStringList aosOptions; 64 14 : if (!m_outputFormat.empty()) 65 : { 66 3 : aosOptions.AddString("-of"); 67 3 : aosOptions.AddString(m_outputFormat.c_str()); 68 : } 69 14 : if (!m_overwrite) 70 : { 71 13 : aosOptions.AddString("--no-overwrite"); 72 : } 73 14 : if (m_append) 74 : { 75 2 : aosOptions.AddString("-co"); 76 2 : aosOptions.AddString("APPEND_SUBDATASET=YES"); 77 : } 78 16 : for (const auto &co : m_creationOptions) 79 : { 80 2 : aosOptions.AddString("-co"); 81 2 : aosOptions.AddString(co.c_str()); 82 : } 83 : 84 : GDALTranslateOptions *psOptions = 85 14 : GDALTranslateOptionsNew(aosOptions.List(), nullptr); 86 14 : GDALTranslateOptionsSetProgress(psOptions, pfnProgress, pProgressData); 87 : 88 : auto poOutDS = std::unique_ptr<GDALDataset>(GDALDataset::FromHandle( 89 14 : GDALTranslate(m_outputDataset.GetName().c_str(), 90 : GDALDataset::ToHandle(m_inputDataset.GetDatasetRef()), 91 42 : psOptions, nullptr))); 92 14 : GDALTranslateOptionsFree(psOptions); 93 14 : if (!poOutDS) 94 2 : return false; 95 : 96 12 : m_outputDataset.Set(std::move(poOutDS)); 97 : 98 12 : return true; 99 : } 100 : 101 : //! @endcond