Währe es nicht schön, wenn man auf einem Display (eines Raspberry Pi oä.), ähnlich wie am Flughafen alle Flugzeuge die in der Nähe sind, angezeigt bekommt. Dazu müsste erst ermittelt werden, welch Flugzeuge im Umkreis (Rechteck) vom Flughafen Hannover (oder jeder andere Ort) von ca. 20 km in der Luft und am Boden sind.
Die Daten können wir dann per Java/REST-Api von opensky-network.org kostenlos und ohne Anmeldung (Limitiations for anonymous (unauthenticated) users) abfragen. Dann werden die Daten alle 10 Sekunden aktuallisiert, und es sind max. 400 Aufrufe am Tag möglich. Mit Anmeldung (Limitations for OpenSky users) werden die Daten alle 5 Sekunden erneuert und es sind 4000 Aufrufe per Tag möglich. Bei einer Abfrage pro Minute haben wir 1440 Aufrufe pro Tag. Ohne Anmeldung könnten wir dann ca. alle 5 Minuten abfragen. Es geht für die Entwicklung/Test also auch erstmal ohne Anmeldung.
Zuerst müssen wir die Koordinaten ermitteln.Ein rechteckiger Bereich von 40 km rund um den Flughafen bedeutet, dass die Ausdehnung in jede Himmelsrichtung (Norden, Süden, Osten und Westen) 20 km beträgt. Um diesen Bereich zu berechnen, müssen wir die geografischen Koordinaten des Flughafens um diese Distanz erweitern. In diesem Bereich um den Flughafen (EDDV, HAJ) wollen wir alle Flugzeuge ermitteln, hier habe ich das Quadrat mal eingezeichnet.
Da der Abstand in Längengrad und Breitengrad abhängig von der geografischen Position ist, müssen wir den Längengrad und Breitengrad entsprechend umrechnen.
1 Breitengrad (Latitude) ≈ 111 km
1 Längengrad ≈ 111 km × cos(Breitengrad Hannover Flughafen) // also ergebnis = km * math.cos(math.radians(Breitengrad HAJ))
Für den Flughafen Hannover-Langenhagen (Breitengrad: 52.4611°) ergibt sich:
1 Längengrad ≈ 111 km × cos(52.4611°) ≈ 67,7 km
Die 20 km in jede Richtung sind:
Breitengrad (Latitude): 20 km / 111 km ≈ 0.18018°
Längengrad (Longitude): 20 km / 67.7 km ≈ 0.29548°
Berechnung der Ecken des Rechtecks:
Nordwest (NW):
Breitengrad: 52.4611 + 0.18018 = 52.64128
Längengrad: 9.6947 – 0.29548 = 9.39922
Nordost (NE):
Breitengrad: 52.64128
Längengrad: 9.6947 + 0.29548 = 9.99018
Südwest (SW):
Breitengrad: 52.4611 – 0.18018 = 52.28092
Längengrad: 9.39922
Südost (SE):
Breitengrad: 52.28092
Längengrad: 9.99018
Zusammenfassung der Ecken:
Nordwest: 52.64128, 9.39922
Nordost: 52.64128, 9.99018
Südwest: 52.28092, 9.39922
Südost: 52.28092, 9.99018
Die Dezimalwerte für die Grenzen des Rechtecks rund um den Flughafen Hannover-Langenhagen sind:
minLat: 52.2809
maxLat: 52.6413
minLon: 9.3992
maxLon: 9.9902
Diese Werte geben den minimalen und maximalen Breitengrad (Latitude) sowie den minimalen und maximalen Längengrad (Longitude) des rechteckigen Bereichs an. Jetzt brauchen wir noch ein Java-Programm, das die Abfrage mit den oben ermittelten Werten in der BoundingBox macht:
1 2 3 4 5 6 7 8 9 10 11 12 |
OpenSkyApi api = new OpenSkyApi(); OpenSkyStates os = api.getStates(0, null, new OpenSkyApi.BoundingBox(52.2809, 52.6413, 9.3992, 9.9902)); Collection<StateVector> states = os.getStates(); // Ergebnis formatieren System.out.println("Flugzeuge im Umkreis von 20 km von Hannover Flughaven (HAJ, EDDV):"); int i = 0; for (StateVector s : states) { String text = String.format("%d. %-10s %s aus %s SQUAWK: %s ICAO24: %s", ++i, s.getCallsign(), s.getGeoAltitude(), s.getOriginCountry(), s.getSquawk(), s.getIcao24()); System.out.println(text); } |
In Eclipse, würde das Ergebnis dann z.B. so aussehen, mit 3 Flugzeugen, zwei sind gerade gelandet und eins ist noch in der Luft:
1. PGT7Z Höhe: 1387 m aus Turkey SQUAWK: 7633 ICAO24: 4bc850
2. DMGSH Höhe: m aus Germany SQUAWK: 7000 ICAO24: 3fed70
3. CXI3SH Höhe: 0 m aus Malta SQUAWK: null ICAO24: 4d2278
oder es wird nur eins empfangen
1. CXI3SH Höhe: 1204 m aus Malta SQUAWK: 7612 ICAO24: 4d2278
alle anderen sind nicht in dem Bereich, wie das Bild zeigt:
Wer ein Python Programm dafür braucht, kann diese fluginfo.py erstellen:
1 2 3 4 5 6 7 8 9 10 11 |
#!/usr/bin/env python # Thomas Wenzlaff # Ausgabe rund um den HAJ Flughafen von 20km from opensky_api import OpenSkyApi api = OpenSkyApi() states = api.get_states(bbox=(52.2809, 52.6413, 9.3992, 9.9902)) for s in states.states: print("(%r, %r, %r, %r)" % (s.callsign, s.geo_altitude, s.origin_country, s.squawk)) |
Dafür muss, wie hier beschrieben einmalig die Lib installiert werden. Also einmal sudo python setup.py install ausführen, nachdem das Projekt mit
git clone https://github.com/openskynetwork/opensky-api.git
geholt wurde. Start dann mit python3 fluginfo.py
Ergebnis z.B.:
(‚THY26J ‚, None, ‚Turkey‘, ‚1000‘)
(‚CHX4 ‚, 129.54, ‚Germany‘, ‚4473‘)
Die Keys für die Ausgabe, sind dann etwas anders als für Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
keys = [ "icao24", "callsign", "origin_country", "time_position", "last_contact", "longitude", "latitude", "baro_altitude", "on_ground", "velocity", "true_track", "vertical_rate", "sensors", "geo_altitude", "squawk", "spi", "position_source", "category", ] |
Auf meinem Mac kommt noch eine Warnung:
1 2 |
/Library/Python/3.9/site-packages/urllib3-2.2.3-py3.9.egg/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020 warnings.warn( |
wie hier beschrieben.
Wie das nun noch auf einem Raspberry Pi auf einem Display ausgegeben werden kann, kommt in einem anderen Beitrag. Hatte ich schon mal vor 7 Jahren auf einem Arduino oder auch auf eine Pi mit OLED.