Coverage Report

Created: 2026-07-25 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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