Repo forecast
erstellen, lokal clonen, Template auspacken, add
und push
wie beim Wienbeispiel
Die vom Leaflet velocity Plugin benötigten Daten liegen auf dem Server der Geographie unter wind-10u-10v-europe.json und sind das Endprodukt einer Reihe von Schritten, die aus den Originaldaten beim ECMWF im Format GRIB2 die passende JSON-Datei erzeugt. Das HOWTO ECMWF Windvorhersagedaten für Leaflet velocity aufbereiten zeigt den verwendeten Workflow.
const response = await fetch(url);
const jsondata = await response.json();
console.log(jsondata);
Wir sehen einen Array bestehend aus zwei Objekten - ein Objekt für die U-component_of_wind
und ein Objekt für die V-component_of_wind
, jeweils in 10m Höhe. Aus diesen beiden Attributen kann später die Windrichtung und Windgeschwindigkeit berechnet werden. Jedes dieser Objekte besitzt ein header
- und data
-Attribut. Im header
stehen die Metadaten zur Erstellung der Vorhersage, die geographische Region für die die Daten gelten soll und die Art der Wind-Komponente. Im data
-Attribut stehen die Werte von West nach Ost und Nord nach Süd.
Rechnen mit Datumsangaben ist immer kompliziert :(
Wir haben die Zeit der Berechnung der Vorhersage (refTime
) und den Zeitpunkt der Gültigkeit in Stunden (forecastTime
) ab der Berechnung.
console.log("Zeitpunkt Erstellung", jsondata[0].header.refTime);
console.log("Zeitpunkt Vorhersage (+Stunden)", jsondata[0].header.forecastTime);
Zur Berechnung des Vorhersagezeitpunkts müssen wir die Stunden zum Datum hinzufügen indem wir:
mit new Date() ein echtes Datum aus dem Attribut refTime
erstellen
let forecastDate = new Date(jsondata[0].header.refTime);
Hinweis: wir haben Glück, denn new Date()
erkennt unseren String in refTime
als gültiges Datum und erzeugt daraus ein echtes Datumsobjekt
die Zahl der Stunden in forecastTime
dazu zählen. Dazu kommen die Methoden Date.setHours() und Date.getHours() zum Einsatz. Sollte die aus der Addition resultierende Stundenkomponente größer als 23 sein, wird das Datum entsprechend auf den nächsten Tag erweitert.
let forecastDate = new Date(jsondata[0].header.refTime);
console.log("Echtes Datum Erstellung", forecastDate);
forecastDate.setHours(forecastDate.getHours() + jsondata[0].header.forecastTime);
console.log("Echtes Datum Vorhersage", forecastDate);
das Datum des Vorhersagezeitpunkts mit Date.toLocaleDateString() formatieren
Nachdem wir später im Skript noch andere Datumsangaben ähnlich formatieren werden, schreiben wir (gleich nach dem Maßstabszeichnen) eine Funktion formatDate
, die das für uns erledigt. Sie erwartet ein echtes Datum und gibt einen lesbaren Datumsstring (in Deutsch) zurück.
let formatDate = function(date) {
return date.toLocaleDateString("de-AT", {
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit"
}) + " Uhr";
}
Das formatierte Datum für den Vorhersagezeitpunkt speichern wir in der Variablen forecastLabel
let forecastLabel = formatDate(forecastDate);
console.log("Vorhersagezeitpunkt", forecastLabel);
Bevor wir weiter machen, kommentieren wir die console.log
Nachrichten aus - wir brauchen sie nicht mehr
Den Vorhersagezeitpunkt können wir jetzt im neuen Overlay für die Windvorhersage verwenden
layerControl.addOverlay(overlays.wind, `ECMWF Windvorhersage für ${forecastLabel}`);
lib/
Verzeichnis erstellenleaflet-velocity.css
und leaflet-velocity.js
im neuen lib/
-Verzeichnis entpackenindex.html
dieses Stylesheet und Javascript einbinden<!-- Leaflet velocity -->
<link rel="stylesheet" href="lib/leaflet-velocity.css">
<script src="lib/leaflet-velocity.js"></script>
Wir initialisieren das Plugin, übergeben die Daten und hängen den animierten Layer an das Overlay
// Velocity Plugin konfigurieren
L.velocityLayer({
data: jsondata
}).addTo(overlays.wind);
Voilà, die Animation der Windrichtung und Stärke für Europa ist sichtbar. Wie das ganze funktioniert, kann man bei Visualizing wind using Leaflet - Wolfblog nachlesen. Noch beeindruckender ist die 3D-Visualisierung von https://earth.nullschool.net/.
Plugin weiter konfigurieren:
kräftigere Windlinien - ein leider undokumentiertes Attribut, das sich im Source code findet
lineWidth: 2
Datenanzeige übersetzen und nach rechts unten verschieben
javascript
displayOptions: {
velocityType: "",
directionString: "Windrichtung",
speedString: "Windgeschwindigkeit",
speedUnit: "k/h",
emptyString: "keine Daten vorhanden",
position: "bottomright"
}
🔗 COMMIT (dieser COMMIT ist leider vergessen worden und beim nächsten Implementierungsschritt gelandet ;-)