Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: GDAL
4 : * Purpose: STACTA (Spatio-Temporal Asset Catalog Tiled Assets) driver
5 : * Author: Even Rouault, <even dot rouault at spatialys.com>
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 2020, Even Rouault <even dot rouault at spatialys.com>
9 : *
10 : * SPDX-License-Identifier: MIT
11 : ****************************************************************************/
12 :
13 : #ifndef STACTADATASET_H
14 : #define STACTADATASET_H
15 :
16 : #include "cpl_mem_cache.h"
17 : #include "cpl_string.h"
18 : #include "gdal_pam.h"
19 : #include "memdataset.h"
20 : #include "tilematrixset.hpp"
21 :
22 : #include <array>
23 : #include <map>
24 : #include <memory>
25 : #include <vector>
26 :
27 : namespace
28 : {
29 : struct Limits
30 : {
31 : int min_tile_col = 0;
32 : int max_tile_col = 0;
33 : int min_tile_row = 0;
34 : int max_tile_row = 0;
35 : };
36 : } // namespace
37 : /************************************************************************/
38 : /* ==================================================================== */
39 : /* STACTADataset */
40 : /* ==================================================================== */
41 : /************************************************************************/
42 :
43 : class STACTARawDataset;
44 :
45 : class STACTADataset final : public GDALPamDataset
46 : {
47 : friend class STACTARasterBand;
48 : friend class STACTARawDataset;
49 : friend class STACTARawRasterBand;
50 :
51 : std::array<double, 6> m_adfGeoTransform = {{0.0, 1.0, 0, 0.0, 0.0, 1.0}};
52 : OGRSpatialReference m_oSRS{};
53 : std::unique_ptr<GDALDataset> m_poDS{};
54 : // Array of overview datasets, that are guaranteed to have the same
55 : // georeferenced extent as m_poDS (and this dataset), for compliance
56 : // with the GDAL data model. They are thus possibly VRT subsets of
57 : // the STACTARawDataset stored in m_apoIntermediaryDS
58 : std::vector<std::unique_ptr<GDALDataset>> m_apoOverviewDS{};
59 : std::vector<std::unique_ptr<GDALDataset>> m_apoIntermediaryDS{};
60 :
61 : // Cache of tile datasets
62 : lru11::Cache<std::string, std::unique_ptr<GDALDataset>> m_oCacheTileDS{32};
63 :
64 : bool m_bDownloadWholeMetaTile = false;
65 : bool m_bSkipMissingMetaTile = false;
66 :
67 : bool Open(GDALOpenInfo *poOpenInfo);
68 :
69 : public:
70 : static int Identify(GDALOpenInfo *poOpenInfo);
71 : static GDALDataset *OpenStatic(GDALOpenInfo *poOpenInfo);
72 :
73 : ~STACTADataset() override;
74 :
75 : const OGRSpatialReference *GetSpatialRef() const override;
76 : CPLErr GetGeoTransform(double *padfGeoTransform) override;
77 : CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
78 : int nYSize, void *pData, int nBufXSize, int nBufYSize,
79 : GDALDataType eBufType, int nBandCount,
80 : BANDMAP_TYPE panBandMap, GSpacing nPixelSpace,
81 : GSpacing nLineSpace, GSpacing nBandSpace,
82 : GDALRasterIOExtraArg *psExtraArg) override;
83 : CPLErr FlushCache(bool bAtClosing) override;
84 : };
85 :
86 : /************************************************************************/
87 : /* ==================================================================== */
88 : /* STACTARasterBand */
89 : /* ==================================================================== */
90 : /************************************************************************/
91 :
92 : class STACTARasterBand final : public GDALRasterBand
93 : {
94 : friend class STACTADataset;
95 : GDALColorInterp m_eColorInterp = GCI_Undefined;
96 : int m_bHasNoDataValue = false;
97 : double m_dfNoData = 0;
98 : double m_dfScale = 1.0;
99 : double m_dfOffset = 0.0;
100 : std::string m_osUnit{};
101 :
102 : public:
103 : STACTARasterBand(STACTADataset *poDSIn, int nBandIn,
104 : GDALRasterBand *poProtoBand);
105 : CPLErr IReadBlock(int nBlockXOff, int nBlockYOff, void *pImage) override;
106 : CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
107 : GDALDataType, GSpacing, GSpacing,
108 : GDALRasterIOExtraArg *psExtraArg) override;
109 :
110 0 : GDALColorInterp GetColorInterpretation() override
111 : {
112 0 : return m_eColorInterp;
113 : }
114 :
115 : int GetOverviewCount() override;
116 : GDALRasterBand *GetOverview(int nIdx) override;
117 : double GetNoDataValue(int *pbHasNoData = nullptr) override;
118 :
119 6 : const char *GetUnitType() override
120 : {
121 6 : return m_osUnit.c_str();
122 : }
123 :
124 6 : double GetScale(int *pbHasValue = nullptr) override
125 : {
126 6 : if (pbHasValue)
127 6 : *pbHasValue = m_dfScale != 1.0;
128 6 : return m_dfScale;
129 : }
130 :
131 6 : double GetOffset(int *pbHasValue = nullptr) override
132 : {
133 6 : if (pbHasValue)
134 6 : *pbHasValue = m_dfOffset != 0.0;
135 6 : return m_dfOffset;
136 : }
137 : };
138 :
139 : /************************************************************************/
140 : /* ==================================================================== */
141 : /* STACTARawDataset */
142 : /* ==================================================================== */
143 : /************************************************************************/
144 :
145 : class STACTARawDataset final : public GDALDataset
146 : {
147 : friend class STACTADataset;
148 : friend class STACTARawRasterBand;
149 :
150 : CPLString m_osURLTemplate{};
151 : int m_nMinMetaTileCol = 0;
152 : int m_nMinMetaTileRow = 0;
153 : int m_nMetaTileWidth = 0;
154 : int m_nMetaTileHeight = 0;
155 : STACTADataset *m_poMasterDS = nullptr;
156 :
157 : std::array<double, 6> m_adfGeoTransform = {{0.0, 1.0, 0, 0.0, 0.0, 1.0}};
158 : OGRSpatialReference m_oSRS{};
159 :
160 : public:
161 : bool InitRaster(GDALDataset *poProtoDS,
162 : const std::vector<GDALDataType> &aeDT,
163 : const std::vector<bool> &abSetNoData,
164 : const std::vector<double> &adfNoData,
165 : const gdal::TileMatrixSet *poTMS, const std::string &osTMId,
166 : const gdal::TileMatrixSet::TileMatrix &oTM,
167 : const std::map<CPLString, Limits> &oMapLimits);
168 :
169 2 : const OGRSpatialReference *GetSpatialRef() const override
170 : {
171 2 : return &m_oSRS;
172 : }
173 :
174 : CPLErr GetGeoTransform(double *padfGeoTransform) override;
175 : CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
176 : int nYSize, void *pData, int nBufXSize, int nBufYSize,
177 : GDALDataType eBufType, int nBandCount,
178 : BANDMAP_TYPE panBandMap, GSpacing nPixelSpace,
179 : GSpacing nLineSpace, GSpacing nBandSpace,
180 : GDALRasterIOExtraArg *psExtraArg) override;
181 : };
182 :
183 : /************************************************************************/
184 : /* ==================================================================== */
185 : /* STACTARawRasterBand */
186 : /* ==================================================================== */
187 : /************************************************************************/
188 :
189 : class STACTARawRasterBand final : public GDALRasterBand
190 : {
191 : GDALColorInterp m_eColorInterp = GCI_Undefined;
192 : int m_bHasNoDataValue = false;
193 : double m_dfNoData = 0;
194 :
195 : public:
196 : STACTARawRasterBand(STACTARawDataset *poDSIn, int nBandIn,
197 : GDALRasterBand *poProtoBand);
198 :
199 : STACTARawRasterBand(STACTARawDataset *poDSIn, int nBandIn, GDALDataType eDT,
200 : bool bSetNoData, double dfNoData);
201 :
202 : CPLErr IReadBlock(int nBlockXOff, int nBlockYOff, void *pImage) override;
203 : CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
204 : int nYSize, void *pData, int nBufXSize, int nBufYSize,
205 : GDALDataType eBufType, GSpacing nPixelSpace,
206 : GSpacing nLineSpace,
207 : GDALRasterIOExtraArg *psExtraArg) override;
208 :
209 69 : GDALColorInterp GetColorInterpretation() override
210 : {
211 69 : return m_eColorInterp;
212 : }
213 :
214 : double GetNoDataValue(int *pbHasNoData = nullptr) override;
215 : };
216 :
217 : #endif // STACTADATASET_H
|