Line data Source code
1 : /****************************************************************************** 2 : * $Id$ 3 : * 4 : * Project: GeoPackage/MBTiles Translator 5 : * Purpose: Definition of common classes for GeoPackage and MBTiles drivers. 6 : * Author: Even Rouault <even dot rouault at spatialys dot com> 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2014-2016, Even Rouault <even dot rouault at spatialys dot com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #ifndef GPKGMBTILESCOMMON_H_INCLUDED 15 : #define GPKGMBTILESCOMMON_H_INCLUDED 16 : 17 : #include "cpl_string.h" 18 : #include "gdal_pam.h" 19 : #include <sqlite3.h> 20 : 21 : typedef struct 22 : { 23 : int nRow; 24 : int nCol; 25 : int nIdxWithinTileData; 26 : bool abBandDirty[4]; 27 : } CachedTileDesc; 28 : 29 : typedef enum 30 : { 31 : GPKG_TF_PNG_JPEG, 32 : GPKG_TF_PNG, 33 : GPKG_TF_PNG8, 34 : GPKG_TF_JPEG, 35 : GPKG_TF_WEBP, 36 : GPKG_TF_PNG_16BIT, // For GPKG elevation data 37 : GPKG_TF_TIFF_32BIT_FLOAT // For GPKG elevation data 38 : } GPKGTileFormat; 39 : 40 : GPKGTileFormat GDALGPKGMBTilesGetTileFormat(const char *pszTF); 41 : const char *GDALMBTilesGetTileFormatName(GPKGTileFormat); 42 : 43 : class GDALGPKGMBTilesLikePseudoDataset 44 : { 45 : friend class GDALGPKGMBTilesLikeRasterBand; 46 : 47 : GDALGPKGMBTilesLikePseudoDataset(const GDALGPKGMBTilesLikePseudoDataset &) = 48 : delete; 49 : GDALGPKGMBTilesLikePseudoDataset & 50 : operator=(const GDALGPKGMBTilesLikePseudoDataset &) = delete; 51 : 52 : protected: 53 : bool m_bNew = false; 54 : bool m_bHasModifiedTiles = false; 55 : 56 : CPLString m_osRasterTable{}; 57 : GDALDataType m_eDT = GDT_Byte; 58 : int m_nDTSize = 1; 59 : double m_dfOffset = 0.0; 60 : double m_dfScale = 1.0; 61 : double m_dfPrecision = 1.0; 62 : GUInt16 m_usGPKGNull = 0; 63 : int m_nZoomLevel = -1; 64 : GByte *m_pabyCachedTiles = nullptr; 65 : CachedTileDesc m_asCachedTilesDesc[4]; 66 : int m_nShiftXTiles = 0; 67 : int m_nShiftXPixelsMod = 0; 68 : int m_nShiftYTiles = 0; 69 : int m_nShiftYPixelsMod = 0; 70 : int m_nTileMatrixWidth = 0; 71 : int m_nTileMatrixHeight = 0; 72 : 73 : GPKGTileFormat m_eTF = GPKG_TF_PNG_JPEG; 74 : bool m_bPNGSupports2Bands = 75 : true; // for test/debug purposes only. true is the nominal value 76 : bool m_bPNGSupportsCT = 77 : true; // for test/debug purposes only. true is the nominal value 78 : int m_nZLevel = 6; 79 : int m_nQuality = 75; 80 : bool m_bDither = false; 81 : 82 : GDALColorTable *m_poCT = nullptr; 83 : bool m_bTriedEstablishingCT = false; 84 : void *m_pabyHugeColorArray = nullptr; 85 : 86 : CPLString m_osWHERE{}; 87 : 88 : sqlite3_vfs *m_pMyVFS = nullptr; 89 : sqlite3 *m_hTempDB = nullptr; 90 : CPLString m_osTempDBFilename{}; 91 : time_t m_nLastSpaceCheckTimestamp = 0; 92 : bool m_bForceTempDBCompaction = false; 93 : GIntBig m_nAge = 0; 94 : 95 : int m_nTileInsertionCount = 0; 96 : 97 : GDALGPKGMBTilesLikePseudoDataset *m_poParentDS = nullptr; 98 : 99 : private: 100 : bool m_bInWriteTile = false; 101 : CPLErr WriteTileInternal(); /* should only be called by WriteTile() */ 102 : GIntBig GetTileId(int nRow, int nCol); 103 : bool DeleteTile(int nRow, int nCol); 104 : bool DeleteFromGriddedTileAncillary(GIntBig nTileId); 105 : void GetTileOffsetAndScale(GIntBig nTileId, double &dfTileOffset, 106 : double &dfTileScale); 107 : void FillBuffer(GByte *pabyData, size_t nPixels); 108 : void FillEmptyTile(GByte *pabyData); 109 : void FillEmptyTileSingleBand(GByte *pabyData); 110 : 111 : public: 112 : GDALGPKGMBTilesLikePseudoDataset(); 113 : virtual ~GDALGPKGMBTilesLikePseudoDataset(); 114 : 115 : void SetDataType(GDALDataType eDT); 116 : void SetGlobalOffsetScale(double dfOffset, double dfScale); 117 : 118 : CPLErr ReadTile(const CPLString &osMemFileName, GByte *pabyTileData, 119 : double dfTileOffset, double dfTileScale, 120 : bool *pbIsLossyFormat = nullptr); 121 : GByte *ReadTile(int nRow, int nCol); 122 : GByte *ReadTile(int nRow, int nCol, GByte *pabyData, 123 : bool *pbIsLossyFormat = nullptr); 124 : 125 : CPLErr WriteTile(); 126 : 127 : CPLErr FlushTiles(); 128 : CPLErr FlushRemainingShiftedTiles(bool bPartialFlush); 129 : CPLErr WriteShiftedTile(int nRow, int nCol, int iBand, int nDstXOffset, 130 : int nDstYOffset, int nDstXSize, int nDstYSize); 131 : CPLErr DoPartialFlushOfPartialTilesIfNecessary(); 132 : 133 : virtual CPLErr IFlushCacheWithErrCode(bool bAtClosing) = 0; 134 : virtual int IGetRasterCount() = 0; 135 : virtual GDALRasterBand *IGetRasterBand(int nBand) = 0; 136 : virtual sqlite3 *IGetDB() = 0; 137 : virtual bool IGetUpdate() = 0; 138 : virtual bool ICanIWriteBlock() = 0; 139 : virtual OGRErr IStartTransaction() = 0; 140 : virtual OGRErr ICommitTransaction() = 0; 141 : virtual const char *IGetFilename() = 0; 142 : virtual int GetRowFromIntoTopConvention(int nRow) = 0; 143 : }; 144 : 145 : class GDALGPKGMBTilesLikeRasterBand : public GDALPamRasterBand 146 : { 147 : GDALGPKGMBTilesLikeRasterBand(const GDALGPKGMBTilesLikeRasterBand &) = 148 : delete; 149 : GDALGPKGMBTilesLikeRasterBand & 150 : operator=(const GDALGPKGMBTilesLikeRasterBand &) = delete; 151 : 152 : protected: 153 : GDALGPKGMBTilesLikePseudoDataset *m_poTPD = nullptr; 154 : int m_nDTSize = 0; 155 : bool m_bHasNoData = false; 156 : double m_dfNoDataValue = 0; 157 : CPLString m_osUom{}; 158 : 159 : public: 160 : GDALGPKGMBTilesLikeRasterBand(GDALGPKGMBTilesLikePseudoDataset *poTPD, 161 : int nTileWidth, int nTileHeight); 162 : 163 : virtual CPLErr IReadBlock(int nBlockXOff, int nBlockYOff, 164 : void *pData) override; 165 : virtual CPLErr IWriteBlock(int nBlockXOff, int nBlockYOff, 166 : void *pData) override; 167 : virtual CPLErr FlushCache(bool bAtClosing) override; 168 : 169 : int IGetDataCoverageStatus(int nXOff, int nYOff, int nXSize, int nYSize, 170 : int nMaskFlagStop, double *pdfDataPct) override; 171 : 172 : virtual GDALColorTable *GetColorTable() override; 173 : virtual CPLErr SetColorTable(GDALColorTable *poCT) override; 174 : 175 : void AssignColorTable(const GDALColorTable *poCT); 176 : 177 : virtual GDALColorInterp GetColorInterpretation() override; 178 : virtual CPLErr SetColorInterpretation(GDALColorInterp) override; 179 : 180 : virtual double GetNoDataValue(int *pbSuccess = nullptr) override; 181 : 182 1 : virtual const char *GetUnitType() override 183 : { 184 1 : return m_osUom.c_str(); 185 : } 186 : 187 : void SetNoDataValueInternal(double dfNoDataValue); 188 : 189 2 : void SetUnitTypeInternal(const CPLString &osUom) 190 : { 191 2 : m_osUom = osUom; 192 2 : } 193 : 194 4263 : GDALRasterBlock *AccessibleTryGetLockedBlockRef(int nBlockXOff, 195 : int nBlockYOff) 196 : { 197 4263 : return TryGetLockedBlockRef(nBlockXOff, nBlockYOff); 198 : } 199 : }; 200 : 201 : #endif // GPKGMBTILESCOMMON_H_INCLUDED