1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| import DataTileSource from 'ol/source/DataTile.js'; import Map from 'ol/Map.js'; import TileLayer from 'ol/layer/WebGLTile.js'; import View from 'ol/View.js'; import {fromLonLat} from 'ol/proj.js';
const COG = 'https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic.tif';
function numpyTileLoader(z, x, y) { const url = `https://api.cogeo.xyz/cog/tiles/WebMercatorQuad/${z}/${x}/${y}@1x?format=npy&url=${encodeURIComponent( COG )}`;
return fetch(url) .then((r) => r.arrayBuffer()) .then((buffer) => NumpyLoader.fromArrayBuffer(buffer)) .then((numpyData) => { const dataTile = new Float32Array(256 * 256 * 5); const bandSize = 256 * 256; for (let x = 0; x < 256; x++) { for (let y = 0; y < 256; y++) { const px = x + y * 256; dataTile[px * 5 + 0] = numpyData.data[y * 256 + x]; dataTile[px * 5 + 1] = numpyData.data[bandSize + y * 256 + x]; dataTile[px * 5 + 2] = numpyData.data[bandSize * 2 + y * 256 + x]; dataTile[px * 5 + 3] = numpyData.data[bandSize * 3 + y * 256 + x]; dataTile[px * 5 + 4] = numpyData.data[bandSize * 4 + y * 256 + x] > 0 ? 1.0 : 0; } } return dataTile; }); }
const interpolateBand = (bandIdx) => [ 'interpolate', ['linear'], ['band', bandIdx], ['var', 'bMin'], 0, ['var', 'bMax'], 1, ];
const initialMin = 3000; const initialMax = 18000;
const numpyLayer = new TileLayer({ style: { color: [ 'array', interpolateBand(3), interpolateBand(2), interpolateBand(1), ['band', 5], ], variables: { 'bMin': initialMin, 'bMax': initialMax, }, }, source: new DataTileSource({ loader: numpyTileLoader, bandCount: 5, }), });
const map = new Map({ target: 'map', layers: [numpyLayer], view: new View({ center: fromLonLat([172.933, 1.3567]), zoom: 15, }), });
const inputMin = document.getElementById('input-min'); const inputMax = document.getElementById('input-max'); const outputMin = document.getElementById('output-min'); const outputMax = document.getElementById('output-max');
inputMin.addEventListener('input', (evt) => { numpyLayer.updateStyleVariables({ 'bMin': parseFloat(evt.target.value), 'bMax': parseFloat(inputMax.value), }); outputMin.innerText = evt.target.value; });
inputMax.addEventListener('input', (evt) => { numpyLayer.updateStyleVariables({ 'bMin': parseFloat(inputMin.value), 'bMax': parseFloat(evt.target.value), }); outputMax.innerText = evt.target.value; });
inputMin.value = initialMin; inputMax.value = initialMax; outputMin.innerText = initialMin; outputMax.innerText = initialMax;
|