Wetterwarnungen vom DWD – Erster Ansatz: JSON

Mein Ziel war es, Wetterwarnungen für eine bestimmte Region auf einer Webseite (www.merkenonline.de Info-Plattform für den Ort Düren-Merken) darzustellen. Glücklicherweise bietet der Deutsche Wetterdienst Unwetterwarnung in verschiedenen Varianten kostenlos an. Mein erster Ansatz war das Parsen der Unwetterdaten im Json-Format:

http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
Daten-Beispiel:

{
   "time":1484853036000,
   "warnings":{
      "105512000":[{                            //Warncell-ID des Landkreises
         "start":1484841600000,
         "end":1484910000000,
         "regionName":"Stadt Bottrop",
         "level":2,
         "type":5,
         "altitudeStart":null,
         "event":"FROST",
         "headline":"Amtliche WARNUNG vor FROST",
         "description":"Es tritt mäßiger Frost zwischen -4 °C und -9 °C auf.",
         "altitudeEnd":null,
         "stateShort":“NRW“,
         "instruction":"",
         "state":"Nordrhein-Westfalen"
      }]
   },
   "vorabInformation":{
      ## gleiches Format ##
   }
}

Tabelle mit Warncell-IDs für die Landkreise:
http://www.dwd.de/DE/leistungen/gds/help/warnungen/cap_warncellids_csv.csv?__blob=publicationFile&v=4

Der DWD liefert genauer gesagt im JSONP-Format und nicht im reinen JSON-Format. Der einzige Unterschied liegt jedoch darin, dass das reine JSON in „warnWetter.loadWarnings(‚“ und „);“ eingeschlossen ist.

Mit folgendem Script werden die Daten gelesen und entsprechend formatiert ausgegeben.

JSONP-Daten einlesen, JSON extrahieren und in Array speichern:

$jsonp = file_get_contents("http://www.wettergefahren.de/DWD/warnungen/warnapp/warnings.json");

$json = extract_unit($jsonp, 'warnWetter.loadWarnings(', ');');


$alert_list = json_decode($json, true);

$relevant_alerts = $alert_list["warnings"]["105358000"];
$relevant_prealerts = $alert_list["vorabInformation"]["105358000"];

if($relevant_alerts == null) $relevant_alerts = array();
if($relevant_prealerts == null) $relevant_prealerts = array();

$relevant_alerts = array_merge($relevant_prealerts, $relevant_alerts);

Array nach Warnstufe sortieren:

$sortArray = array();
foreach($relevant_alerts as $key => $array) {
        $sortArray[$key] = $array['level'];
} 

array_multisort($sortArray, SORT_ASC, SORT_NUMERIC, $relevant_alerts);

Titelzeile ausgeben wenn Warnungen vorliegen:

$numberOfAlerts = count($relevant_alerts);

if($numberOfAlerts == 1) {
	echo "<center><h3>Es liegt 1 Warnmeldung vor!</h3></center>";
} elseif($numberOfAlerts > 0) {
	echo "<center><h3>Es liegen ".count($relevant_alerts)." Warnmeldungen vor!</h3></center>";
} else {
	exit();
}

Warnungen ausgeben (Warnungstext mit Gültigkeit im Tooltip):

echo "<ul>";
$cnt = 0;
foreach($relevant_alerts as $alert) {
	$event = $alert['event'];
	$headline = $alert['headline'];
	$description = $alert['description'];
	$regionName = $alert['regionName'];
	$level = $alert['level'];
	$start = utf8_decode(date('d.m.Y H:i', substr($alert['start'], 0, 10)));
	$end = utf8_decode(date('d.m.Y H:i', substr($alert['end'], 0, 10)));
	echo "<li style='padding-left: 5px;background: transparent'><span class='tooltip'><img src='$level.png' width='18' height='18' />&nbsp;&nbsp;$event<br />
	<span class='tooltiptext'>$headline für die $regionName<br />Gültig von $start bis $end<br />$description</span></span>
	</li>";
	$cnt += 1;
}
echo "</ul>";

extract_unit Funktion um reines JSON zu extrahieren:

function extract_unit($string, $start, $end) {
	$pos = stripos($string, $start);
	$str = substr($string, $pos);
	$str_two = substr($str, strlen($start));
	$second_pos = stripos($str_two, $end);
	$str_three = substr($str_two, 0, $second_pos);
	$unit = trim($str_three); // remove whitespaces

	return $unit;
}
?>

CSS-Style:

.tooltip .tooltiptext {
        visibility: hidden;
        width: 600px;
        background-color: black;
        color: #fff;
        text-align: left;
        border-radius: 6px;
        padding: 5px;

        /* Position the tooltip */
        position: absolute;
        z-index: 1;
}

.tooltip:hover .tooltiptext {
        visibility: visible;
}

.tooltip {
	vertical-align: top;
}

Fazit:
Das ganze funktioniert zwar wie gewünscht, nur leider musste ich feststellen, dass der DWD in dieser Variante nur Warnungen auf Landkreisebene zur Verfügung stellt. Das heißt, wenn in einer Gemeinde im Kreis eine Warnung besteht, wird diese für den kompletten Landkreis angezeigt. Seit Mitte letzten Jahres bietet der DWD deswegen auch Unwetterwarnungen auf Gemeindeebene an, jedoch nicht im JSON-Format, sondern per CAP-Dateien auf einem FTP-Server. Ich habe somit ein neues Ziel gefunden. Mehr dazu im nächsten Beitrag.

Hier geht es zum nächsten Beitrag: Wetterwarnungen vom DWD – Alternative: GDS (FTP)

Categories: DWD Unwetter Parser