Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: Class to handle TileMatrixSet 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 TILEMATRIXSET_HPP_INCLUDED 14 : #define TILEMATRIXSET_HPP_INCLUDED 15 : 16 : #include "cpl_port.h" 17 : 18 : #include <memory> 19 : #include <limits> 20 : #include <set> 21 : #include <string> 22 : #include <vector> 23 : 24 : //! @cond Doxygen_Suppress 25 : 26 : namespace gdal 27 : { 28 : 29 : class CPL_DLL TileMatrixSet 30 : { 31 : static constexpr double NaN = std::numeric_limits<double>::quiet_NaN(); 32 : 33 : public: 34 2 : const std::string &identifier() const 35 : { 36 2 : return mIdentifier; 37 : } 38 : 39 2 : const std::string &title() const 40 : { 41 2 : return mTitle; 42 : } 43 : 44 : //! "abstract" in TMS v1 / "description" in TMS v2 45 2 : const std::string &abstract() const 46 : { 47 2 : return mAbstract; 48 : } 49 : 50 : struct CPL_DLL BoundingBox 51 : { 52 : std::string mCrs{}; //! Can be a URL, a URI, a WKT or PROJJSON string. 53 : double mLowerCornerX{NaN}; 54 : double mLowerCornerY{NaN}; 55 : double mUpperCornerX{NaN}; 56 : double mUpperCornerY{NaN}; 57 : }; 58 : 59 32 : const BoundingBox &bbox() const 60 : { 61 32 : return mBbox; 62 : } 63 : 64 : //! Can be a URL, a URI, a WKT or PROJJSON string. 65 245 : const std::string &crs() const 66 : { 67 245 : return mCrs; 68 : } 69 : 70 2 : const std::string &wellKnownScaleSet() const 71 : { 72 2 : return mWellKnownScaleSet; 73 : } 74 : 75 : struct CPL_DLL TileMatrix 76 : { 77 : std::string mId{}; 78 : double mScaleDenominator{NaN}; 79 : double mResX{ 80 : NaN}; // computed from mScaleDenominator and CRS definition 81 : double mResY{ 82 : NaN}; // computed from mScaleDenominator and CRS definition 83 : double mTopLeftX{NaN}; 84 : double mTopLeftY{NaN}; 85 : int mTileWidth{}; 86 : int mTileHeight{}; 87 : int mMatrixWidth{}; 88 : int mMatrixHeight{}; 89 : 90 : struct CPL_DLL VariableMatrixWidth 91 : { 92 : int mCoalesce{}; 93 : int mMinTileRow{}; 94 : int mMaxTileRow{}; 95 : }; 96 : 97 : std::vector<VariableMatrixWidth> mVariableMatrixWidthList{}; 98 : }; 99 : 100 170 : const std::vector<TileMatrix> &tileMatrixList() const 101 : { 102 170 : return mTileMatrixList; 103 : } 104 : 105 : /** Parse a TileMatrixSet definition, passed inline or by filename, 106 : * corresponding to the JSON encoding of the OGC Two Dimensional Tile Matrix 107 : * Set: http://docs.opengeospatial.org/is/17-083r2/17-083r2.html */ 108 : static std::unique_ptr<TileMatrixSet> parse(const char *fileOrDef); 109 : 110 : /** Return hardcoded tile matrix set names (such as GoogleMapsCompatible), 111 : * as well as XXX for each tms_XXXX.json in GDAL data directory */ 112 : static std::set<std::string> listPredefinedTileMatrixSets(); 113 : 114 : bool haveAllLevelsSameTopLeft() const; 115 : 116 : bool haveAllLevelsSameTileSize() const; 117 : 118 : bool hasOnlyPowerOfTwoVaryingScales() const; 119 : 120 : bool hasVariableMatrixWidth() const; 121 : 122 : private: 123 462 : TileMatrixSet() = default; 124 : 125 : std::string mIdentifier{}; 126 : std::string mTitle{}; 127 : std::string mAbstract{}; 128 : BoundingBox mBbox{}; 129 : std::string mCrs{}; 130 : std::string mWellKnownScaleSet{}; 131 : std::vector<TileMatrix> mTileMatrixList{}; 132 : }; 133 : 134 : } // namespace gdal 135 : 136 : //! @endcond 137 : 138 : #endif // TILEMATRIXSET_HPP_INCLUDED