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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
/******************************************************************************
*
* Project: GDAL
* Purpose: "write" step of "vector 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_vector_write.h"
#include "cpl_string.h"
#include "gdal_utils.h"
#include "gdal_priv.h"
#ifndef _
#define _(x) (x)
#endif
//! @cond Doxygen_Suppress
/************************************************************************/
/* GDALVectorWriteAlgorithm::GDALVectorWriteAlgorithm() */
/************************************************************************/
GDALVectorWriteAlgorithm::GDALVectorWriteAlgorithm()
: GDALVectorPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL,
/* standaloneStep =*/false)
{
AddVectorOutputArgs(/* hiddenForCLI = */ false,
/* shortNameOutputLayerAllowed=*/true);
}
/************************************************************************/
/* GDALVectorWriteAlgorithm::RunStep() */
/************************************************************************/
bool GDALVectorWriteAlgorithm::RunStep(GDALPipelineStepRunContext &ctxt)
{
auto pfnProgress = ctxt.m_pfnProgress;
auto pProgressData = ctxt.m_pProgressData;
auto poSrcDS = m_inputDataset[0].GetDatasetRef();
CPLAssert(poSrcDS);
if (m_format == "stream")
{
m_outputDataset.Set(poSrcDS);
return true;
}
CPLStringList aosOptions;
aosOptions.AddString("--invoked-from-gdal-vector-convert");
if (!m_overwrite)
{
aosOptions.AddString("--no-overwrite");
}
if (m_overwriteLayer)
{
aosOptions.AddString("-overwrite");
}
if (m_appendLayer)
{
aosOptions.AddString("-append");
}
if (m_upsert)
{
aosOptions.AddString("-upsert");
}
if (!m_format.empty())
{
aosOptions.AddString("-of");
aosOptions.AddString(m_format.c_str());
}
for (const auto &co : m_creationOptions)
{
aosOptions.AddString("-dsco");
aosOptions.AddString(co.c_str());
}
for (const auto &co : m_layerCreationOptions)
{
aosOptions.AddString("-lco");
aosOptions.AddString(co.c_str());
}
if (!m_outputLayerName.empty())
{
aosOptions.AddString("-nln");
aosOptions.AddString(m_outputLayerName.c_str());
}
if (pfnProgress && pfnProgress != GDALDummyProgress)
{
aosOptions.AddString("-progress");
}
if (m_skipErrors)
{
aosOptions.AddString("-skipfailures");
}
GDALDataset *poRetDS = nullptr;
GDALDatasetH hOutDS =
GDALDataset::ToHandle(m_outputDataset.GetDatasetRef());
GDALVectorTranslateOptions *psOptions =
GDALVectorTranslateOptionsNew(aosOptions.List(), nullptr);
if (psOptions)
{
GDALVectorTranslateOptionsSetProgress(psOptions, pfnProgress,
pProgressData);
GDALDatasetH hSrcDS = GDALDataset::ToHandle(poSrcDS);
poRetDS = GDALDataset::FromHandle(
GDALVectorTranslate(m_outputDataset.GetName().c_str(), hOutDS, 1,
&hSrcDS, psOptions, nullptr));
GDALVectorTranslateOptionsFree(psOptions);
}
if (!poRetDS)
return false;
if (!hOutDS)
{
m_outputDataset.Set(std::unique_ptr<GDALDataset>(poRetDS));
}
return true;
}
//! @endcond
|