Der DWD bietet seit neuestem die MOSMIX-Vorhersagen im KML-Format über einen Zeitraum von 240 Stunden an. Die Daten werden stündlich kurz vor jeder halben Stunde unter dem Verzeichnis https://opendata.dwd.de/weather/local_forecasts/mos/ zur Verfügung gestellt. Dabei sind die aktuellsten Daten bequem unter der URL https://opendata.dwd.de/weather/local_forecasts/mos/MOSMIX_S_LATEST_240.kmz abrufbar.
Die Datei hat ungefähr eine Größe von 35 MB und enthält Vorhersagedaten in einem komprimierten XML-Format für ca. 5400 Stationen. Das Format ist unter der Adresse https://www.dwd.de/DE/leistungen/met_verfahren_mosmix/met_verfahren_mosmix.html gut dokumentiert und für die Konvertierung von XML-Daten steht mit XSLT (https://de.wikipedia.org/wiki/XSL_Transformation) ein mächtiges Werkzeug zur Verfügung.
Meinem Vorhaben, das Meteogramm unter https://buwx.de/index.php/chart/meteogramm über DWD-Vorhersagedaten zu erzeugen, bin ich damit einen großen Schritt näher gekommen.
Da es für manche vielleicht Arbeit ersparen könnte, möchte ich die Konvertierung kurz dokumentieren:
Über einen Cron-Job wird stündlich folgendes Skript gestartet:
#!/bin/sh
# extract mos data for the given station
cd /root/dwd
MOSMIX=MOSMIX_S_LATEST_240.kmz
STATION=10738
wget -N https://opendata.dwd.de/weather/local_forecasts/mos/${MOSMIX}
if [ ${MOSMIX} -nt ${STATION}.xml ]; then
zcat ${MOSMIX} | xsltproc --param station ${STATION} mos.xsl - > ${STATION}.xml
zcat ${MOSMIX} | xsltproc --param station ${STATION} mos-json.xsl - > ${STATION}.json
touch --reference=${MOSMIX} ${STATION}.xml
touch --reference=${MOSMIX} ${STATION}.json
xmllint --format ${STATION}.xml > /var/www/buwx/charts/meteogram/${STATION}.xml
python -m json.tool ${STATION}.json > /var/www/buwx/charts/meteogram/${STATION}.json
fi
Mich interessiert dabei nur die Station Stuttgart-Flughafen mit der Id 10738. Die XSL-Transformation in ein eigenes XML-Format und JSON-Format wird dabei durch folgende Stylesheets definiert:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd"
xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="kml:Document">
<forecast>
<xsl:apply-templates />
</forecast>
</xsl:template>
<xsl:template match="kml:ExtendedData">
<issuer><xsl:value-of select="dwd:ProductDefinition/dwd:Issuer" /></issuer>
<xsl:apply-templates select="dwd:ProductDefinition/dwd:ForecastTimeSteps"/>
</xsl:template>
<xsl:template match="dwd:ForecastTimeSteps">
<timeSteps>
<xsl:for-each select="dwd:TimeStep">
<xsl:text>"</xsl:text><xsl:value-of select="." /><xsl:text>"</xsl:text>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</timeSteps>
</xsl:template>
<xsl:template match="kml:Placemark">
<xsl:if test="kml:name=$station">
<station>
<xsl:attribute name="name"><xsl:value-of select="kml:name"/></xsl:attribute>
<xsl:attribute name="description"><xsl:value-of select="kml:description"/></xsl:attribute>
<xsl:for-each select="kml:ExtendedData/dwd:Forecast">
<forecast>
<xsl:attribute name="elementName"><xsl:value-of select="@dwd:elementName" /></xsl:attribute>
<xsl:call-template name="format">
<xsl:with-param name="text" select="normalize-space()"/>
</xsl:call-template>
</forecast>
</xsl:for-each>
</station>
</xsl:if>
</xsl:template>
<xsl:template name="format">
<xsl:param name="text"/>
<xsl:variable name="replace" select="' '" />
<xsl:variable name="with" select="','" />
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:text>"</xsl:text><xsl:value-of select="substring-before($text,$replace)"/><xsl:text>"</xsl:text>
<xsl:value-of select="$with"/>
<xsl:call-template name="format">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="$text"/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd"
xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="kml:Document">
<xsl:text>{</xsl:text>
<xsl:apply-templates/>
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match="kml:ExtendedData">
<xsl:text>"issuer": "</xsl:text><xsl:value-of select="dwd:ProductDefinition/dwd:Issuer"/><xsl:text>"</xsl:text>
<xsl:apply-templates select="dwd:ProductDefinition/dwd:ForecastTimeSteps"/>
</xsl:template>
<xsl:template match="dwd:ForecastTimeSteps">
<xsl:text>, "timeSteps": [</xsl:text>
<xsl:for-each select="dwd:TimeStep">
<xsl:text>"</xsl:text><xsl:value-of select="." /><xsl:text>"</xsl:text>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>]</xsl:text>
</xsl:template>
<xsl:template match="kml:Placemark">
<xsl:if test="kml:name=$station">
<xsl:text>, "</xsl:text><xsl:value-of select="kml:name" /><xsl:text>": {</xsl:text>
<xsl:text>"description": "</xsl:text><xsl:value-of select="kml:description" /><xsl:text>"</xsl:text>
<xsl:for-each select="kml:ExtendedData/dwd:Forecast">
<xsl:text>, "</xsl:text><xsl:value-of select="@dwd:elementName"/><xsl:text>": [</xsl:text>
<xsl:attribute name="dwd:elementName"><xsl:value-of select="@dwd:elementName" /></xsl:attribute>
<xsl:call-template name="format">
<xsl:with-param name="text" select="normalize-space()"/>
</xsl:call-template>
<xsl:text>]</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="format">
<xsl:param name="text"/>
<xsl:variable name="replace" select="' '" />
<xsl:variable name="with" select="','" />
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:text>"</xsl:text><xsl:value-of select="substring-before($text,$replace)"/><xsl:text>"</xsl:text>
<xsl:value-of select="$with"/>
<xsl:call-template name="format">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="$text"/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Das Ergebnis lässt sich hier abrufen:
https://buwx.de/charts/meteogram/10738.xml
https://buwx.de/charts/meteogram/10738.json
... und hoffentlich auch irgendwann über mein Meteogramm. Über weitere Fortschritte werde ich berichten.
Hallo falk,
großartig wie du dich hier ins Zeug legst :top:
Mir sind aber als technischer Lai von solchen Vorgängen das alles böhmische Dörfer, ich kann auch wenig mit den Links anfangen.
Interessiert an einem DWD Vorhersagemodell wäre ich schon für die Webseite, auch ein Obulus für ein fertiges System, wenn es brauchbar ist, wäre i.O.
Wenn die Norweger nicht bald mit yowindow vom Flash abrücken, ist es dort ja auch bald dunkel.
Eine Frage habe ich, lädst du dann jedes Mal 35 MB runter, oder wird nur die eine Station vorher extrahiert?
Zitat von: LE-Wetter am 03.03.2018, 13:20:43
Eine Frage habe ich, lädst du dann jedes Mal 35 MB runter, oder wird nur die eine Station vorher extrahiert?
Hallo Michael,
die 35 MB kopiere ich stündlich auf meinem Server und extrahiere die relevanten Daten, wobei die JSON-Datei nur 20 KB groß ist.
Die Möglichkeiten damit sind enorm: Mit den Daten könnte man eine eigene Wetter-App mit professionellen Daten versorgen. Über JSON ist der Zugriff sehr einfach.
Jetzt genieße ich allerdings noch das sonnige und milde Wetter nach einer gefühlten Woche Dauerfrost.
Gruß
falk
Finde sehr, sehr cool :top:, eine Frage: enthält die KML-Datei nur die MOS-Wettervorhersagen der Stationenstandorten oder auch für die Gitterpunkte dazwischen?
Eine ähnliche Vorgehensweise gibt es auch in diesem Forum (http://wetter-board.de/forum/thread/80570-dwd-grundversorgung-vorhersage-f%C3%BCr-die-eigene-webseite/) dort werden aber für die Anzeige die POI MOSMIXes von DWD verwendet. Das Meteogramm wird gleich mitgeliefert, wie das Aussieht kann man hier (http://www.langeln-wetter.de/meteogram) oder hier (http://wetterstation-berlin.de/wettervorhersage/dwd-mosmix-vorhersagediagramm.html) sehen.
Man kann sich nur freuen, dass DWD die Daten freigibt.
Zitat von: SkyDevX am 03.03.2018, 14:53:25
Finde sehr, sehr cool :top:, eine Frage: enthält die KML-Datei nur die MOS-Wettervorhersagen der Stationenstandorten oder auch für die Gitterpunkte dazwischen?
Es sind nur Vorhersagedaten für ca. 5.400 Stationen weltweit verfügbar. Darunter aber nur 2.800 Hauptstationen, bei denen die Modellvorhersagen über den Abgleich mit tatsächlich gemessenen Werten statistisch optimiert werden. Die anderen Stationsdaten werden interpoliert. Über den von mir angegebenen Link wird das gut beschrieben. Der User @Lukas hat hier seine Webseite vorgestellt, über die er Meteogramme aller Stationen zur Verfügung stellt: http://www.wetterstationen.info/forum/neues-board/dwd-mos-der-ganzen-welt-auf-profiwetter-ch/
Zitat
Eine ähnliche Vorgehensweise gibt es auch in diesem Forum (http://wetter-board.de/forum/thread/80570-dwd-grundversorgung-vorhersage-f%C3%BCr-die-eigene-webseite/) dort werden aber für die Anzeige die POI MOSMIXes von DWD verwendet. Das Meteogramm wird gleich mitgeliefert, wie das Aussieht kann man hier (http://www.langeln-wetter.de/meteogram) oder hier (http://wetterstation-berlin.de/wettervorhersage/dwd-mosmix-vorhersagediagramm.html) sehen.
Vielen Dank für den Link. Der ist ebenfalls sehr lehrreich. Grundlage für mein Diagramm ist dieses hier: https://www.highcharts.com/demo/combo-meteogram#https://www.yr.no/place/United_Kingdom/England/London/forecast_hour_by_hour.xml
Hier, wir bei @Lukas werden allerdings noch die Daten im alten Format ausgewertet. Im KML-Format werden für jede Stunde Vorhersagedaten geliefert statt für alle 3-Stunden. Gerade für die ersten 48h lassen sich damit Vorhersagen feiner darstellen.
Zitat
Man kann sich nur freuen, dass DWD die Daten freigibt.
Das finde ich auch fantastisch :top:
Ein einfaches Meteogramm ist realisiert: https://buwx.de/index.php/chart/meteogramm-dwd
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/windbarb.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<div id="mg_container" style="height: 310px; margin: 0 auto">
<div style="margin-top: 100px; text-align: center" id="loading">
<i class="fa fa-spinner fa-spin"></i> Lade Wetterdaten...
</div>
</div>
<script type="text/javascript">
/**
* Meteogram derived by Highcharts meteogram demo for using DWD MESOMIX data.
*/
function Meteogram(dwd, container) {
// Parallel arrays for the chart data, these are populated as the XML/JSON file
// is loaded
this.precipitations = [];
this.winds = [];
this.temperatures = [];
this.pressures = [];
// Initialize
this.dwd = dwd;
this.container = container;
// Run
this.parseDwdData();
}
Meteogram.prototype.getTitle = function () {
return 'Vorhersage für Stuttgart/Echterdingen';
};
Meteogram.prototype.getChartOptions = function () {
var meteogram = this;
return {
chart: {
renderTo: this.container,
marginBottom: 70,
marginRight: 40,
marginTop: 50,
plotBorderWidth: 1,
height: 310,
alignTicks: false
},
title: {
text: this.getTitle(),
align: 'left'
},
credits: {
text: 'Quelle: Deutscher Wetterdienst',
href: 'https://www.dwd.de',
position: {
x: -40
}
},
tooltip: {
shared: true,
useHTML: true,
headerFormat: '<small>{point.x:%A, %e. %B, %H Uhr}</small><br>'
},
xAxis: [{ // Bottom X axis
type: 'datetime',
tickInterval: 2 * 36e5, // two hours
minorTickInterval: 36e5, // one hour
tickLength: 0,
gridLineWidth: 1,
gridLineColor: (Highcharts.theme && Highcharts.theme.background2) || '#F0F0F0',
startOnTick: false,
endOnTick: false,
minPadding: 0,
maxPadding: 0,
offset: 30,
showLastLabel: true,
labels: {
format: '{value:%H}'
},
crosshair: true
}, { // Top X axis
linkedTo: 0,
type: 'datetime',
tickInterval: 24 * 3600 * 1000,
labels: {
format: '{value:%a %e. %b}',
align: 'left',
x: 3,
y: -5
},
opposite: true,
tickLength: 20,
gridLineWidth: 1
}],
yAxis: [{ // temperature axis
title: {
text: null
},
labels: {
format: '{value}°',
style: {
fontSize: '10px'
},
x: -3
},
plotLines: [{ // zero plane
value: 0,
color: '#BBBBBB',
width: 1,
zIndex: 2
}],
maxPadding: 0.3,
minRange: 8,
tickInterval: 1,
gridLineColor: (Highcharts.theme && Highcharts.theme.background2) || '#F0F0F0'
}, { // precipitation axis
title: {
text: null
},
labels: {
enabled: false
},
gridLineWidth: 0,
tickLength: 0,
minRange: 10,
min: 0
}, { // Air pressure
allowDecimals: false,
title: { // Title on top of axis
text: 'hPa',
offset: 0,
align: 'high',
rotation: 0,
style: {
fontSize: '10px',
color: Highcharts.getOptions().colors[2]
},
textAlign: 'left',
x: 3
},
labels: {
style: {
fontSize: '8px',
color: Highcharts.getOptions().colors[2]
},
y: 2,
x: 3
},
gridLineWidth: 0,
opposite: true,
showLastLabel: false
}],
legend: {
enabled: false
},
plotOptions: {
series: {
pointPlacement: 'between'
}
},
series: [{
name: 'Temperatur',
data: this.temperatures,
type: 'spline',
marker: {
enabled: false,
states: {
hover: {
enabled: true
}
}
},
tooltip: {
pointFormat: '<span style="color:{point.color}">\u25CF</span> ' +
'{series.name}: <b>{point.y}°C</b><br/>'
},
zIndex: 1,
color: '#FF3333',
negativeColor: '#48AFE8'
}, {
name: 'Niederschlag',
data: this.precipitations,
type: 'column',
color: '#68CFE8',
yAxis: 1,
groupPadding: 0,
pointPadding: 0,
grouping: false,
dataLabels: {
enabled: true,
formatter: function () {
if (this.y > 0) {
return this.y;
}
},
style: {
fontSize: '8px',
color: 'gray'
}
},
tooltip: {
valueSuffix: ' mm'
}
}, {
name: 'Luftdruck',
color: Highcharts.getOptions().colors[2],
data: this.pressures,
type: 'spline',
marker: {
enabled: false
},
shadow: false,
tooltip: {
valueSuffix: ' hPa'
},
dashStyle: 'shortdot',
yAxis: 2
}, {
name: 'Wind',
type: 'windbarb',
id: 'windbarbs',
color: Highcharts.getOptions().colors[1],
lineWidth: 1.5,
data: this.winds,
vectorLength: 18,
yOffset: -15,
tooltip: {
pointFormat: '<span style="color:{point.color}">\u25CF</span> {series.name}: <b>{point.value_kmh} km/h</b><br/>'
}
}]
};
};
/**
* Create the chart. This function is called async when the data file is loaded and parsed.
*/
Meteogram.prototype.createChart = function () {
Highcharts.setOptions({
lang: {
decimalPoint: ',',
thousandsSep: '.',
loading: 'Daten werden geladen...',
months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
weekdays: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
shortMonths: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
shortWeekdays: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
exportButtonTitle: "Exportieren",
printButtonTitle: "Drucken",
rangeSelectorFrom: "Von",
rangeSelectorTo: "Bis",
rangeSelectorZoom: "Zeitraum",
downloadPNG: 'Download als PNG-Bild',
downloadJPEG: 'Download als JPEG-Bild',
downloadPDF: 'Download als PDF-Dokument',
downloadSVG: 'Download als SVG-Bild',
resetZoom: "Zoom zurücksetzen",
resetZoomTitle: "Zoom zurücksetzen"
}
});
var meteogram = this;
this.chart = new Highcharts.Chart(this.getChartOptions(), function (chart) {
meteogram.onChartLoad(chart);
});
};
Meteogram.prototype.error = function () {
jQuery('#loading').html('<i class="fa fa-frown-o"></i> Daten konnten nicht geladen werden');
};
/**
* Handle the data.
*/
Meteogram.prototype.parseDwdData = function () {
var meteogram = this,
dwd = this.dwd,
pointStart, i;
if (!dwd || !dwd.timeSteps || !dwd.STN_10738) {
return this.error();
}
for (i=0; i<=72; i++) { // 72 hours
var from = dwd.timeSteps[i],
to;
from = from.replace(/-/g, '/').replace('T', ' ').replace('.000Z', ' UTC');
from = Date.parse(from);
to = from + 36e5;
if (to > pointStart + 4 * 24 * 36e5) {
return;
}
meteogram.temperatures.push({
x: from,
y: Math.round((parseFloat(dwd.STN_10738.TTT[i])-273.15) * 10)/10,
to: to
});
meteogram.precipitations.push({
x: from,
y: parseFloat(dwd.STN_10738.RR1c[i])/10
});
if (i % 2 === 0) {
meteogram.winds.push({
x: from,
value: parseFloat(dwd.STN_10738.FF[i]),
direction: parseFloat(dwd.STN_10738.DD[i]),
value_kmh: Math.round(parseFloat(dwd.STN_10738.FF[i]) * 3.6)
});
}
meteogram.pressures.push({
x: from,
y: parseFloat(dwd.STN_10738.PPPP[i])/100.0
});
if (i === 0) {
pointStart = (from + to) / 2;
}
}
// Create the chart when the data is loaded
this.createChart();
};
// End of the Meteogram protype
// On DOM ready...
jQuery.getJSON(
'10738.json',
function (dwd) {
window.meteogram = new Meteogram(dwd, 'mg_container');
}
);
</script>
Mit HighCharts (https://highcharts.com) ist das schnell gemacht und kostenlos bei nicht-kommerzieller Verwendung.
Schwieriger wird es mit der Einbindung von Wettersymbolen und anderer Wetterparameter, wie Bedeckungsgrad, Sonnenscheindauer, etc. Allerdings ist so eine Wetterseite ein Langzeitprojekt und gut Ding will Weile haben...
Das JSON-Dokument musste ich leicht abändern, da die Stations-Id 10738 kein gültiger Objektname ist. Jetzt: STN_10738
Hoi zäme,
Die Meteogramme von http://tools.wettersoftware.de/ sind wohl von meinen (https://profiwetter.ch (https://profiwetter.ch)) inspiriert :D Jedenfalls eine geile Sache!
Unglaublich, was der DWD mit den KMZs in die Welt schmeisst, die angesprochene Stunden-Auflösung ist ja genial. Ich freue mich wenn damit entwickelt wird, @falk ist ja schon auf gutem Wege :top:
Hallo und zur Info.
Wollte mir auch das Programm Meteogramm einbauen. Ging auch für einen nur halbwegs versierten Internetnutzer relativ einfach. Hatte jedoch Probleme mit der Darstellung bei dem Fuchs und IE. Eine Mail an Christian und einen Tag später gab es ein Update und alles funzte. Das nennt man Top Service und das ist für mich Empfehlenswert.
Gruss Robert
Nicht, dass ihr mich falsch versteht. Mir geht es hier weniger um fertige Lösungen für das Einbinden in Webseiten. Ich möchte stattdessen Methoden dokumentieren, mit denen sich MOSMIX-Vorhersagen im KML-Format nutzen lassen. Sozusagen als Anregung für eigene Entwicklungen. Wenn sich hier eine Diskussion zwischen Entwicklern ergibt, dann umso besser. Nicht zuletzt für mich.
Die Meteogramme von Christian und Lukas sind beide fantastisch. Mit meinen fehlerbehafteten Zwischenergebnissen komme ich nicht dagegen an. Das will ich auch gar nicht. Hier geht es um Algorithmen und nicht um Vergleiche darüber, wessen Service besser ist. Aber hey, mein Meteogramm ist nun responsiv und ihr könnte es nachbauen :-) https://buwx.de/index.php/chart/meteogramm-dwd
Zum neuen Format gibt es jetzt auch eine News: https://www.dwd.de/DE/leistungen/opendata/neuigkeiten/opendata_mar2018_01.html
Es lohnt sich, die Änderungen regelmäßig zu prüfen.
Mittlerweile ist mein Meteogramm schon ganz brauchbar. Für mich sind jedenfalls alle wichtigen Informationen enthalten.
Ich habe das Stylesheet und die HTML-Datei mit dem Meteogramm-Script in ein extra GitHub-Repository (https://github.com/buwx/meteogram) geladen, zusammen mit einer kleinen Beschreibung. Nach dem Motto: Source-Code ist die beste Dokumentation ;)
Eine aktuelle Beta-Version ist hier im Einsatz: https://buwx.de/index.php/chart/meteogramm-dwd
Beta deshalb, weil mit den Min-Max-Anzeigen die responsive Funktion gestört ist und ich deshalb Änderungen im JavaScript von Highstock vornehmen musste.
Anstatt irgendwelcher Wolkensymbole habe ich mich für WMO-Symbole entschieden, die es ebenfalls frei in GitHub gibt. Außerdem war die Zuordnung der Parameter 'ww' und 'Neff' einfacher.
Hallo falk,
ich bin fasziniert, was mit "Open Data" vom DWD alles geht und wie Du das bislang umgesetzt hast.
:top: Großes Kompliment, die Information auch anderen Interessenten schon aufbereitet zur Verfügung zu stellen.
Mich juckt es zwar in den Fingern, auch mal was mit den Daten des DWD anzufangen, aber es sträubt mich noch etwas, in meinem Alter noch dazulernen zu müssen.
Andererseits eine großartige Leistung, wenn ich bislang auch nur mitlese. Das Kompliment möchte ich allen machen, die sich (auch in anderen Threads) mit dem Thema beschäftigen, vor Allem Dir und auch Lukas, die ihr bereits Wege gefunden habt, die Daten ansprechend und verständlich zu verarbeiten und darzustellen.
Meine große Anerkennung (oder anders ausgedrückt: :D "Ich bin von den Socken").
Gruß Hans
Vielen Dank Hans :)
Ich würde mich freuen, wenn wir noch viele weitere Projekte zu OpenData kennenlernen dürfen und was passt besser zu Open-Data als Open-Source?
Hi falk
Sehr beeindruckend was du da schon geschafft hat´s. Interessiert mich sehr.
Ich habe auch ein wenig mit den "Open Data" gespielt und mir meine http://www.wetter-gevenich.de/Wettervorhersage_neu.php (http://www.wetter-gevenich.de/Wettervorhersage_neu.php) damit gebastet. Ich verwende erstmal nur die bereitgestellte .cvs Datei, da ich mit der KMZ / kml noch nicht so zurechtkomme wie ich es möchte.
Zitat von: Marc S am 11.03.2018, 11:54:42
Ich habe auch ein wenig mit den "Open Data" gespielt und mir meine http://www.wetter-gevenich.de/Wettervorhersage_neu.php (http://www.wetter-gevenich.de/Wettervorhersage_neu.php) damit gebastet. Ich verwende erstmal nur die bereitgestellte .cvs Datei, da ich mit der KMZ / kml noch nicht so zurechtkomme wie ich es möchte.
Das sieht doch schon sehr gut aus. Mir sind allerdings die Uhrzeiten aufgefallen. Die sind in den CSV-Dateien in UTC angegeben. Streng genommen müsstest du deshalb 1:00 Uhr, 4:00 Uhr, usw. angeben.
Die Extraktion der Daten aus der gezippten KML-Datei lässt sich eigentlich nur im Hintergrund ausführen. Auf meinem Server dauert das 12 Sekunden. Vielleicht sind andere XSLT-Prozessoren etwas schneller. Mit PHP sollte es auch gehen (http://php.net/manual/de/class.xsltprocessor.php)
Hallo,
ich finde das faszinierend, was ihr da so gebastelt habt, doch für einen "Programmierlaien" denke ich, schon schwierig umzusetzen.
An Falks Variante gefällt mir die kompakte Übersicht, alles auf engem Raum, von deinen Artikeln in der GitHub-Repository verstehe ich leider nix, dehalb bleibt mir das Programm auch verschlossen.
An Marcs Variante gefallen mir die Wettericons, das gibt optisch immer was her und ist auch für den Wetterinetressierten gut zu verstehen, allerdings wird man von der Fülle der Informationen fast erschlagen (soll jetzt aber keine Kritik sein).
Persönlich bräuchte ich eine "Für Doofe" Anleitung also Schritt für Schritt, vom Daten-Zapfen bis zur Fertigstellung für die Page. Oder ein fertiges Projekt, für das ich auch bereit wäre einen "Arbeitsobulus" zu entrichten.
Hallo LE-Wetter,
dann nimm doch die hier genannte Variante
http://tools.wettersoftware.de/
Die ist sozusagen fix und fertig und Du musst lediglich nach dem Download alle Dateien in einen Ordner auf den Webspace kopieren und in der Datei vorhersagediagramm.html
in der Zeile
new Meteogram('#meteogram', 'XXXX');
bei den XXXX die ID Deiner (nächstgelegenen) DWD-Station eingeben. Das ist alles, was angepasst werden muss.
Bei mir sieht das dann so aus:
https://www.don-wetter.de/meteogramm/vorhersagediagramm.html (https://www.don-wetter.de/meteogramm/vorhersagediagramm.html)
Es ist natürlich nicht so "kompakt" wie andere Varianten von falk usw.
Zitat von: LE-Wetter am 11.03.2018, 17:19:30
An Falks Variante gefällt mir die kompakte Übersicht, alles auf engem Raum, von deinen Artikeln in der GitHub-Repository verstehe ich leider nix, dehalb bleibt mir das Programm auch verschlossen.
Das neue MOSMIX-1h-Format wird leider nur ein einer gezippten-35MB-Datei angeboten, die alle 5200 Vorhersage-Stationen enthält. Die Extraktion der Stationsdaten für die weitere Darstellung als Meteogramm ist deshalb ein zwingend notwendiger Schritt. Ich habe eine Lösung entwickelt, die unter Linux unmittelbar übernommen werden kann . Hier kann ich gerne helfen. Ich hoffe aber, dass es bald auch Lösungen für Windows gibt. Mit den Stationsdaten kann auch mein Meteogramm problemlos eingebunden werden.
Werner hat eine schöne Implementierung aufgezeigt, die man bereits fertig nutzen kann. Hier werden die MOSMIX-3h-Daten genutzt, die der DWD pro Vorhersagestation bereitstellt. Marcs und Lukas Darstellungen basieren ebenfalls darauf.
Hallo
Also, ich bin mal Werners Tipp gefolgt und es ist so wie er es sagte, ein Kinderspiel auch für Laien diese Diagramme einzubauen. Das müsste auch Mischa hin bekommen, besser wie seine Flash-Variante (ist ja nicht mehr aktuell) ist es allemal.
Falk seine Variante gefällt mir zwar auch wesentlich bessere, aber damit habe ich auch Einsatzprobleme, vielleicht gibt es mal auch so eine Einsatzvariante wie von Wettersoftware.
Allen die hier sich damit abquälen meine Hochachtung über die Leistungen die sie vollbringen. :top:
http://www.wetter-kahla.de/meteograf%20dwd/vorhersagediagramm.html
ZitatDas sieht doch schon sehr gut aus. Mir sind allerdings die Uhrzeiten aufgefallen. Die sind in den CSV-Dateien in UTC angegeben. Streng genommen müsstest du deshalb 1:00 Uhr, 4:00 Uhr, usw. angeben.
Stimmt falk, dann muss ich das noch anpassen. Danke für die Info.
Zitat von: LE-Wetter am 11.03.2018, 17:19:30
Persönlich bräuchte ich eine "Für Doofe" Anleitung also Schritt für Schritt, vom Daten-Zapfen bis zur Fertigstellung für die Page.
Kopier mal das in eine lokale Datei und ruf die im Browser auf: https://raw.githubusercontent.com/buwx/meteogram/master/meteogram.html
Ich habe jetzt die MOSMIX-Daten in einem ersten Schritt gefiltert und lasse nur noch die DWD-Stationen mit Id 10* zu. Die weitere Konvertierung ist so effizient, dass ich die JSON-Daten per PHP bereitstellen kann. Für Leipzig zum Beispiel https://buwx.de/charts/meteogram/mosmix.php?station=10471&title=Leipzig&titleShort=Leipzig
Beachte aber bitte, dass das Meteogramm gerade mal eine Woche alt ist und bestimmt noch viele Fehler hat. Die kostenlose Nutzung der Highcharts-Bibliotheken ist auch nur eingeschränkt (non-commercial) möglich: https://shop.highsoft.com/highcharts
Die Stations-Ids sind hier dokumentiert: https://www.dwd.de/DE/leistungen/met_verfahren_mosmix/mosmix_stationskatalog.pdf?__blob=publicationFile&v=4
Jetzt reiß ich den Thread zwar etwas, aber zu den unten aufgeführten Tippps Danke :top: - die wettersoftware.de Variante ist natürlich eine "Doofe-Leute-Anleitung" ;) und die ist wirklich in 10 Minuten gemacht. Habe ich nun auch mal implementiert.
Es ging mir aber um das komplexe System, Aber vielleicht kommt da ja noch etwas für Windows - denn auch bei Linux dürften viele "Raus" sein :) ;)
Wie schon geschrieben. Die Daten stelle ich über diese Adresse bereit: https://buwx.de/charts/meteogram/mosmix.php?station=10471&title=Leipzig&titleShort=Leipzig
Du musst nur noch die meteogramm.html einbinden.
Wenn wir schon OT sind. Mir wäre es ein Graus, hier mit Powershell und Co. zu hantieren :)
Beiträge zusammengeführt, weil der Autor sich selbst geantwortet hat statt seinen letzten Beitrag zu ändern: 12.03.2018, 19:42:04
Zitat von: Marc S am 12.03.2018, 15:58:34
Stimmt falk, dann muss ich das noch anpassen. Danke für die Info.
Nichts zu danken. Wenn du die WarnWetter-App hast, dann wirst du diese krummen Zeitangaben dort auch in der Vorhersage finden.
Danke falk :top:
ein multiples Thema, ich werde mich mal am Wochenende hinsetzen und versuchen etwas in die Materie "einzudenken" ;)
Zitat von: falk am 03.03.2018, 11:28:34
Über einen Cron-Job wird stündlich folgendes Skript gestartet:
#!/bin/sh
# extract mos data for the given station
cd /root/dwd
MOSMIX=MOSMIX_S_LATEST_240.kmz
STATION=10738
wget -N https://opendata.dwd.de/weather/local_forecasts/mos/${MOSMIX}
if [ ${MOSMIX} -nt ${STATION}.xml ]; then
zcat ${MOSMIX} | xsltproc --param station ${STATION} mos.xsl - > ${STATION}.xml
zcat ${MOSMIX} | xsltproc --param station ${STATION} mos-json.xsl - > ${STATION}.json
touch --reference=${MOSMIX} ${STATION}.xml
touch --reference=${MOSMIX} ${STATION}.json
xmllint --format ${STATION}.xml > /var/www/buwx/charts/meteogram/${STATION}.xml
python -m json.tool ${STATION}.json > /var/www/buwx/charts/meteogram/${STATION}.json
fi
Hallo Falk,
Vielen Dank für dieses Skript. Das hat mir schon sehr geholfen :)
Aus deinem Code habe ich die für mich relevanten Abschnitte bereits zusammengefasst:
#!/bin/sh
# extract mos data for the given station
cd /var/www/vhosts/ms/beta/mos
STATION=10738
wget -N -P data https://opendata.dwd.de/weather/local_forecasts/mos/MOSMIX_S_LATEST_240.kmz
zcat data/MOSMIX_S_LATEST_240.kmz | xsltproc --stringparam station "${STATION}" \
mos-json.xsl - > data/${STATION}.json
Das erzeugt die gewünschte Datei 10738.json für diese eine Wetterstation. Angenommen ich würde gerne alle Stationen aus der Datei ins JSON-Format konvertieren: Weißt du, wie man den Befehl anpassen müsste?
Um alle 5.200 Stationen in eine JSON-Datei zu bekommen, musst du das Stylesheet ändern.
mos-json.xsl:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd"
xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method="text" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="kml:Document">
<xsl:text>{</xsl:text>
<xsl:apply-templates />
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match="kml:ExtendedData">
<xsl:text>"issuer": "</xsl:text>
<xsl:value-of select="dwd:ProductDefinition/dwd:Issuer" />
<xsl:text>"</xsl:text>
<xsl:text>, "productId": "</xsl:text>
<xsl:value-of select="dwd:ProductDefinition/dwd:ProductID" />
<xsl:text>"</xsl:text>
<xsl:text>, "generatingProcess": "</xsl:text>
<xsl:value-of select="dwd:ProductDefinition/dwd:GeneratingProcess" />
<xsl:text>"</xsl:text>
<xsl:apply-templates select="dwd:ProductDefinition/dwd:ForecastTimeSteps" />
</xsl:template>
<xsl:template match="dwd:ForecastTimeSteps">
<xsl:text>, "timeSteps": [</xsl:text>
<xsl:for-each select="dwd:TimeStep">
<xsl:text>"</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>]</xsl:text>
</xsl:template>
<xsl:template match="kml:Placemark">
<xsl:text>, "station_</xsl:text>
<xsl:value-of select="kml:name" />
<xsl:text>": {</xsl:text>
<xsl:text>"name": "</xsl:text>
<xsl:value-of select="kml:name" />
<xsl:text>"</xsl:text>
<xsl:text>, "description": "</xsl:text>
<xsl:value-of select="kml:description" />
<xsl:text>"</xsl:text>
<xsl:text>, "coordinates": [</xsl:text>
<xsl:value-of select="kml:Point/kml:coordinates" />
<xsl:text>]</xsl:text>
<xsl:for-each select="kml:ExtendedData/dwd:Forecast">
<xsl:text>, "</xsl:text>
<xsl:value-of select="@dwd:elementName" />
<xsl:text>": [</xsl:text>
<xsl:attribute name="dwd:elementName"><xsl:value-of
select="@dwd:elementName" /></xsl:attribute>
<xsl:call-template name="format">
<xsl:with-param name="text" select="normalize-space()" />
</xsl:call-template>
<xsl:text>]</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template name="format">
<xsl:param name="text" />
<xsl:variable name="replace" select="' '" />
<xsl:variable name="with" select="','" />
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:text>"</xsl:text>
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:text>"</xsl:text>
<xsl:value-of select="$with" />
<xsl:call-template name="format">
<xsl:with-param name="text"
select="substring-after($text,$replace)" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text>
<xsl:value-of select="$text" />
<xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Zur Demonstration mit einem vorgeschalteten Filter, den du weglassen solltest
mos-filter.xsl:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd"
xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method="text" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="kml:Document">
<xsl:text>{</xsl:text>
<xsl:apply-templates />
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match="kml:ExtendedData">
<xsl:text>"issuer": "</xsl:text>
<xsl:value-of select="dwd:ProductDefinition/dwd:Issuer" />
<xsl:text>"</xsl:text>
<xsl:text>, "productId": "</xsl:text>
<xsl:value-of select="dwd:ProductDefinition/dwd:ProductID" />
<xsl:text>"</xsl:text>
<xsl:text>, "generatingProcess": "</xsl:text>
<xsl:value-of select="dwd:ProductDefinition/dwd:GeneratingProcess" />
<xsl:text>"</xsl:text>
<xsl:apply-templates select="dwd:ProductDefinition/dwd:ForecastTimeSteps" />
</xsl:template>
<xsl:template match="dwd:ForecastTimeSteps">
<xsl:text>, "timeSteps": [</xsl:text>
<xsl:for-each select="dwd:TimeStep">
<xsl:text>"</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>]</xsl:text>
</xsl:template>
<xsl:template match="kml:Placemark">
<xsl:text>, "station_</xsl:text>
<xsl:value-of select="kml:name" />
<xsl:text>": {</xsl:text>
<xsl:text>"name": "</xsl:text>
<xsl:value-of select="kml:name" />
<xsl:text>"</xsl:text>
<xsl:text>, "description": "</xsl:text>
<xsl:value-of select="kml:description" />
<xsl:text>"</xsl:text>
<xsl:text>, "coordinates": [</xsl:text>
<xsl:value-of select="kml:Point/kml:coordinates" />
<xsl:text>]</xsl:text>
<xsl:for-each select="kml:ExtendedData/dwd:Forecast">
<xsl:text>, "</xsl:text>
<xsl:value-of select="@dwd:elementName" />
<xsl:text>": [</xsl:text>
<xsl:attribute name="dwd:elementName"><xsl:value-of
select="@dwd:elementName" /></xsl:attribute>
<xsl:call-template name="format">
<xsl:with-param name="text" select="normalize-space()" />
</xsl:call-template>
<xsl:text>]</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template name="format">
<xsl:param name="text" />
<xsl:variable name="replace" select="' '" />
<xsl:variable name="with" select="','" />
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:text>"</xsl:text>
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:text>"</xsl:text>
<xsl:value-of select="$with" />
<xsl:call-template name="format">
<xsl:with-param name="text"
select="substring-after($text,$replace)" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text>
<xsl:value-of select="$text" />
<xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
[root@s17303671 tmp]# cat mos-filter.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd"
xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- override the above template for certain Placemark elements; output nothing. -->
<xsl:template match="kml:Placemark[
not(kml:name[starts-with(text(),'M')])]">
</xsl:template>
</xsl:stylesheet>
Die Kommandos wären dann (mit, bzw. ohne Filter)
zcat MOSMIX_S_LATEST_240.kmz | xsltproc mos-filter.xsl - | xsltproc mos-json.xsl - > MOSMIX_S_LATEST_240_filtered.json
zcat MOSMIX_S_LATEST_240.kmz | xsltproc mos-json.xsl - > MOSMIX_S_LATEST_240.json
Zitat von: falk am 17.03.2018, 00:16:55
Um alle 5.200 Stationen in eine JSON-Datei zu bekommen, musst du das Stylesheet ändern.
Super, dankeschön :top: Da die Datei recht groß wird, wenn alle Stationen in eine Datei geschrieben werden, habe ich überlegt, ob man das Skript so umschreiben kann, dass für jede Station aus dem KMZ-File automatisch eine JSON-Datei erstellt wird.
Spontan würde mir dazu nur einfallen, ein Array aller Stationen zu erstellen und mit einer Schleife diesen Befehl für jede Station auszuführen:
zcat data/MOSMIX_S_LATEST_240.kmz | xsltproc --stringparam station "${STATION}" \
mos-json.xsl - > data/${STATION}.json
Das würde natürlich ewig dauern und es wäre sicher der schlechteste Weg, dieses Problem zu lösen. Vielleicht hat jemand eine bessere Idee? Mir fehlt leider das Know-how, insbesondere bezüglich XSL.
Zitat von: jeopardy am 17.03.2018, 08:48:36
Das würde natürlich ewig dauern und es wäre sicher der schlechteste Weg, dieses Problem zu lösen. Vielleicht hat jemand eine bessere Idee? Mir fehlt leider das Know-how, insbesondere bezüglich XSL.
XSLT ist eine elegante Methode um schnell mal die Daten für eine Station bereitzustellen. Bei über 5000 Stationen würde ich mit der Programmiersprache meiner Wahl die entpackte KML-Datei (600MB) einlesen und die entsprechenden Stationsdaten erzeugen. Mein vServer hat aber hierfür ohnehin nicht die notwendigen Kapazitäten.
Ich versuche gerade die MOSMIX-Vorhersagedaten mit den tatsächlich gemessenen Daten der DWD-Station Stuttgart-Flughafen und meiner Station abzugleichen. Da meine Station in einem Tal liegt, gibt es doch teils erhebliche Abweichungen bei den Temperaturen, für die aber statistisch signifikante Parameter, wie Sonnenstand, Windgeschwindigkeit, Bedeckungsgrad, usw. vorliegen. Ich werde berichten...
Da mir ebenfalls nur die Ressourcen eines vServers zur Verfügung stehen, ist das KMZ-Format wohl vorerst keine Alternative zu den CSV-Daten unter opendata.dwd.de/weather/local_forecasts/poi/.
Die werden zwar nur in dreistündlicher Auflösung bereitgestellt, sind dafür aber wesentlich leichter zu verarbeiten..
ZitatDie Bereitstellung der MOSMIX-Vorhersagen im KML-Format löst das bisherige o-Underline-Format (ASCII) ab. MOSMIX-Vorhersagen im o-Underline-Format werden noch bis zum 30.04.2018 bereitgestellt.
So wie ich das verstehe, sind die CSV-Daten von dieser Umstellung nicht betroffen. Ich hoffe der DWD stellt seine Vorhersagedaten nicht komplett auf das neue KMZ-Format um. Vielleicht werden die CSV-Daten im poi-Ordner ja auch bald in stündlicher Auflösung bereitgestellt.
Zitat von: jeopardy am 17.03.2018, 13:10:25
Da mir ebenfalls nur die Ressourcen eines vServers zur Verfügung stehen, ist das KMZ-Format wohl vorerst keine Alternative zu den CSV-Daten unter opendata.dwd.de/weather/local_forecasts/poi/.
Meine Stationsdaten werden über XSLT in 12s bereitgestellt. Zeitaufwändig wäre die Aufbereitung der Daten aller Vorhersagestationen.
Da ich von den 40 Vorhersageparametern nur 9 auswerte, habe ich mir die Ausgabe eingeschränkt. Das kann auch über die URL https://buwx.de/charts/meteogram/mosmix.php mit dem Parameter opt=1 erzwungen werden.
Die Größe des JSON-Datenpakets sinkt hierdurch immerhin von 200KB auf 24KB. Meine Stationsdaten sehe ich hauptsächlich über mein Smartphone ein und bei schlechter Verbindung kommt es auf jedes Byte an. Der Sourcecode meiner Android-App ist ebenfalls unter GitHub abrufbar https://github.com/buwx/BuWX
@ falk, was für eine Meisterleistung, Bravo :top:
Ich habe jetzt auch mal einen Blick in den neuen Datensatz geworfen, mir fällt auf dass es Stationen gibt, bei denen der Niederschlag (z.B. RR3c) verrückt spielt, so sind einfach mal 3h-Summen >> 50 kg/m2 möglich, davor und danach ist es trocken. Im Vergleich dazu sehen die "alten" csv-MOS-Daten korrekt aus, dort sind diese Ausreisser nicht zu finden.
Ich hoffe die csv-Dateien bleiben uns noch lange verfügbar...
Gruss Lukas, profiwetter.ch
Hallo falk,
mit deiner Vorlage ist das natürlich ein Kinderspiel :top: auch für "Doofe" :D
Ich habe jetzt mal die Testdaten hochgeladen http://www.leipzig-wetter.de/Meteogramm/meteogramm.html
Es stimmt nur etwas mit dem Zeichensatz nicht, ich vermute es liegt an UTF-8?
Zitat von: Lukas am 20.03.2018, 23:23:12
@ falk, was für eine Meisterleistung, Bravo :top:
Danke für das Kompliment. Zumal es von dir kommt. Deine weltweiten Wetterprognosen sind fantastisch.
Zitat
Ich habe jetzt auch mal einen Blick in den neuen Datensatz geworfen, mir fällt auf dass es Stationen gibt, bei denen der Niederschlag (z.B. RR3c) verrückt spielt, so sind einfach mal 3h-Summen >> 50 kg/m2 möglich, davor und danach ist es trocken. Im Vergleich dazu sehen die "alten" csv-MOS-Daten korrekt aus, dort sind diese Ausreisser nicht zu finden.
Ich hoffe die csv-Dateien bleiben uns noch lange verfügbar...
Ich beobachte die Vorhersagen auch sehr kritisch. Aufgefallen ist mir jedoch noch nichts besonderes. Könntest du mir so einen Fall konkret mitteilen? Das würde mich sehr interessieren.
Ich hoffe natürlich ebenfalls, dass die Daten vom DWD weiterhin zur Verfügung gestellt werden. Ich schaue auch regelmäßig nach den Neuigkeiten zu Open Data. Die CSV-Dateien sehe ich als besonderen Service für uns, da hier alle 12 Stunden die Vorhersagedaten schön portitioniert zur Verfügung gestellt werden.
Die KMZ-Daten werden zwar stündlich bereitgestellt und sind auch in stündlicher Auflöung gegeben, dafür muss man aber einen größeren Aufwand treiben um an diesen Datenschatz zu gelangen.
Zitat von: LE-Wetter am 21.03.2018, 19:31:07
Es stimmt nur etwas mit dem Zeichensatz nicht, ich vermute es liegt an UTF-8?
Ja, das Problem nervt mich seit sehr langer Zeit immer mal wieder...
Deine Seite wird in UTF-8 ausgeliefert. Die Inhalte sollten deshalb ebenfalls UTF-8 kodiert sein. Das scheint bei der Datei meteogramm.html nicht der Fall zu sein. Könntest du das, z.B. mit dem Programm Notepad++ prüfen und ggf. konvertieren?
Gruß
falk
Zitat von: falk am 21.03.2018, 20:53:49
Deine Seite wird in UTF-8 ausgeliefert. Die Inhalte sollten deshalb ebenfalls UTF-8 kodiert sein. Das scheint bei der Datei meteogramm.html nicht der Fall zu sein. Könntest du das, z.B. mit dem Programm Notepad++ prüfen und ggf. konvertieren?
:top: http://www.leipzig-wetter.de/Meteogramm/meteogramm.html
Konvertieren kann manchmal helfen :D :top: Klasse falk - Nun sind auch dir Grad Celsius Werte im Diagramm richtig drin
Dann werde ich das mal in meine Page einbinden am Wochenende
Danke dir falk - einfach Spitze :top:
Hallo falk,
im Anhang einen grafischen Ausschnitt, unten die Daten (Sorry für die unschöne Formatierung), die Einheit ist kg/m2 müsste also l/m2 oder halt mm entsprechen. Ich habe bis jetzt erst Stationen mit 066* und 067* angeschaut, also keine Deutschen. Bei vielen Ortschaften sind auffallende Ausreisser erkennbar, nicht nur wie hier wos über mehrere Stunden Niederschlag hat, manchmal auch nur ein Datenpunkt mit 80 mm, davor und danach trocken.
Der DWD stellt in seiner App nur Niederschlagsmengen bis Tag 4 dar, im Ausblick nur Wahrscheinlichkeiten. Die Niederschlagsmengen im KMZ unterscheiden sich markant von denen in den csv-Dateien bereitgestellten.
RR3c:
[0.0,
nan,
nan,
18.0,
nan,
nan,
21.0,
nan,
nan,
0.0,
nan,
nan,
0.0,
nan,
nan,
23.0,
nan,
nan,
22.0,
nan,
nan]
RR1h:
[0.0,
6.0,
5.0,
6.0,
7.0,
7.0,
7.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
7.0,
7.0,
9.0,
8.0,
7.0,
7.0,
0.0,
0.0]
Hallo Lukas,
jetzt weiß ich was du meinst. Bei den deutschen Stationsdaten stimmt auch nicht der Wert RR1c mit der Beschreibung in https://opendata.dwd.de/weather/lib/MetElementDefinition.xml überein. Plausibel sind 1/10 mm. Deshalb teile ich den Wert durch 10. Bei Gelegenheit werde ich dem DWD hier eine Mail schreiben.
Meine Darstellung ist hier wahrscheinlich auch falsch. Da der Niederschlag für die letzten 60 Minuten definiert ist, übernehme ich für die Stunde x den Wert der Stunde x+1. Bei den Wetterereignissen ist das genauso. Ich muss das nochmals überdenken.
meteogram.precipitation.push({
x: from,
y: parseFloat(this.dwd.station.RR1c[i+1])/10
});
Gruß
falk
Danke falk,
an die Option data=data/10 habe ich auch schon gedacht, gut dass du mir das bestätigst. In den csv-Dateien ist das Datenformat des Niederschlages ja auch mit einer Dezimalstelle versehen.
Gruss Lukas
Hallo falk,
ich habe beim DWD gerade die richtige Abteilung erreicht, sie schauen sich die Differenzen zwischen Datensatz und Einheiten an.
Gruss Lukas
Beiträge zusammengeführt, weil der Autor sich selbst geantwortet hat statt seinen letzten Beitrag zu ändern: 26.03.2018, 16:05:15
Hallo zusammen,
der DWD hat die Daten bereits angepasst, nun sind die Niederschlagsmengen korrekt in der Einzeit kg/m2 oder mm gelistet. Die Routinen müssen dementsprechend angepasst werden.
Gruss Lukas
Hallo falk und Lukas,
das Thema ist wahnsinnig interessant und ich bin begeistert, wie (speziell) Ihr beiden derzeit schon Lösungen umgesetzt habt oder auch an Weiterentwicklungen arbeitet.
Dass die Ergebnisse hier im Forum bekannt gegeben werden, freut mich um so mehr und eine Reihe von Usern haben schon von euren Ausführungen bei der Gestaltung ihrer eigenen Website profitiert.
Eure Anleitungen, Beschreibungen oder Diskussionen sind für alle interessierten User dieses Forums eine echte Bereicherung. Dafür von meiner Seite aus einmal herzlichen Dank. Ich lese immer gerne mit, wenn z.B. eines der "nächsten" Probleme von Euch geknackt wurde.
Auch die Initiative von Lukas, direkt beim DWD nachzufragen, eine Bestätigung zur Korrektur des Problems zu erhalten und hier bekannt zu geben, ist mehr als lobenswert.
Euch (und Allen, die noch an dem Thema arbeiten) zunächst vielen Dank. Ich find's großartig.
Gruß Hans
Vielen Dank Lukas,
ich habe erst jetzt die Umstellung bemerkt. Scheint, dass auch der DWD noch im Beta-Betrieb ist :)
Beste Grüße
falk
Hallo zusammen,
es gibt wieder Neuigkeiten:
https://www.dwd.de/DE/leistungen/opendata/neuigkeiten/opendata_apr2018_02.html
- eine neue Datei mit 115 Parametern (Update 4x pro Tag, nicht jede Stunde)
Details über die Verfügbarkeit: bis wann, ab wann welche Datensätze vom DWD zur Verfügung gestellt werden:
https://www.dwd.de/DE/leistungen/met_verfahren_mosmix/met_verfahren_mosmix.html
Gruss Lukas
Da sind ein paar interessante Parameter dabei
- E_TTT für die Unsicherheit der Temperaturvorhersage
- RadS2, RadL3 zur Strahlungsbilanz (Kaltluftsee im Tal)
Ich hätte ja gedacht, dass die MOSMIX_S-Daten frei zur Verfügung gestellt werden und MOSMIX_L nur gegen Bezahlung. So ist es natürlich besser.
Danke DWD :)
Zitat#!/bin/sh
# extract mos data for the given station
cd /root/dwd
MOSMIX=MOSMIX_S_LATEST_240.kmz
STATION=10738
wget -N https://opendata.dwd.de/weather/local_forecasts/mos/${MOSMIX}
if [ ${MOSMIX} -nt ${STATION}.xml ]; then
zcat ${MOSMIX} | xsltproc --param station ${STATION} mos.xsl - > ${STATION}.xml
zcat ${MOSMIX} | xsltproc --param station ${STATION} mos-json.xsl - > ${STATION}.json
touch --reference=${MOSMIX} ${STATION}.xml
touch --reference=${MOSMIX} ${STATION}.json
xmllint --format ${STATION}.xml > /var/www/buwx/charts/meteogram/${STATION}.xml
python -m json.tool ${STATION}.json > /var/www/buwx/charts/meteogram/${STATION}.json
fi
Hallo
Vielleicht könnt ihr mir ja mal auf die Sprünge helfen.
Der obere Skript von falk funktionert auf meinem Server nicht, weil dort wohl xsltproc nicht installiert ist. Jetzt wollte ich das ganze per PHP umsetzen. Zu meinem Problem. Wie filtere/kürze ich aus der kmz/kml Datei die Daten heraus , die ich nur haben möchte.
Hallo,
ich nutze, wie ja weiter oben schon geschrieben, das Programm von meteoware
http://tools.wettersoftware.de/
um das Meteogramm darzustellen.
Seit heute scheint das nicht mehr zu funktionieren und ich vermute, der DWD hat hier mal wieder gebastelt.
Können das andere User auch bestätigen?
Ich habe jedenfalls den Autor heute mal per Mail angeschrieben und bin gespannt, wie er sich äußert.
Beiträge zusammengeführt, weil der Autor sich selbst geantwortet hat statt seinen letzten Beitrag zu ändern: 19.09.2018, 11:01:24
antworte mir mal selbst:
Ich sehe gerade auf der Seite des Autors folgende Meldung:
Laut DWD wird das MOSMIX-POI-CSV-Produkt am 17. September 2018 eingestellt. Das heisst, dass das Meteogramm in der aktuellen Form nicht mehr laufen wird, da die Datenquelle nicht mehr verfügbar ist. Die von DWD genannten Alternativen sind für die Betreiber von kleinen Homepages mit großen Hürden verbunden. Wir versuchen brauchbare Lösungen zu finden.
Ich hoffe mal, dass eine andere Lösung gefunden wird, denn was ich auf der DWD-Seite als Ersatz gesehen habe, ist eher für versierte User (/und in dem Bereich zähle ich mich nicht dazu) geeignet.
Hallo Werner,
das war seit Juli absehbar, die DWD-Neuigkeiten gibt es immer hier: https://www.dwd.de/SiteGlobals/Functions/RSSFeed/DE/opendata/opendata_lsb.xml?nn=161022
Ich habe meine Seite Profiwetter.ch (http://profiwetter.ch) in tagelanger Arbeit vom alten ins neue Datenformat umprogrammiert und noch ein paar neue Wetterparameter hinzugefügt. Hier findest du die Meteogramme jedenfalls weiterhin, beim Einbinden nur die Verlinkung auf die Seite nicht vergessen ;-)
Die Umstellung ist natürlich doof, mit dem KMZ/KML-Format muss man erst einmal umgehen können.
Gruss Lukas
Hallo Lukas,
ja, ich bewundere Dein Bemühungen und Ergebnisse schon, seit sie hier vorgestellt wurden.
Mir wäre halt nur eine "eigenständige" Lösung lieber.
Mal abwarten.
Zitat von: Marc S am 06.09.2018, 09:44:41
Der obere Skript von falk funktionert auf meinem Server nicht, weil dort wohl xsltproc nicht installiert ist. Jetzt wollte ich das ganze per PHP umsetzen. Zu meinem Problem. Wie filtere/kürze ich aus der kmz/kml Datei die Daten heraus , die ich nur haben möchte.
Hallo Marc,
es gibt noch andere XSLT-Prozessoren. Grundsätzlich muss man die KMZ-Daten entpacken und dann erst die XML-Daten verarbeiten. Hier kann es von Vorteil sein, wenn man erst über XSLT filtert und dann nach JSON konvertiert. Siehe auch mos-filter.xsl und mos-json.xsl in meinem GitHub Repository https://github.com/buwx/meteogram
Übrigens gibt es unter OpenData für jede Station nun auch einzeln eine KMZ-Datei. Allerdings nur für die 3h-MOSMIX-Vorhersagen.
Gruß
@Werner
Bei dir besteht ein ähnliches Problem. Bisher wurden nur die CSV-Dateien für das Meteogram verwendet. Da dieses Format nicht mehr zur Verfügung gestellt wird, muss man zwangsweise die KMZ-Daten verarbeiten.
Hi falk
Vielen Dank für deine Antwort. Bin jetzt auch schon etwas weiter gekommen. Habe jetzt wenigsten schon mal die .json Datei, mit nur den Werten meiner Station. Mal schauen wie es weiter geht.
Hallo,
muss das Thema mal wieder aufgreifen. Seit gestern oder heute ist bei mir das Meteogramm von
http://tools.wettersoftware.de/
nicht funktionsfähig. Das hatten wir ja schon mal, als der DWD wieder mal einen Änderung durchgeführt hat.
Haben das Problem auch andere oder liegt evtl nur bei mir ein Problem vor, wobei ich nicht wüsste, warum.
Nebenbei:
Das Tool von Lukas geht weiterhin einwandfrei.
Nachtrag:
scheint nur vorübergehend gewesen zu sein, seit kurzem geht es wieder.
Hallo Werner,
bei mir funktioniert es. Es wird auch aktualisiert. Bis jetzt jedenfalls: http://wetter-esslingen.info/meteogram/meteogram.html
Wobei Christian kein Update mehr geliefert hat, was sehr schade ist. Er hat auf seiner Seite Onlinebetrachter sehr schöne Grafiken und auch das Stationsmodell. Nur leider kann man diese nicht auf seiner eigenen Webseite implementieren.
Falls Christian dies lesen sollte, wäre dies eine Bitte, ein Update zur Verfügung zu stellen. Veilleicht ist gnau dass, das Problem.
Hallo Lothar,
Du hast anscheinend meinen Nachtrag nicht gelesen, dass es bei mir auch wieder funktioniert. Es war nur ein temporäres Problem.