/src/gdal/apps/gdalalg_raster_tile.h
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: GDAL |
4 | | * Purpose: gdal "raster tile" subcommand |
5 | | * Author: Even Rouault <even dot rouault at spatialys.com> |
6 | | * |
7 | | ****************************************************************************** |
8 | | * Copyright (c) 2025, Even Rouault <even dot rouault at spatialys.com> |
9 | | * |
10 | | * SPDX-License-Identifier: MIT |
11 | | ****************************************************************************/ |
12 | | |
13 | | #ifndef GDALALG_RASTER_TILE_INCLUDED |
14 | | #define GDALALG_RASTER_TILE_INCLUDED |
15 | | |
16 | | #include "gdalrasterpipelinestepalgorithm.h" |
17 | | |
18 | | #include "cpl_string.h" |
19 | | |
20 | | #include <limits> |
21 | | |
22 | | //! @cond Doxygen_Suppress |
23 | | |
24 | | class GDALDataset; |
25 | | class GDALDriver; |
26 | | |
27 | | typedef struct _CPLSpawnedProcess CPLSpawnedProcess; |
28 | | |
29 | | /************************************************************************/ |
30 | | /* GDALRasterTileAlgorithm */ |
31 | | /************************************************************************/ |
32 | | |
33 | | class GDALRasterTileAlgorithm /* non final */ |
34 | | : public GDALRasterPipelineStepAlgorithm |
35 | | { |
36 | | public: |
37 | | static constexpr const char *NAME = "tile"; |
38 | | static constexpr const char *DESCRIPTION = |
39 | | "Generate tiles in separate files from a raster dataset."; |
40 | | static constexpr const char *HELP_URL = "/programs/gdal_raster_tile.html"; |
41 | | |
42 | | explicit GDALRasterTileAlgorithm(bool standaloneStep = false); |
43 | | ~GDALRasterTileAlgorithm() override; |
44 | | |
45 | | bool CanBeLastStep() const override |
46 | 0 | { |
47 | 0 | return true; |
48 | 0 | } |
49 | | |
50 | | bool IsNativelyStreamingCompatible() const override |
51 | 0 | { |
52 | 0 | return false; |
53 | 0 | } |
54 | | |
55 | | bool SupportsInputMultiThreading() const override |
56 | 0 | { |
57 | 0 | return true; |
58 | 0 | } |
59 | | |
60 | | int GetOutputType() const override |
61 | 0 | { |
62 | 0 | return 0; |
63 | 0 | } |
64 | | |
65 | | private: |
66 | | CPL_DISALLOW_COPY_ASSIGN(GDALRasterTileAlgorithm) |
67 | | |
68 | | std::string m_outputDir{}; |
69 | | std::vector<std::string> m_metadata{}; |
70 | | bool m_copySrcMetadata = false; |
71 | | std::string m_tilingScheme{}; |
72 | | std::string m_convention = "xyz"; |
73 | | std::string m_resampling{}; |
74 | | std::string m_overviewResampling{}; |
75 | | int m_minZoomLevel = -1; |
76 | | int m_maxZoomLevel = -1; |
77 | | bool m_minZoomLevelSingleTile = false; |
78 | | bool m_noIntersectionIsOK = false; |
79 | | int m_minTileX = -1; |
80 | | int m_minTileY = -1; |
81 | | int m_maxTileX = -1; |
82 | | int m_maxTileY = -1; |
83 | | int m_ovrZoomLevel = -1; // Used in spawn mode |
84 | | int m_minOvrTileX = -1; // Used in spawn mode |
85 | | int m_minOvrTileY = -1; // Used in spawn mode |
86 | | int m_maxOvrTileX = -1; // Used in spawn mode |
87 | | int m_maxOvrTileY = -1; // Used in spawn mode |
88 | | int m_tileSize = 0; |
89 | | bool m_addalpha = false; |
90 | | bool m_noalpha = false; |
91 | | double m_dstNoData = 0; |
92 | | bool m_skipBlank = false; |
93 | | bool m_auxXML = false; |
94 | | bool m_resume = false; |
95 | | bool m_kml = false; |
96 | | bool m_spawned = false; |
97 | | bool m_forked = false; |
98 | | bool m_dummy = false; |
99 | | int m_numThreads = 0; |
100 | | std::string m_parallelMethod{}; |
101 | | |
102 | | std::string m_excludedValues{}; |
103 | | double m_excludedValuesPctThreshold = 50; |
104 | | double m_nodataValuesPctThreshold = 100; |
105 | | |
106 | | std::vector<std::string> m_webviewers{}; |
107 | | std::string m_url{}; |
108 | | std::string m_title{}; |
109 | | std::string m_copyright{}; |
110 | | std::string m_mapmlTemplate{}; |
111 | | |
112 | | // Work variables |
113 | | std::string m_numThreadsStr{"ALL_CPUS"}; |
114 | | std::map<std::string, std::string> m_mapTileMatrixIdentifierToScheme{}; |
115 | | GDALDataset *m_poSrcDS = nullptr; |
116 | | GDALDataset *m_poSrcOvrDS = nullptr; |
117 | | bool m_bIsNamedNonMemSrcDS = false; |
118 | | GDALDriver *m_poDstDriver = nullptr; |
119 | | std::string m_osGDALPath{}; |
120 | | |
121 | | // Private methods |
122 | | bool RunImpl(GDALProgressFunc pfnProgress, void *pProgressData) override; |
123 | | bool RunStep(GDALPipelineStepRunContext &ctxt) override; |
124 | | |
125 | | bool ValidateOutputFormat(GDALDataType eSrcDT) const; |
126 | | |
127 | | static void ComputeJobChunkSize(int nMaxJobCount, int nTilesPerCol, |
128 | | int nTilesPerRow, double &dfTilesYPerJob, |
129 | | int &nYOuterIterations, |
130 | | double &dfTilesXPerJob, |
131 | | int &nXOuterIterations); |
132 | | |
133 | | bool AddArgToArgv(const GDALAlgorithmArg *arg, |
134 | | CPLStringList &aosArgv) const; |
135 | | |
136 | | bool IsCompatibleOfSpawn(const char *&pszErrorMsg); |
137 | | |
138 | | int GetMaxChildCount(int nMaxJobCount) const; |
139 | | |
140 | | void WaitForSpawnedProcesses( |
141 | | bool &bRet, const std::vector<std::string> &asCommandLines, |
142 | | std::vector<CPLSpawnedProcess *> &ahSpawnedProcesses) const; |
143 | | bool GenerateBaseTilesSpawnMethod( |
144 | | int nBaseTilesPerCol, int nBaseTilesPerRow, int nMinTileX, |
145 | | int nMinTileY, int nMaxTileX, int nMaxTileY, uint64_t nTotalTiles, |
146 | | uint64_t nBaseTiles, GDALProgressFunc pfnProgress, void *pProgressData); |
147 | | |
148 | | bool GenerateOverviewTilesSpawnMethod( |
149 | | int iZ, int nOvrMinTileX, int nOvrMinTileY, int nOvrMaxTileX, |
150 | | int nOvrMaxTileY, std::atomic<uint64_t> &nCurTile, uint64_t nTotalTiles, |
151 | | GDALProgressFunc pfnProgress, void *pProgressData); |
152 | | }; |
153 | | |
154 | | /************************************************************************/ |
155 | | /* GDALRasterTileAlgorithmStandalone */ |
156 | | /************************************************************************/ |
157 | | |
158 | | class GDALRasterTileAlgorithmStandalone final : public GDALRasterTileAlgorithm |
159 | | { |
160 | | public: |
161 | | GDALRasterTileAlgorithmStandalone() |
162 | 0 | : GDALRasterTileAlgorithm(/* standaloneStep = */ true) |
163 | 0 | { |
164 | 0 | } |
165 | | |
166 | | ~GDALRasterTileAlgorithmStandalone() override; |
167 | | }; |
168 | | |
169 | | //! @endcond |
170 | | |
171 | | #endif |