Hi there! I’m new to cesium,and i’m using Cesium World Terrain provided by ion,of cause it’s contains water mask and metadata,and there has a function createQuantizedMeshTerrainData in CesiumTerrainProvider.js.When QuantizedMeshExtensionIds is 4,it means metadata,so create a Quadtree.So what’s the rules of the metadata extension in terrain?
I only know some that:
terrain is tms standard service.
Level0 is 0/0/0.terrain and 0/1/0.terrain,and when comes to level1,the 000 is divided into four tiles,so
Level1:{endX: 1, endY: 1, startX: 0, startY: 0}
Level2:{endX: 3, endY: 3, startX: 0, startY: 0}
Level3:{endX: 7, endY: 7, startX: 0, startY: 0}
Level4:{endX: 15, endY: 15, startX: 0, startY: 0}
but,when comes to Level5,it’s divided into three area:
{endX: 21, endY: 31, startX: 0, startY: 0}
{endX: 31, endY: 5, startX: 22, startY: 0}
{endX: 31, endY: 31, startX: 22, startY: 6}
and Level6,Level7,Level8 also be divided into three area.
When comes to Level9,it’s divided into 226 area:
{endX: 355, endY: 298, startX: 298, startY: 213}
{endX: 355, endY: 426, startX: 298, startY: 369}
{endX: 355, endY: 113, startX: 284, startY: 99}
{endX: 341, endY: 212, startX: 298, startY: 128}
…
So may I know the rules of area or block?
And all mentioned above is from here source code,there is log of availableTiles at line 309
var availabilityLevels = data.metadataAvailability;
var availableTiles = data.available;
var availability;
if (defined(availableTiles) && !defined(availabilityLevels)) {
availability = new TileAvailability(
that._tilingScheme,
availableTiles.length
);
for (var level = 0; level < availableTiles.length; ++level) {
var rangesAtLevel = availableTiles[level];
var yTiles = that._tilingScheme.getNumberOfYTilesAtLevel(level);
if (!defined(overallAvailability[level])) {
overallAvailability[level] = [];
}
for (
var rangeIndex = 0;
rangeIndex < rangesAtLevel.length;
++rangeIndex
) {
var range = rangesAtLevel[rangeIndex];
var yStart = yTiles - range.endY - 1;
var yEnd = yTiles - range.startY - 1;
overallAvailability[level].push([
range.startX,
yStart,
range.endX,
yEnd,
]);
availability.addAvailableTileRange(
level,
range.startX,
yStart,
range.endX,
yEnd
);
}
}
} else if (defined(availabilityLevels)) {
availabilityTilesLoaded = new TileAvailability(
that._tilingScheme,
maxZoom
);
availability = new TileAvailability(that._tilingScheme, maxZoom);
overallAvailability[0] = [[0, 0, 1, 0]];
availability.addAvailableTileRange(0, 0, 0, 1, 0);
}