Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| schule-suchen [09.10.2022 18:56] – angelegt whupfeld | schule-suchen [08.12.2025 08:09] (aktuell) – whupfeld | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== | + | ====== |
| - | 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. | + | [[https:// |
| - | Ü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. | + | * https:// |
| - | ===== API ===== | + | Das [[https:// |
| - | 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:// | + | Die Daten werden in Form von CSV- oder XML-Dateien zur Verfügung gestellt, es existiert keine API zum Abruf der Daten. |
| - | 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: | + | Die Idee war, diese Daten in einer Webapplikation so zur Verfügung zu stellen, dass sich komfortable nach einzelnen Schulen suchen lässt, aber auch die Schulen einer Gemeinde oder Stadt angezeigt werden können. |
| - | http://samples.openweathermap.org/data/2.5/ | + | Entstanden ist dabei eine [[https://de.wikipedia.org/wiki/Single-Page-Webanwendung|Single-Page-Webanwendung]] (SPA) auf Basis von Angular JS. Die Restschnittstelle wurde mit PHP programmiert. |
| - | Als Parameter mitgeliefert wird die '' | + | ===== Aufbau |
| - | ===== Ermitteln der Stadt-Id ===== | + | Die Schuladressen werden in einer Tabelle geliefert, wobei die einzelnen Attribute |
| - | Es gibt eine vollständige Liste mit allen Städte-IDs zum [[http:// | + | |
| - | ===== 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 = " | ||
| - | $data = file_get_contents($url); | ||
| - | $arrData = json_decode($data, | ||
| - | echo "< | ||
| - | </ | ||
| - | 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 | ||
| - | ) | ||
| - | ) | + | ==== Datenstruktur |
| - | [base] | + | |
| - | [main] | + | |
| - | ( | + | |
| - | [temp] | + | |
| - | [pressure] | + | |
| - | [humidity] | + | |
| - | [temp_min] | + | |
| - | [temp_max] | + | |
| - | ) | + | |
| - | [visibility] | + | |
| - | [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. | + | Bei der Datenstruktur wurde bewusst auf Constrains verzichtet, da diese beim Einlesen Probleme bereiteten. Das ist keine ganz saubere Lösung, hat aber noch keine Probleme verursacht. |
| - | ===== Umsetzung mit PHP ===== | + | |
| - | Die Umsetzung | + | |
| - | Da die Windrichtung ebenfalls nur in Grad angegeben wird, habe ich dort zusätzlich eine Prozedur '' | + | * [[create_schuladressen.sql|Datenbankdefinition]] |
| - | <code php> | ||
| - | <?php | ||
| - | /* ********************************************************************* | + | ==== Script zum Einlesen der Daten ==== |
| - | * Walter Hupfeld - created 18.02.2018 | + | |
| - | * Auslesen von OpenWeather-Daten | + | |
| - | * ********************************************************************* */ | + | |
| - | + | ||
| - | require(" | + | |
| - | + | ||
| - | $url = " | + | |
| - | $data = file_get_contents($url); | + | |
| - | $arrData | + | |
| - | $numTemp = | + | Die Anwendung zum Einlesen der Daten besteht aus drei Skripten. In der [[refresh/ |
| - | $numHumidity = $arrData[' | + | |
| - | $numPressure = $arrData[' | + | |
| - | $numTempMax = round($arrData[' | + | |
| - | $numTempMin = round($arrData[' | + | |
| - | + | ||
| - | $strSunrise = date(" H:i", $arrData[' | + | |
| - | $strSunset = date(" H:i", $arrData[' | + | |
| - | $numWind = $arrData[' | + | * [[refresh/ |
| - | | + | |
| - | | + | |
| - | $numWindDirection | + | ===== Die REST-Schnittstelle |
| - | $strWindDescription | + | |
| - | ?> | + | |
| - | < | + | |
| - | <html lang=" | + | |
| - | < | + | |
| - | <meta charset=" | + | |
| - | <meta name=" | + | |
| - | <meta http-equiv=" | + | |
| - | < | + | |
| - | <!-- Latest compiled and minified CSS --> | + | |
| - | <link rel=" | + | |
| - | < | + | |
| - | .maintemp {font-size: | + | |
| - | .icon {margin-bottom: | + | |
| - | .weather {width: | + | |
| - | .weatherdesc {font-size: | + | |
| - | </ | + | |
| - | </ | + | |
| - | < | + | |
| - | <div class=" | + | |
| - | < | + | |
| - | <img class=" | + | |
| - | <span class=" | + | |
| - | <!-- <?= $arrData[' | + | |
| - | <p class=" | + | |
| - | < | + | |
| - | <table class=" | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | <? | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | < | + | Die [[https://de.wikipedia.org/wiki/Representational_State_Transfer|REST]]-Schnittstelle liefert die Daten per [[https:// |
| - | </ | + | |
| - | </ | + | ==== Suchfunktionen ==== |
| - | </ | + | |
| - | </ | + | |
| - | * [[https:// | ||
| - | ===== Windstärke | + | Es werden für die Applikation zwei Suchfunktionen verwendet, einmal die Suche nach einer Schule. Das Skript [[ajax/ |
| - | Die Ermittlung | + | |
| - | <code php> | + | Das Skript [[ajax/search_gemeinden.php|search_gemeinden.php]] sucht in der Gemeindetabelle |
| - | <?php | + | |
| - | /* ********************************************************************* | + | |
| - | * | + | |
| - | * Walter Hupfeld - created 18.02.2018 | + | |
| - | * Windstärkenskala | + | |
| - | * | + | |
| - | * ********************************************************************* */ | + | |
| - | $arrBeaufort = array ( | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | ); | ||
| - | |||
| - | function getBeaufort($numV) { | ||
| - | global $arrBeaufort; | ||
| - | $strDescription=""; | ||
| - | $numSpeeds=0; | ||
| - | foreach ($arrBeaufort as $wind) { | ||
| - | if ($wind[' | ||
| - | $strDescription = $wind[' | ||
| - | $numSpeeds = $wind[' | ||
| - | } else break; | ||
| - | } | ||
| - | return [$strDescription, | ||
| - | } | ||
| + | * [[ajax/ | ||
| + | * [[ajax/ | ||
| + | |||
| + | ==== Schuldaten ==== | ||
| + | Das Skript [[ajax/ | ||
| + | |||
| + | Im Datensatz ist auch eine **Georeferenzierung** der Schule enthalten, leider nicht in Längen- und Breitengraden, | ||
| + | |||
| + | * [[ajax/ | ||
| + | * [[ajax/ | ||
| + | |||
| + | ==== Gemeinden ==== | ||
| + | |||
| + | Das Skript [[ajax/ | ||
| + | |||
| + | |||
| + | * [[ajax/ | ||
| + | * [[ajax/ | ||
| + | |||
| + | ==== Weitere Daten ==== | ||
| + | Es gibt zwei weiter Skripte, Das erste liest das Kursangebot in der Gymnasialen Oberstufe aus, das zweite Daten zu Bilingualen Angeboten an Schulen, die ebenfalls vom MSB angeboten werden. | ||
| + | |||
| + | * [[ajax/ | ||
| + | * [[ajax/ | ||
| + | |||
| + | ===== Die Applikation ===== | ||
| + | Die [[https:// | ||
| + | |||
| + | Neben AngularJS wurden noch Bootstrap 4 als Javascript-Framwork und [[http:// | ||
| + | |||
| + | * [[schulesuchen/ | ||
| + | * [[schulesuchen/ | ||
| + | |||
| + | Gerade bei der Zusammenarbeit mit Leaflet gibt es einige Probleme, die ich nicht alle zufriedenstellend lösen konnte. Es gibt auch einen Fehler bei der Aktualisierung der Kursangebote. | ||
| - | $arrWindrichtung | + | ===== Download |
| - | [" | + | |
| - | [" | + | |
| - | [" | + | |
| - | [" | + | |
| - | [" | + | |
| - | [" | + | |
| - | [" | + | |
| - | [" | + | |
| - | [" | + | |
| - | ); | + | |
| - | function getWindrichtung($numDirection) { | ||
| - | global $arrWindrichtung; | ||
| - | $strBezeichnung=""; | ||
| - | $strKurbez=""; | ||
| - | foreach ($arrWindrichtung as $richtung) { | ||
| - | if ($richtung[' | ||
| - | $strBezeichnung=$richtung[' | ||
| - | $strKurbez=$richtung[' | ||
| - | } | ||
| - | } | ||
| - | return [$strBezeichnung, | ||
| - | } | ||
| - | ?> | + | Das Projekt liegt auf Github zum Download bereit: https:// |
| - | </code> | + | |