Seite anzeigenÄltere VersionenLinks hierherNach oben Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt. ====== 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 [[http://bulk.openweathermap.org/sample/city.list.json.gz|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: <code 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); echo "<pre>"; print_r ($arrData); echo "</pre>"; </code> Die Ausgabe sieht dann folgendermaßen aus: <code json> 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 ) </code> 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 ([[https://de.wikipedia.org/wiki/Beaufortskala|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. <code php> <?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> </code> * [[https://www.bankerheide.de/wetter/|Skript ausführen]] ===== Windstärke und Windrichtung ===== Die Ermittlung der Windstärke und der Windrichtung lässt sich sicherlich kürzer und eleganter lösen. <code php> <?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]; } ?> </code> openweathermap.txt Zuletzt geändert: 09.10.2022 18:58von whupfeld