• Willkommen im Forum „Wetterstationsforum.info - Archiv“.
 

Neuigkeiten:

Dieses Forum dient ausschließlich zu Archivzwecken.
Für Fragen nutze bitte unser aktuelles Forum, welches du unter https://wetterstationsforum.info findest.

Hauptmenü

MOSMIX-Vorhersagen im neuen Format

Begonnen von falk, 03.03.2018, 11:28:34

⏪ vorheriges - nächstes ⏩

falk

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

LE-Wetter

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  :)  ;)
Liebe Grüße von LE-Wetter

WS 888, Mete-On1 und WD4000 und
alte Barometer, Blitzortung, Radioaktivität
https://www.leipzig-wetter.de
www.regionalwetter-sa.de
www.wetternetz-sachsen.de
www.wetterhistorie-leipzig.de

falk

#22
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.

LE-Wetter

Danke falk  :top:

ein multiples Thema, ich werde mich mal am Wochenende hinsetzen und versuchen etwas in die Materie "einzudenken"  ;)
Liebe Grüße von LE-Wetter

WS 888, Mete-On1 und WD4000 und
alte Barometer, Blitzortung, Radioaktivität
https://www.leipzig-wetter.de
www.regionalwetter-sa.de
www.wetternetz-sachsen.de
www.wetterhistorie-leipzig.de

jeopardy

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?

falk

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

jeopardy

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.

falk

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...

jeopardy

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.

falk

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.