33 const QVariantMap tileInfo = json.value( QStringLiteral(
"tileInfo" ) ).toMap();
35 const QVariantMap origin = tileInfo.value( QStringLiteral(
"origin" ) ).toMap();
36 const double originX = origin.value( QStringLiteral(
"x" ) ).toDouble();
37 const double originY = origin.value( QStringLiteral(
"y" ) ).toDouble();
39 const int rows = tileInfo.value( QStringLiteral(
"rows" ), QStringLiteral(
"512" ) ).toInt();
40 const int cols = tileInfo.value( QStringLiteral(
"cols" ), QStringLiteral(
"512" ) ).toInt();
43 QgsDebugError( QStringLiteral(
"row/col size mismatch: %1 vs %2 - tile misalignment may occur" ).arg( rows ).arg( cols ) );
48 const QVariantList lodList = tileInfo.value( QStringLiteral(
"lods" ) ).toList();
49 bool foundLevel0 =
false;
50 double z0Dimension = 0;
52 for (
const QVariant &lod : lodList )
54 const QVariantMap lodMap = lod.toMap();
55 const int level = lodMap.value( QStringLiteral(
"level" ) ).toInt();
58 z0Dimension = lodMap.value( QStringLiteral(
"resolution" ) ).toDouble() * rows;
67 for (
const QVariant &lod : lodList )
69 const QVariantMap lodMap = lod.toMap();
70 const int level = lodMap.value( QStringLiteral(
"level" ) ).toInt();
79 tm.
setScale( lodMap.value( QStringLiteral(
"scale" ) ).toDouble() );
85 const QVariantList tileMap = rootTileMap.value( QStringLiteral(
"index" ) ).toList();
86 if ( !tileMap.isEmpty() )
126 std::vector< QgsTileXYZ > bottomToTopQueue;
127 bottomToTopQueue.reserve(
id.zoomLevel() );
133 for (
int zoomLevel =
id.zoomLevel(); zoomLevel > 0; zoomLevel-- )
135 bottomToTopQueue.emplace_back(
QgsTileXYZ( column, row, zoomLevel ) );
142 QVariantList node = tileMap;
143 for (
int index =
static_cast<int>( bottomToTopQueue.size() ) - 1; index >= 0; --index )
145 const QgsTileXYZ &tile = bottomToTopQueue[ index ];
146 int childColumn = tile.
column() - column;
147 int childRow = tile.
row() - row;
149 if ( childColumn == 1 && childRow == 0 )
151 else if ( childColumn == 0 && childRow == 1 )
153 else if ( childColumn == 1 && childRow == 1 )
156 const QVariant childNode = node.at( childIndex );
157 if ( childNode.userType() == QMetaType::Type::QVariantList )
159 node = childNode.toList();
160 column = tile.
column() * 2;
161 row = tile.
row() * 2;
167 const long long nodeInt = childNode.toLongLong( &ok );
171 QgsDebugError( QStringLiteral(
"Found tile index node with unsupported value: %1" ).arg( childNode.toString() ) );
173 else if ( nodeInt == 0 )
178 else if ( nodeInt == 1 )
184 else if ( nodeInt == 2 )
200 const QMap< int, QgsTileMatrix > tileMatrices =
mTileMatrices;
204 const auto it = tileMatrices.constFind(
id.zoomLevel() );
205 if ( it == tileMatrices.constEnd() )
209 if (
id.column() >= it->matrixWidth() ||
id.row() >= it->matrixHeight() )
@ Critical
Critical/error message.
@ Esri
No scale doubling, always rounds down when matching to available tile levels.
TileAvailability
Possible availability states for a tile within a tile matrix.
@ UseLowerZoomLevelTile
Tile is not available at the requested zoom level, it should be replaced by a tile from a lower zoom ...
@ NotAvailable
Tile is not available within the matrix, e.g. there is no content for the tile.
@ AvailableNoChildren
Tile is available within the matrix, and is known to have no children (ie no higher zoom level tiles ...
@ Available
Tile is available within the matrix.
static QgsCoordinateReferenceSystem convertSpatialReference(const QVariantMap &spatialReferenceMap)
Converts a spatial reference JSON definition to a QgsCoordinateReferenceSystem value.
This class represents a coordinate reference system (CRS).
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
A class to represent a 2D point.
void addGoogleCrs84QuadTiles(int minimumZoom=0, int maximumZoom=14)
Adds tile matrices corresponding to the standard web mercator/GoogleCRS84Quad setup.
QgsCoordinateReferenceSystem crs() const
Returns the coordinate reference system associated with the tiles.
std::function< Qgis::TileAvailability(QgsTileXYZ id) > mTileAvailabilityFunction
int minimumZoom() const
Returns the minimum zoom level for tiles present in the set.
QMap< int, QgsTileMatrix > mTileMatrices
int maximumZoom() const
Returns the maximum zoom level for tiles present in the set.
void addMatrix(const QgsTileMatrix &matrix)
Adds a matrix to the set.
void setRootMatrix(const QgsTileMatrix &matrix)
Sets the root tile matrix (usually corresponding to zoom level 0).
void setScaleToTileZoomMethod(Qgis::ScaleToTileZoomLevelMethod method)
Sets the scale to tile zoom method.
std::function< Qgis::TileAvailability(QgsTileXYZ id, QgsTileXYZ &replacement) > mTileReplacementFunction
Defines a matrix of tiles for a single zoom level: it is defined by its size (width *.
void setScale(double scale)
Sets the scale denominator of the tile matrix.
static QgsTileMatrix fromCustomDef(int zoomLevel, const QgsCoordinateReferenceSystem &crs, const QgsPointXY &z0TopLeftPoint, double z0Dimension, int z0MatrixWidth=1, int z0MatrixHeight=1)
Returns a tile matrix for a specific CRS, top left point, zoom level 0 dimension in CRS units.
Stores coordinates of a tile in a tile matrix set.
int zoomLevel() const
Returns tile's zoom level (Z)
int column() const
Returns tile's column index (X)
int row() const
Returns tile's row index (Y)
Encapsulates properties of a vector tile matrix set, including tile origins and scaling information.
bool fromEsriJson(const QVariantMap &json, const QVariantMap &rootTileMap=QVariantMap())
Initializes the tile structure settings from an ESRI REST VectorTileService json map.
static QgsVectorTileMatrixSet fromWebMercator(int minimumZoom=0, int maximumZoom=14)
Returns a vector tile structure corresponding to the standard web mercator/GoogleCRS84Quad setup.
#define QgsDebugError(str)