129 lines
4.2 KiB
C++
129 lines
4.2 KiB
C++
/******************************************************************************
|
|
*
|
|
* Project: GDAL Utilities
|
|
* Purpose: Command line application to build VRT datasets from raster products
|
|
*or content of SHP tile index Author: Even Rouault, <even dot rouault at
|
|
*spatialys dot com>
|
|
*
|
|
******************************************************************************
|
|
* Copyright (c) 2007-2016, Even Rouault <even dot rouault at spatialys dot com>
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
****************************************************************************/
|
|
|
|
#include "cpl_string.h"
|
|
#include "cpl_error.h"
|
|
#include "commonutils.h"
|
|
#include "gdal_version.h"
|
|
#include "gdal_utils_priv.h"
|
|
|
|
/************************************************************************/
|
|
/* Usage() */
|
|
/************************************************************************/
|
|
|
|
static void Usage() CPL_NO_RETURN;
|
|
|
|
static void Usage()
|
|
|
|
{
|
|
fprintf(stderr, "%s\n", GDALBuildVRTGetParserUsage().c_str());
|
|
exit(1);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* main() */
|
|
/************************************************************************/
|
|
|
|
MAIN_START(argc, argv)
|
|
|
|
{
|
|
EarlySetConfigOptions(argc, argv);
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Register standard GDAL drivers, and process generic GDAL */
|
|
/* command options. */
|
|
/* -------------------------------------------------------------------- */
|
|
GDALAllRegister();
|
|
argc = GDALGeneralCmdLineProcessor(argc, &argv, 0);
|
|
if (argc < 1)
|
|
exit(-argc);
|
|
|
|
GDALBuildVRTOptionsForBinary sOptionsForBinary;
|
|
/* coverity[tainted_data] */
|
|
GDALBuildVRTOptions *psOptions =
|
|
GDALBuildVRTOptionsNew(argv + 1, &sOptionsForBinary);
|
|
CSLDestroy(argv);
|
|
|
|
if (psOptions == nullptr)
|
|
{
|
|
Usage();
|
|
}
|
|
|
|
if (!(sOptionsForBinary.bQuiet))
|
|
{
|
|
GDALBuildVRTOptionsSetProgress(psOptions, GDALTermProgress, nullptr);
|
|
}
|
|
|
|
/* Avoid overwriting a non VRT dataset if the user did not put the */
|
|
/* filenames in the right order */
|
|
VSIStatBuf sBuf;
|
|
if (!sOptionsForBinary.bOverwrite)
|
|
{
|
|
int bExists =
|
|
(VSIStat(sOptionsForBinary.osDstFilename.c_str(), &sBuf) == 0);
|
|
if (bExists)
|
|
{
|
|
GDALDriverH hDriver = GDALIdentifyDriver(
|
|
sOptionsForBinary.osDstFilename.c_str(), nullptr);
|
|
if (hDriver &&
|
|
!(EQUAL(GDALGetDriverShortName(hDriver), "VRT") ||
|
|
(EQUAL(GDALGetDriverShortName(hDriver), "API_PROXY") &&
|
|
EQUAL(
|
|
CPLGetExtension(sOptionsForBinary.osDstFilename.c_str()),
|
|
"VRT"))))
|
|
{
|
|
fprintf(
|
|
stderr,
|
|
"'%s' is an existing GDAL dataset managed by %s driver.\n"
|
|
"There is an high chance you did not put filenames in the "
|
|
"right order.\n"
|
|
"If you want to overwrite %s, add -overwrite option to the "
|
|
"command line.\n\n",
|
|
sOptionsForBinary.osDstFilename.c_str(),
|
|
GDALGetDriverShortName(hDriver),
|
|
sOptionsForBinary.osDstFilename.c_str());
|
|
Usage();
|
|
}
|
|
}
|
|
}
|
|
|
|
int bUsageError = FALSE;
|
|
GDALDatasetH hOutDS = GDALBuildVRT(
|
|
sOptionsForBinary.osDstFilename.c_str(),
|
|
sOptionsForBinary.aosSrcFiles.size(), nullptr,
|
|
sOptionsForBinary.aosSrcFiles.List(), psOptions, &bUsageError);
|
|
if (bUsageError)
|
|
Usage();
|
|
int nRetCode = (hOutDS) ? 0 : 1;
|
|
|
|
GDALBuildVRTOptionsFree(psOptions);
|
|
|
|
CPLErrorReset();
|
|
// The flush to disk is only done at that stage, so check if any error has
|
|
// happened
|
|
if (GDALClose(hOutDS) != CE_None)
|
|
nRetCode = 1;
|
|
if (CPLGetLastErrorType() != CE_None)
|
|
nRetCode = 1;
|
|
|
|
GDALDumpOpenDatasets(stderr);
|
|
|
|
GDALDestroyDriverManager();
|
|
|
|
OGRCleanupAll();
|
|
|
|
return nRetCode;
|
|
}
|
|
|
|
MAIN_END
|