Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: "write" step of "vector pipeline" 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_vector_write.h" 14 : 15 : #include "cpl_string.h" 16 : #include "gdal_utils.h" 17 : #include "gdal_priv.h" 18 : 19 : #ifndef _ 20 : #define _(x) (x) 21 : #endif 22 : 23 : //! @cond Doxygen_Suppress 24 : 25 : /************************************************************************/ 26 : /* GDALVectorWriteAlgorithm::GDALVectorWriteAlgorithm() */ 27 : /************************************************************************/ 28 : 29 46 : GDALVectorWriteAlgorithm::GDALVectorWriteAlgorithm() 30 : : GDALVectorPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL, 31 46 : /* standaloneStep =*/false) 32 : { 33 46 : AddOutputArgs(/* hiddenForCLI = */ false, 34 : /* shortNameOutputLayerAllowed=*/true); 35 46 : } 36 : 37 : /************************************************************************/ 38 : /* GDALVectorWriteAlgorithm::RunStep() */ 39 : /************************************************************************/ 40 : 41 26 : bool GDALVectorWriteAlgorithm::RunStep(GDALProgressFunc pfnProgress, 42 : void *pProgressData) 43 : { 44 26 : CPLAssert(m_inputDataset.GetDatasetRef()); 45 : 46 52 : CPLStringList aosOptions; 47 26 : aosOptions.AddString("--invoked-from-gdal-vector-convert"); 48 26 : if (!m_overwrite) 49 : { 50 22 : aosOptions.AddString("--no-overwrite"); 51 : } 52 26 : if (m_overwriteLayer) 53 : { 54 1 : aosOptions.AddString("-overwrite"); 55 : } 56 26 : if (m_appendLayer) 57 : { 58 1 : aosOptions.AddString("-append"); 59 : } 60 26 : if (!m_format.empty()) 61 : { 62 1 : aosOptions.AddString("-of"); 63 1 : aosOptions.AddString(m_format.c_str()); 64 : } 65 27 : for (const auto &co : m_creationOptions) 66 : { 67 1 : aosOptions.AddString("-dsco"); 68 1 : aosOptions.AddString(co.c_str()); 69 : } 70 27 : for (const auto &co : m_layerCreationOptions) 71 : { 72 1 : aosOptions.AddString("-lco"); 73 1 : aosOptions.AddString(co.c_str()); 74 : } 75 26 : if (!m_outputLayerName.empty()) 76 : { 77 1 : aosOptions.AddString("-nln"); 78 1 : aosOptions.AddString(m_outputLayerName.c_str()); 79 : } 80 26 : if (pfnProgress && pfnProgress != GDALDummyProgress) 81 : { 82 3 : aosOptions.AddString("-progress"); 83 : } 84 : 85 : GDALVectorTranslateOptions *psOptions = 86 26 : GDALVectorTranslateOptionsNew(aosOptions.List(), nullptr); 87 26 : GDALVectorTranslateOptionsSetProgress(psOptions, pfnProgress, 88 : pProgressData); 89 : 90 : GDALDatasetH hOutDS = 91 26 : GDALDataset::ToHandle(m_outputDataset.GetDatasetRef()); 92 26 : GDALDatasetH hSrcDS = GDALDataset::ToHandle(m_inputDataset.GetDatasetRef()); 93 26 : auto poRetDS = GDALDataset::FromHandle( 94 26 : GDALVectorTranslate(m_outputDataset.GetName().c_str(), hOutDS, 1, 95 : &hSrcDS, psOptions, nullptr)); 96 26 : GDALVectorTranslateOptionsFree(psOptions); 97 26 : if (!poRetDS) 98 1 : return false; 99 : 100 25 : if (!hOutDS) 101 : { 102 24 : m_outputDataset.Set(std::unique_ptr<GDALDataset>(poRetDS)); 103 : } 104 : 105 25 : return true; 106 : } 107 : 108 : //! @endcond