Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL DEM Utilities 4 : * Purpose: 5 : * Authors: Even Rouault, <even dot rouault at spatialys dot com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2015, Even Rouault <even dot rouault at spatialys dot com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "cpl_vsi.h" 14 : #include <stdlib.h> 15 : #include <math.h> 16 : 17 : #include "cpl_conv.h" 18 : #include "cpl_string.h" 19 : #include "gdal_version.h" 20 : #include "gdal_utils_priv.h" 21 : #include "gdal_priv.h" 22 : #include "commonutils.h" 23 : 24 : /** 25 : * @brief Makes sure the GDAL library is properly cleaned up before exiting. 26 : * @param nCode exit code 27 : * @todo Move to API 28 : */ 29 0 : static void GDALExit(const int nCode) 30 : { 31 0 : GDALDestroy(); 32 0 : exit(nCode); 33 : } 34 : 35 : /************************************************************************/ 36 : /* Usage() */ 37 : /************************************************************************/ 38 : 39 0 : static void Usage(const std::string &osProcessingMode = "") 40 : { 41 0 : fprintf(stderr, "%s\n", GDALDEMAppGetParserUsage(osProcessingMode).c_str()); 42 0 : GDALExit(1); 43 0 : } 44 : 45 : /************************************************************************/ 46 : /* main() */ 47 : /************************************************************************/ 48 : 49 22 : MAIN_START(argc, argv) 50 : 51 : { 52 : /* Check strict compilation and runtime library version as we use C++ API */ 53 22 : if (!GDAL_CHECK_VERSION(argv[0])) 54 0 : GDALExit(1); 55 : 56 22 : EarlySetConfigOptions(argc, argv); 57 : 58 22 : GDALAllRegister(); 59 : 60 : /* -------------------------------------------------------------------- */ 61 : /* Register standard GDAL drivers, and process generic GDAL */ 62 : /* command options. */ 63 : /* -------------------------------------------------------------------- */ 64 22 : argc = GDALGeneralCmdLineProcessor(argc, &argv, 0); 65 22 : if (argc < 2) 66 : { 67 0 : Usage(); 68 : } 69 : 70 43 : GDALDEMProcessingOptionsForBinary sOptionsForBinary; 71 : 72 43 : const std::string osProcessingMode = argv[1]; 73 : 74 : std::unique_ptr<GDALDEMProcessingOptions, 75 : decltype(&GDALDEMProcessingOptionsFree)> 76 : psOptions{GDALDEMProcessingOptionsNew(argv + 1, &sOptionsForBinary), 77 22 : GDALDEMProcessingOptionsFree}; 78 : 79 21 : CSLDestroy(argv); 80 : 81 21 : if (!psOptions) 82 0 : Usage(osProcessingMode); 83 : 84 21 : if (!(sOptionsForBinary.bQuiet)) 85 : { 86 21 : GDALDEMProcessingOptionsSetProgress(psOptions.get(), GDALTermProgress, 87 : nullptr); 88 : } 89 : 90 : // Open Dataset and get raster band. 91 : GDALDatasetH hSrcDataset = 92 21 : GDALOpen(sOptionsForBinary.osSrcFilename.c_str(), GA_ReadOnly); 93 : 94 21 : if (hSrcDataset == nullptr) 95 : { 96 0 : fprintf(stderr, "GDALOpen failed - %d\n%s\n", CPLGetLastErrorNo(), 97 : CPLGetLastErrorMsg()); 98 0 : GDALDestroyDriverManager(); 99 0 : GDALExit(1); 100 : } 101 : 102 21 : int bUsageError = FALSE; 103 : GDALDatasetH hOutDS = 104 21 : GDALDEMProcessing(sOptionsForBinary.osDstFilename.c_str(), hSrcDataset, 105 : sOptionsForBinary.osProcessing.c_str(), 106 : sOptionsForBinary.osColorFilename.c_str(), 107 21 : psOptions.get(), &bUsageError); 108 : 109 21 : if (bUsageError) 110 0 : Usage(osProcessingMode); 111 : 112 21 : const int nRetCode = hOutDS ? 0 : 1; 113 : 114 21 : GDALClose(hSrcDataset); 115 21 : GDALClose(hOutDS); 116 : 117 21 : GDALDestroy(); 118 : 119 21 : return nRetCode; 120 : } 121 : 122 0 : MAIN_END