Community • 25. Januar 2024

#30DayMapChallenge und die OpenWeatherMap.org-API

Bereits seit 2019 veranstaltet Topi Tjukanov im November jeden Jahres die 30DayMapChallenge. Die Idee und Herausforderung ist, jeden Tag im November eine Karte zu einem vorgegebenen Thema zu erstellen und unter dem Hashtag #30DayMapChallenge in den sozialen Medien (z.B. X, ehemals Twitter oder Mastodon) zu posten. Jedes Jahr nehmen Tausende mit ihren Karten an dem Wettbewerb teil und es gib sehr interessante und ausgefallene Werke zu bewundern.

Auch in 2023 habe ich mich wieder an der Challenge beteiligt und mit QGIS Karten zu den vorgegebenen Themen erstellt. Im folgenden Artikel beschreibe ich einige der von mir verwendeten QGIS-Techniken anhand zweier Karten; die eine zu aktuellen Wetterdaten und die andere zu einer Retro-Style Schatzinsel-Karte.

30DayMapChallenge, Tag 18, Thema "Atmosphere"

Die erste Karte greift auf die Live-Wetter-Daten der Plattform OpenWeatherMap über ein Application Programming Interface (API) zu und stellt die aktuellen Wetterdaten im Label eines Punktthemas (WhereGroup-Standorte) dar.

Um die Live-Wetter-Karte zu erstellen, benötigen wir eine eigene Python-Funktion für den API-Aufruf und die Verarbeitung der zurückgegeben Daten für den Ausdruckseditor. Anschließend kann man die JSON-Rückgabe bequem mit den Bordmitteln von QGIS im Ausdruckseditor auswerten.

Um auf die OpenWeatherMap.org-API zugreifen zu können, benötigen wir einen sogenannten API-Schlüssel, den man sich nach einmaliger Registrierung über die Seite https://home.openweathermap.org/api_keys generieren kann.

Für den API-Aufruf schreiben wir uns diesmal eine generische Funktion, die für beliebige GET-Aufrufe einer RESTful-API verwendet werden kann. Näheres zur Programmierung von eigenen Python-Funktionen für den QGIS Ausdruckseditor findet Ihr in unseren Blogartikeln "QGIS: Eigene Funktionen für den Ausdruckseditor erstellen" und "Netzwerkanfragen in PyQGIS richtig programmieren".

Die folgende Funktion kann für einen beliebigen GET-Aufruf an eine RESTful-API, die JSON als Ergebnis zurückliefert, verwendet werden:

from qgis.core import *
from qgis.gui import *
from PyQt5.QtNetwork import QNetworkRequest
from PyQt5.QtCore import QUrl
import json

@qgsfunction(args='auto', group='Custom')
def jsonfromurl(url, feature, parent):
    request = QNetworkRequest(QUrl(url))
    response = QgsNetworkAccessManager.instance().blockingGet(request)
    response_data = response.content()
    s = bytes(response_data).decode()
    data = json.loads(s)
    return data

Ein API-Aufruf für die OpenWeatherMap.org API hat die folgende Form:

http://api.openweathermap.org/data/2.5/weather?lat=47.902304&lon=8.107154&lang=de&units=metric&appid=abcdefg1234567

In den Parameter &appid= müsst Ihr dann Euren API-Schlüssel eintragen. Der Aufruf liefert ein JSON-Objekt mit den aktuellen Wetterdaten zu den angegeben Koordinaten, in diesem Beispiel für Hinterzarten im Schwarzwald:

{
 'coord': {
 'lon': 8.1072,
 'lat': 47.9023
 },
 'weather': [
  {
   'id': 800,
   'main': 'Clear',
   'description': 'Klarer Himmel',
   'icon': '01d'
  }
 ],
 'base': 'stations',
 'main': {
  'temp': 4.28,
  'feels_like': 4.28,
  'temp_min': 2.24,
  'temp_max': 6.14,
  'pressure': 1033,
  'humidity': 92
 },
 'visibility': 10000,
 'wind': {
 'speed': 0.55,
 'deg': 253,
 'gust': 0.76
 },
 'clouds': {
  'all': 2
 }, 'dt': 1702898808,
 'sys': {
  'type': 2,
  'id': 20163,
  'country': 'DE',
  'sunrise': 1702883533,
  'sunset': 1702913745
 },
 'timezone': 3600,
  'id': 6555747,
 'name': 'Hinterzarten',
 'cod': 200
}

