Auf der Suche nach RS41 Wettersonden des DWD mit Sondehub, AWS S3 und Python

 Date: September 6, 2021

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.

Geofencing um Stuttgart
Geofencing um Stuttgart

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.

3D-Ansicht eines Fluges
3D-Ansicht eines Fluges
Diverse Abflüge der Stuttgarter Starts
Diverse Abflüge der Stuttgarter Starts

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.


Previous
⏪ Working portable from the western coast of Spain

Next
Eine kompakte Empfangsbox für RS41-Wettersonden und LoRa-APRS ⏩