Skip to content

Instantly share code, notes, and snippets.

@ezze
Created April 18, 2017 00:03
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ezze/d57e857a287677c9b43b5a6a43243b14 to your computer and use it in GitHub Desktop.
Save ezze/d57e857a287677c9b43b5a6a43243b14 to your computer and use it in GitHub Desktop.
Cesium: calculate camera heights for tile zoom levels
var zoomLevelHeights = getZoomLevelHeights(1);
for (var i = 0; i < zoomLevelHeights.length; i++) {
console.log('Level: ' + zoomLevelHeights[i].level + ', camera height: ' + zoomLevelHeights[i].height);
}
function getZoomLevelHeights(precision) {
precision = precision || 10;
var step = 100000.0;
var result = [];
var currentZoomLevel = 0;
for (var height = 100000000.0; height > step; height = height - step) {
var level = detectZoomLevel(height);
if (level === null) {
break;
}
if (level !== currentZoomLevel) {
var minHeight = height;
var maxHeight = height + step;
while (maxHeight - minHeight > precision) {
height = minHeight + (maxHeight - minHeight) / 2;
if (detectZoomLevel(height) === level) {
minHeight = height;
}
else {
maxHeight = height;
}
}
result.push({
level: level,
height: Math.round(height)
});
currentZoomLevel = level;
if (result.length >= 2) {
step = (result[result.length - 2].height - height) / 1000.0;
}
}
}
return result;
}
function detectZoomLevel(distance) {
var scene = cesiumWidget.scene;
var tileProvider = scene.globe._surface.tileProvider;
var quadtree = tileProvider._quadtree;
var drawingBufferHeight = cesiumWidget.canvas.height;
var sseDenominator = cesiumWidget.camera.frustum.sseDenominator;
for (var level = 0; level <= 19; level++) {
var maxGeometricError = tileProvider.getLevelMaximumGeometricError(level);
var error = (maxGeometricError * drawingBufferHeight) / (distance * sseDenominator);
if (error < quadtree.maximumScreenSpaceError) {
return level;
}
}
return null;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment