Hi folks -
I have access to a server which serves Maptiler RGB-terrain images in webp format, served as OSM-style URLs. Following the example at samples/cloud/elevation-profile/elevationProvider.js at main · maptiler/samples · GitHub, I created the following CustomHeightmapTerrainProvider:
return new Cesium.CustomHeightmapTerrainProvider({
width: 512,
height: 512,
callback: async function (x, y, level) {
let img = await terrainImageryProvider.requestImage(x, y, level);
// img appears to be an ImageBitmap. In order to read its
// data, you have to ask a canvas.
const canvas = document.createElement('canvas');
canvas.width = img.width
canvas.height = img.height
const context = canvas.getContext('2d')
context.drawImage(img, 0, 0)
let data = context.getImageData(0, 0, img.width, img.height).data;
// data is an array of unsigned 8-bit ints.
// So, let's create a new array.
// All zeros, for right now.
let array = new Float32Array(512 * 512);
for (let y = 0; y < img.height; y++) {
for (let x = 0; x < img.width; x++) {
const imageDataIndex = (y * (img.width * 4)) + (x * 4);
const red = data[imageDataIndex];
const green = data[imageDataIndex + 1];
const blue = data[imageDataIndex + 2];
array[(y * img.width) + x] = -10000 + ((red * 256 * 256 + green * 256 + blue) * 0.1);
}
}
return array;
}
});
I’ve done some spot testing, comparing the results to the results using Cesium.createWorldTerrainAsync(), and I’m pretty sure what I’ve done is wrong, but I’m not sure where to start fixing it. I’m pretty sure the tiles are in OSM rather than TMS layout.
Please don’t suggest that I convert the data into .terrain files and use the CesiumTerrainProvider; I don’t have that option right now.
Thanks in advance.