Mit PHP Aktuelle Wetterdaten beziehen und verarbeiten

Für eines meiner privaten WindowsPhone-Projekte brauchte ich die Wetterdaten für die aktuelle Position des Users. Da Google seine (ohnehin nie wirklich offen kommunizierte) Wetter-API eingestellt hat, musste ich mich nach  kostenlosen und vor allem verlässlichen Alternative umsehen.  Ich wurde fündig :)

Wetterdaten per Geo-Position beziehen

Mein Vorhaben: Die WindowsPhone-App sendet Längen- und Breitengrad an meinen Server, und dieser zieht die Wetterdaten von der API.
Doch:

Wo kann ich kostenlos Wetterdaten per API bekommen?

Welche Wetter-API ist (für meinen Anwendungsfall) die beste? Und welche darf ich kostenlos nutzen?

Ich habe mich für die API von OpenWeatherMap.org [API] entschieden. Diese ist schnell, einfach und gibt sehr schön strukturierte Daten aus.

Für den Abruf der Wetterdaten benötigt man auch bei OpenWeatherMap einen API Key, der kostenlos verfügbar ist. Dazu muss man sich nur bei OpenWeatherMap registrieren.

Mit PHP die OpenWeatherMap.org-API – Wetterdaten abrufen

Ich habe dazu entschieden, den Abruf der Wetterdaten mit PHP zu realisieren. Die App sendet die Positionsdaten der User bereits an mich, deswegen kann ich auch gleich die aktuellen Wetter-Informationen zurück geben. Man könnte natürlich auch direkt aus der App heraus die Wetter-API ansprechen.

Wir starten unseren API-Aufruf mit den uns übergebenen Längen- und Breitengraden, in diesem Fall für meine Heimatstadt Lemgo

$lat = “52.0277”; $lng = “8.9043”;

Wir starten mit curl die API-Abfrage

class Wx {
    private $apiKey = "DEIN-API-KEY";
    public function getWeather($lat = null, $lng = null) {
        $data = new stdClass();
        if(!is_null($lat) && !is_null($lng)) {
            try {
                $url = 'http://api.openweathermap.org/data/2.5/weather?lat='.$lat.'&lon='.$lng.'&APPID='.$this->apiKey;
                $ch = curl_init();
                $timeout = 5;
                curl_setopt($ch,CURLOPT_URL,$url);
                curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
                curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
                $data = curl_exec($ch);
                $data = json_decode(utf8_encode($data));
                if($data->cod != "200") {
                    $data->error = "Failed retrieving weather data.";
                } else {
                    $res = $data->current_condition;
                    $main = $data->main;
                    $wind = $data->wind;
                    $data->tempC = round(($main->temp -273.15), 0);
                    $data->tempF = round(((($data->tempC * 9 ) / 5) + 32) ,0);
                    $data->pressure = $main->pressure;
                    $data->ws_miles = $wind->speed;
                    $data->ws_kts = round($data->ws_miles * 0.868976242, 0);
                    $data->winddirDegree = round($wind->deg);
                    $data->visibility = $res->visibility; // In Kilometer
                }

            } catch(Exception $ex) {
                $data->error = $ex->getMessage();
            }

        } else {
            $data->error = "Latitude and Longitude must be provided";
        }
        return $data;
    }
}

Ausgaben auf Deutsch

Für meine Zwecke benötige ich die Ausgaben auf Englisch. Wer jedoch die deutsche Ausgabe der API-Informationen bevorzugt, kann durch den URL-Parameter &lang=de die Sprache festlegen.

Aktuelle Wetterdaten in PHP weiterverarbeiten

Wir bekommen von OpenWeatherMap.org eine JSON-Ausgabe mit dem aktuellen Wetter. Soll heißen: Wenn denn der übergebene Ort gefunden wurde. Doch das checken wir gleich.

Als erstes nehme ich die erhaltenen Informationen und hetze sie durch json_decode, um ein Objekt mit allen Daten zu erhalten. Ich arbeite lieber mit JSON als mit XML, aber das ist eine persönliche Vorliebe.
Jedem so, wie er es mag :) XML-Output ist natürlich auch möglich, indem man als Aufruf-Parameter mode=xml  übergibt.

