Auf der Suche nach RS41 Wettersonden des DWD mit Sondehub, AWS S3 und Python
Die Suche nach gelandeten Wettersonden vom DWD ist das S3 Bucket von Sondehub sehr hilfreich. Hier werden alle empfangenen Sondendaten dauerhaft archiviert. Eine perfekte Datenquelle für mein Vorhaben.
Schnell kam aber Ernüchterung auf: Jede Sonde hat eine einzigartige ID, d.h. es ist z.B. nicht möglich alle Starts eines Standorts mit einem Befehl zu extrahieren.
Dadurch wird das Vorhaben etwas aufwändiger.
Als erstes holen wir uns 26GB komprimierte Sondenstarts aus dem AWS S3 Bucket von Sondehub
# aws s3 --no-sign-request cp --recursive s3://sondehub-history/serial ./serial
Die Sonde ist nach dem Start die ersten 10-20 Minuten mit absoluter Sicherheit im Großraum Stuttgart, das ist die Grundlage für unser Geofencing.

Eckpunkte
- A: 48.876N, 8.984E
- B: 48.661N, 9.892E
- C: 48.669N, 9.524E
- D: 48.889N, 9.511E
Ausformuliert in Python
# Polygon covering Stuttgart to locate balloon start
coord_stgt = [(48.876, 8.984), (48.661, 9.892), (48.669, 9.524), (48.889, 9.511)]
poly_stgt = Polygon(coord_stgt)
Haben wir den Sondenstart gefunden, haben wir automatisch das Tracking-JSON des Ballonlaufes.
Aus den letzten x Datenpunkten lässt sich dann ein Track erzeugen.
for filename in os.listdir(directory_input):
file_abs_zipped = os.path.join(directory_input, filename)
# checking if it is a file
if os.path.isfile(file_abs_zipped):
# We have gzipped JSON files
with gzip.open(file_abs_zipped, 'r') as file_unzipped:
json_data = json.loads(file_unzipped.read().decode('utf-8'))
# Some files are missing json data fields
if 'lat' and 'datetime' and 'lon' in json_data[0] and len(json_data) > samples:
balloon_point = Point(float(json_data[0]['lat']), float(json_data[0]['lon']))
# Is the first GPS data within our geofenced area?
if balloon_point.within(poly_stgt):
ballon_path = kml.newlinestring(name=json_data[0]['datetime'])
# Build KML file for Google Earth
points = []
for i in range(samples*-1, -1, 1):
points.append([json_data[i]['lon'], json_data[i]['lat'], json_data[i]['alt']])
ballon_path.coords = points
ballon_path.altitudemode = simplekml.AltitudeMode.relativetoground
ballon_path.style.linestyle.width = 5
ballon_path.style.linestyle.color = simplekml.Color.yellowgreen
kml.save(kml_file)
Als Abschluss lässt sich hieraus ein KML-File zum Import in ein GIS erzeugen. Hier zwei Beispiele mit Google Earth.


Hier die nächste Ernüchterung:
Der Sender hört ca. 500m vor dem Aufschlag auf zu senden. Es wird also eine Prediktion auf Basis der letzten Daten benötigt.
Ob eine lineare Interpolation aussreichend ist, steht in den Sternen. Eine Windböe kann auch in niedrigen Schichten noch für eine große Änderung des Flugvektors sorgen. Schauen wir mal.