15. Wetterdaten

Das Modul weather stellt Befehle zur Verfügung, mit welchen Browserabfragen von Wetterdaten auf dem Wetterdatenserver https://openweathermap.com durchgeführt werden können. Der Wetterdatenserver sammelt die Wetterdaten in über 200 000 Städten der ganzen Welt und aktualisiert sie jede Stunde. Folgende Daten können abgefragt werden:

"temp"

Temperatur in °C

"pressure"

Luftdruck in hPa

"humidity"

Luftfeuchtigkeit in %

"temp_min"

Tagesminimum der Temperatur

"temp_max"

Tagesmaximum der Temperatur

"description"

Wetterlage in Worten

"sunrise"

Sonnenaufgang in Ortszeit

"sunset"

Sonnenuntergang in Ortszeit

"datetime"

Datum und Zeit des Ortes

Die Informationen aus dem Internet können angezeigt oder grafisch dargestellt werden.

Beispiel 1: Temperatur und Feuchtigkeit anzeigen
Der Befehlt weather.request(city, key) macht einen Wetterdaten-Request bei http://openweathermap.org für den gegebenen Ort. Dabei wird ein Authorisierungsschlüssel verwendet. Diesen kann man kostenfrei auf diesem Host beziehen. Wird der Parameter key weggelassen, so wird der Standardschlüssel (defaultKey) verwendet, der maximal 60 Anfragen pro Minute erlaubt.

Im ersten Beispiel wird alle 5 Sekunden die aktuelle Temperatur und Luftfeuchtigkeit in Bern (und beliebigen anderen Städten) abgefragt und im Ausgabefenster angezeigt. Dabei wird der defaultKey verwendet.

import weather
from time import sleep

city = "Bern, CH"
#city = "Zuerich, CH"
#city = "Lugano, CH"
#city = "Geneve, CH"
#city = "Paris, FR"
#city = "London, GB"
#city = "Rome, IT"
#city = "Athens, GR"

while True:
     info = weather.request(city)
     print("temp =", info["temp"], "   humidity =", info["humidity"], "%")
     sleep(5)
► In Zwischenablage kopieren

Erklärungen zum Programmcode:

import weather: Importiert das Modul weather

weather.request(city): Wetterabfrage mit dem Standardschlüssel

sleep(5): Die Abfrage erfolgt alle 5 Sekunden, wobei die Daten auf dem Wetterserver in der Regel nur einmal pro Stunde aktualisiert werden.

Beispiel 2: Daten vom Wetterserver mit GPanel grafisch darstellen
Mit Hilfe der Funktion drawGrid() (siehe Kapitel Grafen und Diagramme) kann man die Daten aus dem Internet mit einigen wenigen Programmzeilen grafisch darstellen. Um die Funktionalität des Programms zu testen, wird die Temperaturwert jede Sekunde abgefragt. Da die Umgebungstemperatur nicht so schnell ändert, genügt es, den aktuellen Wert nur einmal pro Stunde abzufragen (delay(360000)). Im Grafikfenster werden jeweils 50 Werte angezeigt, danach wird die Grafik gelöscht und die Anzeigen beim Wert x = 0 fortgesetzt.

import weather
from gpanel import *

makeGPanel(-5, 53, -3, 52)
drawGrid(0, 50, 0, 50, "gray")
setColor("blue")
lineWidth(2)

x = 0
while True:
     info = weather.request("Bern, CH")
     #info = weather.request("Paris, FR")
     temp = info["temp"]
     if x == 0:
         pos(x, temp)
     else:
         draw(x, temp)          
     print(temp)
     x = x + 1 
     if x == 50:
         x = 0  
         clear()
         drawGrid(0, 50, 0, 50, "gray")              
     delay(1000)
► In Zwischenablage kopieren
 



Erklärungen zum Programmcode:

weather.request("Bern, CH"): Aktuelle Daten für Bern werden mit einem defaultKey abgefragt
if x == 50: Nach 50 Werten beginnt die Aufzeichnung wieder am linken Rand des Grafikfensters
delay(1000): Entspricht sleep(1) aus dem Modul time. Das Programm wartet eine Sekunde.


Beispiel 3: Alle Wetterserver-Daten abfragen
Im Ausgabefenster werden alle Daten vom Wetterserver für die gegebene Stadt angezeigt.

import weather
    
city = "London"
info = weather.request(city)
print("Aktuelle Wetterdaten:", city, "\n"
      "---------------------------------------", "\n"
      "Temperatur =      ", info["temp"], "°C" "\n"
      "Luftdruck =       ", info["pressure"], "hPa", "\n"
      "Feuchtigkeit =    ", info["humidity"], "%", "\n"
      "Temeratur min =   ", info["temp_min"], "°C", "\n"
      "Temeratur max =   ", info["temp_max"], "°C", "\n"
      "Wetterlage =      ", info["description"], "\n"
      "Sonnenaufgang =   ", info["sunrise"], "\n"
      "Sonnenuntergang = ", info["sunset"], "\n"
      "-----------------------------------------") 
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

