138 lines
4.4 KiB
C++
138 lines
4.4 KiB
C++
/******************************************************************************
|
|
*
|
|
* Project: GDAL
|
|
* Purpose: gdal "vector convert" subcommand
|
|
* 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_convert.h"
|
|
|
|
#include "cpl_conv.h"
|
|
#include "gdal_priv.h"
|
|
#include "gdal_utils.h"
|
|
|
|
//! @cond Doxygen_Suppress
|
|
|
|
#ifndef _
|
|
#define _(x) (x)
|
|
#endif
|
|
|
|
/************************************************************************/
|
|
/* GDALVectorConvertAlgorithm::GDALVectorConvertAlgorithm() */
|
|
/************************************************************************/
|
|
|
|
GDALVectorConvertAlgorithm::GDALVectorConvertAlgorithm()
|
|
: GDALAlgorithm(NAME, DESCRIPTION, HELP_URL)
|
|
{
|
|
AddProgressArg();
|
|
AddOutputFormatArg(&m_outputFormat)
|
|
.AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES,
|
|
{GDAL_DCAP_VECTOR, GDAL_DCAP_CREATE});
|
|
AddOpenOptionsArg(&m_openOptions);
|
|
AddInputFormatsArg(&m_inputFormats)
|
|
.AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES, {GDAL_DCAP_VECTOR});
|
|
AddInputDatasetArg(&m_inputDataset, GDAL_OF_VECTOR);
|
|
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR);
|
|
m_outputDataset.SetInputFlags(GADV_NAME | GADV_OBJECT);
|
|
AddCreationOptionsArg(&m_creationOptions);
|
|
AddLayerCreationOptionsArg(&m_layerCreationOptions);
|
|
AddOverwriteArg(&m_overwrite);
|
|
AddUpdateArg(&m_update);
|
|
AddArg("overwrite-layer", 0,
|
|
_("Whether overwriting existing layer is allowed"),
|
|
&m_overwriteLayer)
|
|
.SetDefault(false);
|
|
AddArg("append", 0, _("Whether appending to existing layer is allowed"),
|
|
&m_appendLayer)
|
|
.SetDefault(false);
|
|
AddArg("input-layer", 'l', _("Input layer name(s)"), &m_inputLayerNames)
|
|
.AddAlias("layer");
|
|
AddArg("output-layer", 0, _("Output layer name"), &m_outputLayerName)
|
|
.AddHiddenAlias("nln"); // For ogr2ogr nostalgic people
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* GDALVectorConvertAlgorithm::RunImpl() */
|
|
/************************************************************************/
|
|
|
|
bool GDALVectorConvertAlgorithm::RunImpl(GDALProgressFunc pfnProgress,
|
|
void *pProgressData)
|
|
{
|
|
CPLAssert(m_inputDataset.GetDatasetRef());
|
|
|
|
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_outputFormat.empty())
|
|
{
|
|
aosOptions.AddString("-of");
|
|
aosOptions.AddString(m_outputFormat.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");
|
|
}
|
|
|
|
// Must be last, as positional
|
|
for (const auto &name : m_inputLayerNames)
|
|
{
|
|
aosOptions.AddString(name.c_str());
|
|
}
|
|
|
|
GDALVectorTranslateOptions *psOptions =
|
|
GDALVectorTranslateOptionsNew(aosOptions.List(), nullptr);
|
|
|
|
GDALVectorTranslateOptionsSetProgress(psOptions, pfnProgress,
|
|
pProgressData);
|
|
|
|
GDALDatasetH hOutDS =
|
|
GDALDataset::ToHandle(m_outputDataset.GetDatasetRef());
|
|
GDALDatasetH hSrcDS = GDALDataset::ToHandle(m_inputDataset.GetDatasetRef());
|
|
auto 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
|