wetter.ljg.sh/index.js

96 lines
2.1 KiB
JavaScript

import { transformExtent } from "ol/proj";
import TileLayer from "ol/layer/Tile";
import OSM from "ol/source/OSM";
import TileWMS from "ol/source/TileWMS";
import Map from "ol/Map";
import View from "ol/View";
import { getCenter } from "ol/extent";
const extent = transformExtent(
[1.46330151, 45.68460578, 18.73161645, 55.86208711],
"EPSG:4326",
"EPSG:3857",
);
const osm = new TileLayer({
source: new OSM({}),
});
const dwd = new TileLayer({
extent,
opacity: 0.5,
source: new TileWMS({
attributions: ["Deutscher Wetterdienst"],
url: "https://maps.dwd.de/geoserver/ows?version=1.3.0",
params: {
LAYERS: "dwd:Niederschlagsradar",
},
}),
});
const map = new Map({
layers: [osm, dwd],
target: "map",
view: new View({
center: getCenter(extent),
zoom: 6,
}),
});
const reset = () => {
const now = new Date();
return new Date(
now.getFullYear(),
now.getMonth(),
now.getDate(),
now.getHours(),
Math.floor(now.getMinutes() / 5) * 5,
);
};
let time = reset();
const update = () => {
dwd.getSource().updateParams({ time: time.toISOString() });
document.getElementById("time").innerText = time.toString();
};
update();
const animate = () =>
setInterval(() => {
time.setMinutes(time.getMinutes() + 5);
const now = new Date();
if (time.getTime() > new Date(now).setHours(now.getHours() + 2)) {
time.setHours(time.getHours() - 2, time.getMinutes() - 5);
}
update();
}, 1000);
let interval = null;
const toggleAnimation = () => {
if (interval !== null) {
clearInterval(interval);
interval = null;
} else {
interval = animate();
}
};
const timeInput = document.getElementById("timeInput");
timeInput.max = new Date(time).setHours(time.getHours() + 2);
timeInput.min = time.getTime();
timeInput.addEventListener("input", (event) => {
if (interval !== null) {
clearInterval(interval);
}
time = new Date(parseInt(event.target.value));
update();
});