Wir haben nun also die Daten im JSON-Format vorliegen und müssen prüfen, welchen Status-Code uns die API liefert. Denn wenn ein Ort nicht gefunden wurde, gibt es einen 404-Code, wenn alles OK ist einen 200. Dieser Wert steht in $data->cod

Umrechnung der API-Daten aus Grad Kelvin in gängigere Formate

Und dort haben wir nun auch gleich noch die für mich wichtigen einzelnen Felder aufgeschlüsselt bzw. die Temperaturen in Grad Celsius sowie Grad Fahrenheit berechnet. Ich muss die Temperaturen berechnen, da uns die API die Temperatur als Grad Kelvin übergibt.

Die gesamte Ausgabe mit print_r($wxData)  inklusive der berechneten Werte sieht folgendermaßen aus:

stdClass Object
(
    [coord] => stdClass Object
        (
            [lon] => 8.9
            [lat] => 52.03
        )

    [weather] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 300
                    [main] => Drizzle
                    [description] => light intensity drizzle
                    [icon] => 09d
                )

            [1] => stdClass Object
                (
                    [id] => 741
                    [main] => Fog
                    [description] => fog
                    [icon] => 50d
                )

        )

    [base] => cmc stations
    [main] => stdClass Object
        (
            [temp] => 276.63
            [pressure] => 1027
            [humidity] => 93
            [temp_min] => 274.15
            [temp_max] => 277.65
        )

    [wind] => stdClass Object
        (
            [speed] => 1.5
            [deg] => 10
        )

    [clouds] => stdClass Object
        (
            [all] => 90
        )

    [dt] => 1458029102
    [sys] => stdClass Object
        (
            [type] => 1
            [id] => 4951
            [message] => 0.004
            [country] => DE
            [sunrise] => 1458020225
            [sunset] => 1458063004
        )

    [id] => 2878943
    [name] => Lemgo
    [cod] => 200
    [tempC] => 3
    [tempF] => 37
    [pressure] => 1027
    [ws_miles] => 1.5
    [ws_kts] => 1
    [winddirDegree] => 10
    [visibility] => 
)

Reverse Geocoding ohne Google

Außerdem noch sehr erwähnenswert: OpenWeatherMap.org gibt für die übergebenen lat/lng-Werte den Namen des Ortes zurück! In diesem Fall haben wir [name] => Lemgo – also ein Reverse Geocoding ohne Google :D

Fazit

Ziemlich simpel. Aber das Schwierige war ja, eine passende API zu finden.

Ich hoffe, dass ich hiermit zumindest ein paar Leuten helfen konnte, die auch auf der Suche nach einer schönen, schnellen Wetter-API sind.

 

 

Veröffentlicht von

Christian Hänsel

Web-Entwickler, Experte für technisches SEO. ich liebe meinen Job, meine Familie und den Libanon. Fragen? Mail: chris@haensel.pro.

6 Gedanken zu „Mit PHP Aktuelle Wetterdaten beziehen und verarbeiten“

  1. Hallo Christian,

    Keine Ahnung wie aktuell das bei dir noch ist. Aber hier kannst du dich ebenfalls in Sachen Wetterdaten etc. bestens austoben:

    https://api.meteomatics.com

    Die Meteomatics API bietet neben aktuellen, historischen und VorhersageDaten auch den Zugang zu Vorhersagen basierend auf verschiedenen Wettermodellen, Radar-, Blitz- und Satellitendaten an und entsprechende Connectoren für verschiedene Programmiersprachen (inkl. PHP, Python, R, Matlab etc.)

    Viel Spaß und viele Grüße
    Martin

  2. Schönes Beispiel – gut erklärt. Für ein eigenes Projekt suche ich derzeit etwas in diesem Bereich – idealerweise aber mit Angabe des Ortes als Basis. Lässt sich das mit der API ebenfalls umsetzen? Oder gibt es Dienste, die aus einer Ortsangabe der Geodaten machen?

      1. Vielen Dank, das klingt vielversprechend! Nun muss ich nur noch meine XML-Skills auffrischen, um die Daten passend zu verarbeiten und aufzubereiten …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.