Openweathermap
Von der Webseite www.openweathermap.com kann man per REST-Schnittstelle kostenlos die aktuellen Wetterdaten von Orten weltweit herunterladen. Kostenlos ist der Service allerdings nur, wenn mann weniger als 60 Aufrufe pro Minute hat, für größere Klickzahlen muss man einen kostenpflichtigen Service in Anspruch nehmen.
Über die Güte der Daten kann ich keine Angaben machen. Nach meinen Beobachtungen gibt es schon einige Abweichungen von meinen Wetterbeobachtungen und anderen Wetterdiensten.
API
Um den Dienst nutzen zu können, muss man sich Registrieren und einen API-Key generieren, der bei den Aufrufen mitgeschickt werden muss. Die API ist auf der Seite http://openweathermap.com/api ausführlich erläutert.
Es gibt eine API für das aktuelle Wetter, kostenlos auch für eine 5-Tage-Wettervorhersage, Umweltdaten, etc. Ich habe im Folgenden nur die API für das aktuelle Wetter benutzt. Der Aufruf dazu lautet:
http://samples.openweathermap.org/data/2.5/weather?id=2172797&appid=b6907d289e10d714a6e88b30761fae22
Als Parameter mitgeliefert wird die id
der Stadt und die oben beschriebene appid
.
Ermitteln der Stadt-Id
Es gibt eine vollständige Liste mit allen Städte-IDs zum Download. Dort sucht man sich die gewünschte ID heraus.
Aufruf der Schnittstelle
In PHP wurde das mit folgendem Codebeispiel umgesetzt. Die Daten stehen dann in einem Array zur Verfügung, dass man sich gut auf dem Bildschirm ausgeben und analysieren kann:
$url = "http://api.openweathermap.org/data/2.5/weather?id=6553135&lang=de&appid=xxputyourownkeyxxx"; $data = file_get_contents($url); $arrData = json_decode($data,true); echo "<pre>"; print_r ($arrData); echo "</pre>";
Die Ausgabe sieht dann folgendermaßen aus:
Array ( [coord] => Array ( [lon] => 7.81 [lat] => 51.68 ) [weather] => Array ( [0] => Array ( [id] => 800 [main] => Clear [description] => Klarer Himmel [icon] => 01d ) ) [base] => stations [main] => Array ( [temp] => 277.15 [pressure] => 1018 [humidity] => 55 [temp_min] => 277.15 [temp_max] => 277.15 ) [visibility] => 10000 [wind] => Array ( [speed] => 1.5 [deg] => 190 ) [clouds] => Array ( [all] => 0 ) [dt] => 1519050000 [sys] => Array ( [type] => 1 [id] => 4912 [message] => 0.0223 [country] => DE [sunrise] => 1519022051 [sunset] => 1519059102 ) [id] => 6553135 [name] => Hamm, Stadt [cod] => 200 )
Die Temperaturen sind in Kelvin angegeben und müssen in ºC umgerechnet werden.
Umsetzung mit PHP
Die Umsetzung ist jetzt relativ einfach. Die Windstärke ist in der Einheit m/s angegeben. Dort habe ich eine Umrechnung in Windstärken vorgenommen (Beaufort-Skala). In der Include-Datei beaufort-skala.php
gibt es die Funktion getBeaufort()
, die ein Array aus Windstärke und Windstärkenbeschreibung liefert.
Da die Windrichtung ebenfalls nur in Grad angegeben wird, habe ich dort zusätzlich eine Prozedur getWindrichtung()
eingefügt, die die meteorologischen Bezeichnungen Nord, Nordost , Ost , … liefert.
<?php /* ********************************************************************* * Walter Hupfeld - created 18.02.2018 * Auslesen von OpenWeather-Daten * ********************************************************************* */ require("beaufort-skala.php"); $url = "http://api.openweathermap.org/data/2.5/weather?id=6553135&lang=de&appid=xxputyourownkeyxxx"; $data = file_get_contents($url); $arrData = json_decode($data,true); $numTemp = round($arrData['main']['temp'] - 273.15,2); $numHumidity = $arrData['main']['humidity']; $numPressure = $arrData['main']['pressure']; $numTempMax = round($arrData['main']['temp_max'] - 273.15,2); $numTempMin = round($arrData['main']['temp_min'] - 273.15,2); $strSunrise = date(" H:i", $arrData['sys']['sunrise']); $strSunset = date(" H:i", $arrData['sys']['sunset']); $numWind = $arrData['wind']['speed']; $strWinddescription = getBeaufort($numWind)[0]; $numWindspeed = getBeaufort($numWind)[1]; $numWindDirection = $arrData['wind']['deg']; $strWindDescription = getWindrichtung($numWindDirection)[0]; ?> <!doctype html> <html lang="de"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta http-equiv="refresh" content="300"> <title>Wetterstation</title> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> <style> .maintemp {font-size:2em; font-weight:bold;} .icon {margin-bottom:20px;} .weather {width:30em;} .weatherdesc {font-size:1.4em;} </style> </head> <body> <div class="container"> <h2>Wetterdaten für <?= $arrData['name']?></h2> <img class="icon" src="https://openweathermap.org/img/w/<?= $arrData['weather'][0]['icon'] ?>.png" /> <span class="maintemp"> <?= round($numTemp,0) ?> °C</span><br> <!-- <?= $arrData['weather'][0]['main'] ?>--> <p class="weatherdesc"> <?= $arrData['weather'][0]['description'] ?> </p> <p><?= date("d.m.Y") ?> <?= date("H:i")?> Uhr</p> <table class="table table-striped table-bordered weather"> <tbody> <tr><td>Temperatur</td> <td><?= $numTemp ?> °C Min: <?= $numTempMin ?>°C Max: <?= $numTempMax ?> °C</td></tr> <tr><td>Wind</td> <td><?= $strWinddescription ?>, Windstärke <?= $numWindspeed ?>, <?= $numWind?> m/s <?= $strWindDescription ?> (<?=$numWindDirection?>°)</td></tr> <tr><td>Wolken</td> <td><?= $arrData['clouds']['all'];?> %</td></tr> <tr><td>Luftdruck</td> <td><?= $numPressure ?> hPa</td></tr> <tr><td>Luftfeuchtigkeit</td><td><?= $numHumidity ?> %</td></tr> <tr><td>Sichtweite</td> <td><?= $arrData['visibility'];?></td></tr> <tr><td>Sonenaufgang</td> <td><?= $strSunrise ?> Uhr</td></tr> <tr><td>Sunnenuntergang</td> <td><?= $strSunset ?> Uhr</td></tr> </tbody> </table> <p>Quelle: <a href="https://openweathermap.org/city/2911240">www.openweathermap.com</a></p> </div> </body> </html>
Windstärke und Windrichtung
Die Ermittlung der Windstärke und der Windrichtung lässt sich sicherlich kürzer und eleganter lösen.
<?php /* ********************************************************************* * * Walter Hupfeld - created 18.02.2018 * Windstärkenskala und Windstärkenbezeichnung nach Beaufort * * ********************************************************************* */ $arrBeaufort = array ( ['windstaerke' => 0, 'beschreibung' => 'Windstille', 'minwert' => 0 ], ['windstaerke' => 1, 'beschreibung' => 'leiser Zug', 'minwert' => 0.3 ], ['windstaerke' => 2, 'beschreibung' => 'leichte Brise', 'minwert' => 1.6 ], ['windstaerke' => 3, 'beschreibung' => 'schwache Brise', 'minwert' => 3.4 ], ['windstaerke' => 4, 'beschreibung' => 'mäßige Brise', 'minwert' => 5.5 ], ['windstaerke' => 5, 'beschreibung' => 'frische Brise', 'minwert' => 8.0 ], ['windstaerke' => 6, 'beschreibung' => 'staker Wind', 'minwert' => 10.8 ], ['windstaerke' => 7, 'beschreibung' => 'steifer Wind', 'minwert' => 12.9 ], ['windstaerke' => 8, 'beschreibung' => 'stürmische Wind', 'minwert' => 17.2 ], ['windstaerke' => 9, 'beschreibung' => 'Sturm', 'minwert' => 20.8 ], ['windstaerke' => 10, 'beschreibung' => 'schwerer Sturm', 'minwert' => 24.5 ], ['windstaerke' => 11, 'beschreibung' => 'orkanartiger Sturm', 'minwert' => 28.5 ], ['windstaerke' => 12, 'beschreibung' => 'Orkan', 'minwert' => 32.7 ], ); function getBeaufort($numV) { global $arrBeaufort; $strDescription=""; $numSpeeds=0; foreach ($arrBeaufort as $wind) { if ($wind['minwert'] <= $numV) { $strDescription = $wind['beschreibung']; $numSpeeds = $wind['windstaerke']; } else break; } return [$strDescription,$numSpeeds]; } $arrWindrichtung = array ( ["bezeichnung" => "Nord", "kurzbez" => "N", "winkel" => 0], ["bezeichnung" => "Nordost", "kurzbez" => "NE", "winkel" => 22.5], ["bezeichnung" => "Ost", "kurzbez" => "E", "winkel" => 67.5], ["bezeichnung" => "Südost", "kurzbez" => "SE", "winkel" => 112.5], ["bezeichnung" => "Süd", "kurzbez" => "S", "winkel" => 157.5], ["bezeichnung" => "Südwest", "kurzbez" => "SW", "winkel" => 202.5], ["bezeichnung" => "West", "kurzbez" => "W", "winkel" => 247.5], ["bezeichnung" => "Nordwest", "kurzbez" => "NW", "winkel" => 292.5], ["bezeichnung" => "Nord", "kurzbez" => "N", "winkel" => 337.5], ); function getWindrichtung($numDirection) { global $arrWindrichtung; $strBezeichnung=""; $strKurbez=""; foreach ($arrWindrichtung as $richtung) { if ($richtung['winkel'] <= $numDirection) { $strBezeichnung=$richtung['bezeichnung']; $strKurbez=$richtung['kurzbez']; } } return [$strBezeichnung,$strKurbez]; } ?>