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 106
| import GeoTIFF from 'ol/source/GeoTIFF.js'; import Map from 'ol/Map.js'; import TileLayer from 'ol/layer/WebGLTile.js';
const segments = 10;
const defaultMinColor = '#0300AD'; const defaultMaxColor = '#00ff00';
const defaultMinValue = -0.5; const defaultMaxValue = 0.7;
const minColorInput = document.getElementById('min-color'); minColorInput.value = defaultMinColor;
const maxColorInput = document.getElementById('max-color'); maxColorInput.value = defaultMaxColor;
const minValueOutput = document.getElementById('min-value-output'); const minValueInput = document.getElementById('min-value-input'); minValueInput.value = defaultMinValue.toString();
const maxValueOutput = document.getElementById('max-value-output'); const maxValueInput = document.getElementById('max-value-input'); maxValueInput.value = defaultMaxValue.toString();
function getVariables() { const variables = {};
const minColor = minColorInput.value; const maxColor = maxColorInput.value; const scale = chroma.scale([minColor, maxColor]).mode('lab');
const minValue = parseFloat(minValueInput.value); const maxValue = parseFloat(maxValueInput.value); const delta = (maxValue - minValue) / segments;
for (let i = 0; i <= segments; ++i) { const color = scale(i / segments).rgb(); const value = minValue + i * delta; variables[`value${i}`] = value; variables[`red${i}`] = color[0]; variables[`green${i}`] = color[1]; variables[`blue${i}`] = color[2]; } return variables; }
function colors() { const stops = []; for (let i = 0; i <= segments; ++i) { stops[i * 2] = ['var', `value${i}`]; const red = ['var', `red${i}`]; const green = ['var', `green${i}`]; const blue = ['var', `blue${i}`]; stops[i * 2 + 1] = ['color', red, green, blue]; } return stops; }
const ndvi = [ '/', ['-', ['band', 2], ['band', 1]], ['+', ['band', 2], ['band', 1]], ];
const source = new GeoTIFF({ sources: [ { url: 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/36/Q/WD/2020/7/S2A_36QWD_20200701_0_L2A/B04.tif', max: 10000, }, { url: 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/36/Q/WD/2020/7/S2A_36QWD_20200701_0_L2A/B08.tif', max: 10000, }, ], });
const layer = new TileLayer({ style: { variables: getVariables(), color: ['interpolate', ['linear'], ndvi, ...colors()], }, source: source, });
function update() { layer.updateStyleVariables(getVariables()); minValueOutput.innerText = parseFloat(minValueInput.value).toFixed(1); maxValueOutput.innerText = parseFloat(maxValueInput.value).toFixed(1); }
minColorInput.addEventListener('input', update); maxColorInput.addEventListener('input', update); minValueInput.addEventListener('input', update); maxValueInput.addEventListener('input', update); update();
const map = new Map({ target: 'map', layers: [layer], view: source.getView(), });
|