是否可以在鼠标悬停时从ol.source.raster获取像素值 [英] Is it possible to get pixel values from ol.source.raster on mouse over
问题描述
基于ol3和mapbox全球地形的海高示例,我们进行了类似的设置,将高程值放入图块并使用ol.source.raster进行设置
Based on the sea height eample from ol3 and mapbox global terrain we made a similar setup putting elevation values into tiles and setting up with ol.source.raster
var elevation = new ol.source.TileImage({
url: penetrationUrls[this.designator.toLowerCase()],
projection: newProj,// "EPSG:27700",
crossOrigin: 'anonymous',
tileGrid: tilegrid
});
var raster = new ol.source.Raster({
sources: [elevation],
operation: penetrates
});
现在-
1)当鼠标悬停在查询像素值以显示工具提示高程时,有什么聪明的方法吗? 2)如果要查询线串或其他内容后的高度,是否有一种聪明的方法可以重用已加载的图块?
1) is there any smart way to when having mouse over to query the pixel value to show tooltip for the elevation? 2) is there a smart way to reuse already loaded tiles if wanting toquery the heights following a linestring or something?
推荐答案
我们不渲染该图层,下面的代码是我最终使用的代码.跳过正在操纵高程源的栅格图层.
We do not render the layer and the following code was what I ended up using. Skipped the raster layers that was manipulating the elevation source.
如果对此进行改进,我会在图块缓存上添加一个LRU缓存,也许有可能挂接到ols图块缓存中.
If improving on this, i would add a LRU cache on the tile cache, maybe its possible to hook into ols tile cache.
var elevation = new ol.source.TileImage({
url: options.template,
projection: elevationGridProjection,
crossOrigin: 'anonymous',
tileGrid: tilegrid
});
let tiles: { [key: string]: HTMLImageElement } = {};
elevation.on("tileloadend", (e) => {
let coord = e.tile.getTileCoord();
tiles[coord.join('-')] = e.tile.getImage();
});
this.map.on('pointermove', (evt) => {
// When user was dragging map, then coordinates didn't change and there's
// no need to continue
if (evt.dragging) {
return;
}
let coordinate = ol.proj.transform(evt.coordinate, this.map.getView().getProjection(), elevationGridProjection);
let tileCoord = tilegrid.getTileCoordForCoordAndResolution(coordinate, this.map.getView().getResolution());
let key = tileCoord.join('-');
if (key in tiles) {
let origin = tilegrid.getOrigin(tileCoord[0]);
let res = tilegrid.getResolution(tileCoord[0]);
let tileSize = tilegrid.getTileSize(tileCoord[0]);
let w = Math.floor(((coordinate[0] - origin[0]) / res) % (tileSize[0] | tileSize as number));
let h = Math.floor(((origin[1] - coordinate[1]) / res) % (tileSize[1] | tileSize as number));
var canvas = document.createElement("canvas");
canvas.width = tiles[key].width;
canvas.height = tiles[key].height;
// Copy the image contents to the canvas
var ctx = canvas.getContext("2d");
ctx.drawImage(tiles[key], 0, 0);
let img = ctx.getImageData(0, 0, canvas.width, canvas.height);
let imgData = img.data;
let index = (w + h * 256) * 4;
let pixel = [imgData[index + 0], imgData[index + 1], imgData[index + 2], imgData[index + 3]];
let height = (-10000 + ((pixel[0] * 256 * 256 + pixel[1] * 256 + pixel[2]) * 0.01))
console.log(`HEIGHT: ${height}, ${w},${h},${img.width}, ${img.height},${img.data.length} ,${index}, [${pixel.join(',')}]`);
}
});
这篇关于是否可以在鼠标悬停时从ol.source.raster获取像素值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!