Public
Edited
Feb 6, 2024
1 star
Insert cell
Insert cell
Insert cell
Insert cell
horseland = getImage([106791.4,527778.4],250)
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
//ahnurl = "https://ahp-research.storage.googleapis.com/rasters/bodemdaling/ahn_diff.tif" //'https://ahn_data.storage.googleapis.com/M_25EN1_cog.TIF'
Insert cell
ahn3url = "https://ahp-research.storage.googleapis.com/rasters/ahn4_05m_dtm_cog.tiff"
Insert cell
ahn2url = "https://ahp-research.storage.googleapis.com/rasters/ahn3_05m_dtm_cog.tiff"
Insert cell
ahn4_vrt = "https://storage.googleapis.com/ahp-research/rasters/ahn4_dtm_05m_4326/ahn4_05m_dtm_cogs/ahn4_05m_dtm_4326.vrt"
Insert cell
Insert cell
Insert cell
async function getImage(center, radius, mapnr){
let extent = [
center[0] - radius,
center[1] - radius,
center[0] + radius,
center[1] + radius
];
let data1 = await getDiffImage(extent);
let data2 = await getLufo(extent,'2016_ortho25');
let data3 = await getLufo(extent,'2020_ortho25');
return drawtriplet(data1.bitmap,data2,data3,data1.rasters);
}
Insert cell
getImageTest = getImage([123757.3,483865.8],100)
Insert cell
async function getDiffImage(extent){
const data2 = await getData(ahn2url, extent);
const data3 = await getData(ahn3url, extent);

let retraster = new Float32Array(data2[0].length);
for (let i=0;i<data2[0].length;i++){
retraster[i] = data3[0][i] - data2[0][i];
}
let { width, height } = data2;
const data = new Uint8ClampedArray(width * height * 4);
let colorextent = d3.extent(retraster.filter(d=>d<1000 && d>-1000));
for (let i = 0; i < retraster.length; i++) {
let color = d3.color(getColor(retraster[i],colorextent));
data[i * 4 + 0] = color.r;
data[i * 4 + 1] = color.g;
data[i * 4 + 2] = color.b;
data[i * 4 + 3] = retraster[i] > 3000 ? 0 : 255;
}
let imgdata = new ImageData(data, width, height);
let bitmap = await createImageBitmap(imgdata);
return {bitmap,retraster};

}
Insert cell
getAHNTest = getDiffImage([123757.3-100,483865.8-100,123757.3+100,483865.8+100])
Insert cell
async function getData(url, extent){
const cog = await geotiff.fromUrl(url);
const img = await cog.getImage(0);
const bbox = img.getBoundingBox();
const scale = 2;
const window = [
~~(extent[0] - bbox[0]) * scale,
~~(bbox[3] - extent[3]) * scale,
~~(extent[2] - bbox[0]) * scale,
~~(bbox[3] - extent[1]) * scale
];
const rasters = await img.readRasters({
pool,
window: window,
width: size,
height: size,
resampleMethod: 'bilinear'
});
return rasters;
}
Insert cell
getDataTest = getData(ahn2url, [123757.3-100,483865.8-100, 123757.3+100,483865.8+100])
Insert cell
d3.extent(getAHNTest.retraster.filter(d=>d<1000 && d>-1000))
Insert cell
function getColor(value, extent){
let colorscale = d3.scaleDivergingSymlog()
.domain([extent[1],0,extent[0]])
.interpolator(d3.interpolateBrBG);
return colorscale(value);
}
Insert cell
async function getLufo(extent,layername){
let img = new Image();
img.crossOrigin = '*';
let params = wmsurl.searchParams;
params.set('layers',layername)
params.set('width',size)
params.set('height',size)
params.set('bbox',extent.join(','))
img.src = wmsurl.toString();
await new Promise(resolve => img.addEventListener('load', resolve));
return img;
}
Insert cell
function drawtriplet(data1, data2,data3,rasters){
let c = DOM.context2d((size+5) * 3, size, 1);
c.drawImage(data1, 0, 0, size, size);
c.drawImage(data2,size + 5,0,size,size);
c.drawImage(data3,2*(size + 5),0,size,size);
c.canvas.addEventListener('mousemove', function(e) {
c.drawImage(data1, 0, 0);
var pos = findPos(this);
var x = e.pageX - pos.x;
var y = e.pageY - pos.y;
if (x <= size) {
let value = rasters[0][x+(size*y)];
if (value < 1000){
let displaytext = Math.round(value*1000,2)/1000;
c.font = 'small-caps bolder 10px serif';
c.strokeStyle = '#FFFFFF';
c.strokeText(displaytext, x+10, y-5);
c.fillStyle = '#550000';
c.textBaseline = 'top';
c.fillText ( displaytext, x+10, y-5);
}
}
});
return c.canvas;
}
Insert cell
Insert cell
geotiff = require('geotiff@2.0.4/dist-browser/geotiff.js')
Insert cell
parseGeoRaster = require("georaster")
Insert cell
pool = new geotiff.Pool();
Insert cell
d3 = require("d3@6", "d3-geo-projection@3")
Insert cell
tween = require('tween.js')
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more