print("Aktuelle Wetterdaten", "\n"): Um eine Zeilenschaltung im Print-Befehl hinzufügen, verwendet man "\n". Diese Zeichenfolge wird jeweils am Ende der Zeile hinzugefügt.


Beispiel 4: Wetterkarte
Die aktuelle Wetterlage info("description") kann auch mit einer Wetterkarte veranschaulicht werden. Für die Darstellung in einem GPanel-Fenster können folgende Wetter-Symbole verwendet werden:

sunny.png lightcloudy.png mostlycloudy.png cloudy.png rain.png strongrain.png snow.png

Diese Bilder und eine einfache Schweizerkarte können Sie unter sprites.zip herunterladen. Packen Sie diese zip-Datei aus und speichern Sie den Ordner sprites im Unterverzeichnis /bin des TigerJython-Installationsverzeichnisses. Dann werden diese Bilder mit dem Befehle image("sprites/bild.png", x, y) an der Position (x, y) eingefügt. Falls Sie eine andere Landeskarte brauchen oder weitere Wetterbilder verwenden möchten, können Sie diese im gleichen Unterverzeichnis /bin/sprites des Installationsverzeichnisses.

from gpanel import *
import weather

def drawWeather(city, x, y):
    info = weather.request(city)    
    if info["description"] == "clear sky":
        image("sprites/sunny.png", x, y)
    elif info["description"] in ["few clouds", "scattered clouds"]:
        image("sprites/lightcloudy.png", x, y) 
    elif info["description"] in ["broken clouds"]:
        image("sprites/mostlycloudy.png", x, y)    
    elif info["description"] in ["overcast clouds", "fog"]:
        image("sprites/cloudy.png", x, y) 
    elif info["description"] in ["rain", "light rain", "moderate rain"]:
        image("sprites/rain.png", x, y) 
    elif info["description"] in ["heavy intensity shower rain"]:
        image("sprites/strongrain.png")    
    elif info["description"] in ["snow", x, y]:
        image("sprites/snow.png")
        
def printWeather(city):
    info = weather.request(city)
    print(city, ": temp =",info["temp"],", humidity =",info["humidity"],"%")        

cities= [["genf",25,85],["Lausanne",135,150],["Bern",235,270],["Basel",280,420],["Luzern",400,290],
        ["Zuerich",430,390],["Winterthur",460,410],["Chur",600,230],["Lugano",500,30]]
             
makeGPanel(Size(800, 550))
window(0, 800, 0, 550)
image("sprites/ch.gif", 0, 0)
for city in cities:
    drawWeather(city[0], city[1], city[2])
    printWeather(city[0])
► In Zwischenablage kopieren

Erklärungen zum Programmcode:

makeGPanel(Size(800, 550)) Die Grösse des GPanel-Fensters entspricht der Grösse des Schweizerkarte-Bildes.
window(0, 800, 0, 550) setzt die Koordinaten so, dass (0, 0) in der linken unteren Ecke des Bildes ist.
Die Schweizerkarte wird mit image("sprites/ch.gif", 0, 0) im GPanelfenster dargestelltt.
image("sprites/sunny.png", x, y) stellt das Bild sunny.png an der Position x, y dar
def drawWeather(city, x, y) Um das Programm zu vereinfachen, definiert man eine Funktion mit den Parametern citx, x, y, die für alle Elemente der Liste cities das passende Wetter-Symbol darstellt.


 


Aufgaben: Serie 15

1)

Öffne mit einem beliebigen Browser die Website https://openweathermap.com. Erstelle einen kostenfreien Authorisierungsschlüssel. Falls es geklappt hat, gib diesen Schlüssel im Abfragebefehl in Anführungszeichen ein
(z.B.: weather.request("city", "babc785da854bb3d758e1f26ed837768")
und erstelle eine Abfrage für dei Temparatur, Luftdruck und die Wetterlage in Paris.

 

2)

Stelle die Luftfeuchtigkeit in einer beliebigen Stadt mit GPanel grafisch dar. Verwende das Beispiel 2 als Vorlage und passe die y-Achse entsprechend an.

 

3)

Ergänze das Beispiel 3 mit einer Input-Dialog Box, in der abgefragt wird, ob man die Daten aktualisieren soll. Falls der Benutzer eine Aktualisierung wünscht, werden die Daten erneut angezeigt, sonst wird das Programm beendet.

 

4)

Ergänze das Beispiel 4 mit weiteren Städten. Die Koordinaten kannst du durch "probieren" bestimmen. Dabei kannst du das unten stehende Programm verwenden. Bei jedem Mausklick in der Schweizerkarte werden die Koordinaten im Ausgabefenster angezeigt.

from gpanel import *

def onMousePressed(x, y):
    print(x, y)   

makeGPanel(Size(800, 550),mousePressed = onMousePressed)
window(0, 800, 0, 550)
image("sprites/ch.gif", 0, 0)