Der Ausdruckseditor in QGIS bietet mit map_get und array_get alle notwendigen Funktionen, um auf die Elemente eines JSON-Strings zuzugreifen. Mit map_get greift man auf Dictionaries zu, also alles was in geschweiften Klammern steht und mit array_get auf Listen, also das was in eckigen Klammern geführt wird. Der folgende Ausdruck kann dabei direkt im Wertefeld im Layergestaltungswidget für eine Beschriftung verwendet werden:

with_variable('weather',
jsonfromurl('http://api.openweathermap.org/data/2.5/weather?
lat=' ||y(transform($geometry,layer_property(@layer,'crs'),'EPSG:4326')) ||
'&lon=' || x(transform($geometry,layer_property(@layer,'crs'),'EPSG:4326')) ||  
'&lang=de' ||  '&appid=abcdefg1234567&units=metric'),
'Aktuell: '  ||  map_get(array_get(map_get(@weather, 'weather'),0),'description') || '\n'  || 'Temp.: '  || map_get(map_get(@weather, 'main'),'temp') || '°C' )

Den API-Aufruf setzen wir im Ausdruckseditor dynamisch zusammen, so dass für jedes Objekt unseres Punktlayers das ortsspezifische Wetter abgefragt werden kann. Mit der folgenden Funktion

werden die Koordinaten des aktuellen Layers automatisch in das Koordinatensystem WGS84 (EPSG 4326) transformiert und dem API-Aufruf übergeben.

y(transform($geometry,layer_property(@layer,'crs'),'EPSG:4326'))

Das Ergebnis des API-Aufrufs landet in der Variable @weather und kann dann mit der nächsten Funktion ausgewertet werden.

map_get(map_get(@weather, 'main'),'temp')

map_get nimmt als Argumente das JSON-Objekt und einen Schlüsselwert, also z.B. 'temp' um den aktuellen Temperaturwert aus dem Bereich 'main' auszulesen, daher also die Verschachtelung zweier map_get.

30DayMapChallenge, Tag 11, Thema "Retro - A blast from the past"

Diese Treasure-Island-Map verwendet einige interessante Visualisierungstechniken von QGIS, um die dargestellten Effekte zu erzielen; unter anderem den Geometry-Generator, Shapeburst-Füllung, datendefinierte Übersteuerungen, Rasterfüllungen und Blending-Modes. Das folgende Video zeigt uns die Entstehung der Schatzinsel. Das zugehörige QGIS-Projekt könnt Ihr hier downloaden.

Fazit

Auch im Jahr 2023 hat es mir wieder Freude bereitet, mich der Herausforderung zu stellen. Dieses Jahr habe ich erstmals an allen 30 Themen teilgenommen und unterschiedliche thematische Karten zu den vorgegebenen Themen erstellt bzw. aus meinem eigenen Fundus bereitgestellt. Ein Blick auf die Kreationen der anderen Teilnehmerinnen und Teilnehmer hat nicht nur Inspiration, sondern auch neue Erkenntnisse darüber gebracht, was man mit Karten alles zeigen und erläutern kann. Das Motto für 2024 lautet daher: "Stay tuned" – es bleibt spannend.

Stefan Giese

Stefan Giese ist Diplom-Geologe und seit 2016 als GIS-Consultant und QGIS-Trainer bei der WhereGroup tätig. Er lebt und arbeit in Freiburg im Breisgau und beschäftigt sich neben seiner Arbeit bei der WhereGroup mit der geophysikalischen Erkundung von archäologischen Bodendenkmälern.

Artikel teilen: