Canvas example from the tooltips section. Click on any part of the image to see the GeoTIFF value on a tooltip
<!DOCTYPE html> <meta charset="utf-8"> <style> #tooltip { position: absolute; top: 0; left: 0; z-index: 10; margin: 0; padding: 10px; width: 180px; height: 40px; color: white; font-family: sans-serif; font-size: 0.9em; font-weight: bold; text-align: center; background-color: rgba(0, 0, 0, 0.55); opacity: 0; pointer-events: none; border-radius:5px; transition: .2s; } </style> <body> <div id="tooltip"> <script src="https://d3js.org/d3.v4.min.js"></script> <script src="geotiff.min.js"></script> <script src="raster-marching-squares.min.js"></script> <script src="http://d3js.org/topojson.v1.min.js"></script> <script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script> <script> var width = 680, height = 500; var projection = d3.geoAzimuthalEqualArea() .rotate([-55.5, -24]) .scale(1100); var canvas = d3.select("body").append("canvas") .attr("width", width) .attr("height", height); var context = canvas.node().getContext("2d"); d3.request("tz850.tiff") .responseType('arraybuffer') .get(function(error, tiffData){ d3.json("world-110m.json", function(error, topojsonData) { var countries = topojson.feature(topojsonData, topojsonData.objects.countries); var path = d3.geoPath() .projection(projection).context(context); var tiff = GeoTIFF.parse(tiffData.response); var image = tiff.getImage(); var rasters = image.readRasters(); var tiepoint = image.getTiePoints()[0]; var pixelScale = image.getFileDirectory().ModelPixelScale; var geoTransform = [tiepoint.x, pixelScale[0], 0, tiepoint.y, 0, -1*pixelScale[1]]; var tempData = new Array(image.getHeight()); for (var j = 0; j<image.getHeight(); j++){ tempData[j] = new Array(image.getWidth()); for (var i = 0; i<image.getWidth(); i++){ tempData[j][i] = rasters[1][i + j*image.getWidth()]; } } context.beginPath(); context.fillStyle = "#aaa"; path(countries); context.fill(); var intervalsTemp = [14,17,20,23,26,29, 32, 35, 38]; var bandsTemp = rastertools.isobands(tempData, geoTransform, intervalsTemp); var colorScale = d3.scaleSequential(d3.interpolateRdBu) .domain([38, 14]); bandsTemp.features.forEach(function(d, i) { context.beginPath(); context.globalAlpha = 0.8; context.fillStyle = colorScale(intervalsTemp[i]); path(d); context.fill(); }); context.beginPath(); context.strokeStyle = "#000"; context.lineWidth = 1.5; context.globalAlpha = 0.5; path(countries); context.stroke(); canvas.on("click", function() { var screenCoords = d3.mouse(this); var coords = projection.invert(screenCoords); var xTiff = (coords[0] - geoTransform[0])/geoTransform[1]; var yTiff = (coords[1] - geoTransform[3])/geoTransform[5]; var tempValue = tempData[Math.round(yTiff)][Math.round(xTiff)]; d3.select("#tooltip") .style("left", screenCoords[0] + "px") .style("top", screenCoords[1] + "px") .style("opacity", 1) .html("850 hPa temp: " + tempValue.toFixed(1) + " C"); }); }); }); </script> </body>