{"id":21929,"date":"2024-09-27T19:00:06","date_gmt":"2024-09-27T17:00:06","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=21929"},"modified":"2024-09-21T18:17:54","modified_gmt":"2024-09-21T16:17:54","slug":"wie-koennen-alle-flugzeuge-im-umkreis-von-20-km-ermittelt-werden","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=21929","title":{"rendered":"Wie k\u00f6nnen alle Flugzeuge im Umkreis von 20 km ermittelt werden?"},"content":{"rendered":"<p>W\u00e4hre es nicht sch\u00f6n, wenn man auf einem Display (eines Raspberry Pi o\u00e4.), \u00e4hnlich wie am Flughafen alle Flugzeuge die in der N\u00e4he sind, angezeigt bekommt. Dazu m\u00fcsste 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.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/flugzeug-daten.mp4.gif\" alt=\"\" width=\"512\" height=\"288\" class=\"aligncenter size-full wp-image-21935\" \/><\/p>\n<p><!--more--><\/p>\n<p>Die Daten k\u00f6nnen wir dann per <a href=\"https:\/\/openskynetwork.github.io\/opensky-api\/\" rel=\"noopener\" target=\"_blank\">Java\/REST-Api<\/a> von <a href=\"https:\/\/opensky-network.org\" rel=\"noopener\" target=\"_blank\">opensky-network.org<\/a> 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\u00f6glich. Mit Anmeldung (Limitations for OpenSky users) werden die Daten alle 5 Sekunden erneuert und es sind 4000 Aufrufe per Tag m\u00f6glich. Bei einer Abfrage pro Minute haben wir 1440 Aufrufe pro Tag. Ohne Anmeldung k\u00f6nnten wir dann ca. alle 5 Minuten abfragen. Es geht f\u00fcr die Entwicklung\/Test also auch erstmal ohne Anmeldung.<\/p>\n<p>Zuerst m\u00fcssen wir die Koordinaten ermitteln.Ein rechteckiger Bereich von 40 km rund um den Flughafen bedeutet, dass die Ausdehnung in jede Himmelsrichtung (Norden, S\u00fcden, Osten und Westen) 20 km betr\u00e4gt. Um diesen Bereich zu berechnen, m\u00fcssen 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.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/20km-haj.png\" alt=\"\" width=\"3140\" height=\"2326\" class=\"aligncenter size-full wp-image-21930\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/20km-haj.png 3140w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/20km-haj-300x222.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/20km-haj-1024x759.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/20km-haj-768x569.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/20km-haj-1536x1138.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/20km-haj-2048x1517.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Da der Abstand in L\u00e4ngengrad und Breitengrad abh\u00e4ngig von der geografischen Position ist, m\u00fcssen wir den L\u00e4ngengrad und Breitengrad entsprechend umrechnen. <!--more--><\/p>\n<p>1 Breitengrad (Latitude) \u2248 111 km<br \/>\n1 L\u00e4ngengrad \u2248 111 km \u00d7 cos(Breitengrad Hannover Flughafen)  \/\/ also ergebnis = km * math.cos(math.radians(Breitengrad HAJ))<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-16.25.06.png\" alt=\"\" width=\"1158\" height=\"684\" class=\"aligncenter size-full wp-image-21936\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-16.25.06.png 1158w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-16.25.06-300x177.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-16.25.06-1024x605.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-16.25.06-768x454.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>F\u00fcr den Flughafen Hannover-Langenhagen (Breitengrad: 52.4611\u00b0) ergibt sich:<\/p>\n<p>1 L\u00e4ngengrad \u2248 111 km \u00d7 cos(52.4611\u00b0) \u2248 67,7 km<\/p>\n<p>Die 20 km in jede Richtung sind:<\/p>\n<p>Breitengrad (Latitude):  20 km \/ 111 km \u2248 0.18018\u00b0<br \/>\nL\u00e4ngengrad (Longitude):  20 km \/ 67.7 km \u2248 0.29548\u00b0  <\/p>\n<p>Berechnung der Ecken des Rechtecks:<br \/>\nNordwest (NW):<br \/>\n   Breitengrad: 52.4611 + 0.18018 = 52.64128<br \/>\n   L\u00e4ngengrad: 9.6947 &#8211; 0.29548 = 9.39922<br \/>\nNordost (NE):<br \/>\n   Breitengrad: 52.64128<br \/>\n   L\u00e4ngengrad: 9.6947 + 0.29548 = 9.99018<br \/>\nS\u00fcdwest (SW):<br \/>\n   Breitengrad: 52.4611 &#8211; 0.18018 = 52.28092<br \/>\n   L\u00e4ngengrad: 9.39922<br \/>\nS\u00fcdost (SE):<br \/>\n   Breitengrad: 52.28092<br \/>\n   L\u00e4ngengrad: 9.99018  <\/p>\n<p>Zusammenfassung der Ecken:<br \/>\nNordwest: 52.64128, 9.39922<br \/>\nNordost: 52.64128, 9.99018<br \/>\nS\u00fcdwest: 52.28092, 9.39922<br \/>\nS\u00fcdost: 52.28092, 9.99018  <\/p>\n<p>Die Dezimalwerte f\u00fcr die Grenzen des Rechtecks rund um den Flughafen Hannover-Langenhagen sind:<\/p>\n<p>minLat: 52.2809<br \/>\nmaxLat: 52.6413<br \/>\nminLon: 9.3992<br \/>\nmaxLon: 9.9902<\/p>\n<p>Diese Werte geben den minimalen und maximalen Breitengrad (Latitude) sowie den minimalen und maximalen L\u00e4ngengrad (Longitude) des rechteckigen Bereichs an. Jetzt brauchen wir noch ein Java-Programm, das die Abfrage mit den oben ermittelten Werten in der BoundingBox macht:<\/p>\n<pre class=\"lang:java decode:true \" >OpenSkyApi api = new OpenSkyApi();\r\nOpenSkyStates os = api.getStates(0, null, \r\n    new OpenSkyApi.BoundingBox(52.2809, 52.6413, 9.3992, 9.9902));\r\nCollection&lt;StateVector&gt; states = os.getStates();\r\n\r\n\/\/ Ergebnis formatieren\r\nSystem.out.println(\"Flugzeuge im Umkreis von 20 km von Hannover Flughaven (HAJ, EDDV):\");\r\nint i = 0;\r\nfor (StateVector s : states) {\r\n\tString text = String.format(\"%d. %-10s %s aus %s SQUAWK: %s ICAO24: %s\", ++i, s.getCallsign(), s.getGeoAltitude(), s.getOriginCountry(),        s.getSquawk(), s.getIcao24());\r\n\tSystem.out.println(text);\r\n}\r\n<\/pre>\n<p>In Eclipse, w\u00fcrde das Ergebnis dann z.B. so aussehen, mit 3 Flugzeugen, zwei sind gerade gelandet und eins ist noch in der Luft:<\/p>\n<p>1. PGT7Z       H\u00f6he: 1387 m aus Turkey SQUAWK: 7633 ICAO24: 4bc850<br \/>\n2. DMGSH       H\u00f6he:  m aus Germany SQUAWK: 7000 ICAO24: 3fed70<br \/>\n3. CXI3SH     H\u00f6he: 0 m aus Malta SQUAWK: null ICAO24: 4d2278<\/p>\n<p>oder es wird nur eins empfangen<\/p>\n<p>1. CXI3SH      H\u00f6he: 1204 m aus Malta SQUAWK: 7612 ICAO24: 4d2278<\/p>\n<p>alle anderen sind nicht in dem Bereich, wie das Bild zeigt:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-15.58.20.png\" alt=\"\" width=\"1330\" height=\"1020\" class=\"aligncenter size-full wp-image-21934\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-15.58.20.png 1330w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-15.58.20-300x230.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-15.58.20-1024x785.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/wenzlaff.de-2024-09-21-um-15.58.20-768x589.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Wer ein Python Programm daf\u00fcr braucht, kann diese <strong>fluginfo.py<\/strong> erstellen:<\/p>\n<pre class=\"lang:python decode:true \" >#!\/usr\/bin\/env python\r\n\r\n# Thomas Wenzlaff\r\n# Ausgabe rund um den HAJ Flughafen von 20km\r\n\r\nfrom opensky_api import OpenSkyApi\r\n\r\napi = OpenSkyApi()\r\nstates = api.get_states(bbox=(52.2809, 52.6413, 9.3992, 9.9902))\r\nfor s in states.states:\r\n    print(\"(%r, %r, %r, %r)\" % (s.callsign, s.geo_altitude, s.origin_country, s.squawk))<\/pre>\n<p>Daf\u00fcr muss, wie <a href=\"https:\/\/github.com\/openskynetwork\/opensky-api\/tree\/master\" rel=\"noopener\" target=\"_blank\">hier<\/a> beschrieben einmalig die Lib installiert werden. Also einmal <strong>sudo python setup.py install<\/strong> ausf\u00fchren, nachdem das Projekt mit <\/p>\n<p><strong>git clone https:\/\/github.com\/openskynetwork\/opensky-api.git <\/strong><\/p>\n<p>geholt wurde. Start dann mit <strong>python3 fluginfo.py<\/strong><\/p>\n<p>Ergebnis z.B.:<br \/>\n(&#8218;THY26J  &#8218;, None, &#8218;Turkey&#8216;, &#8218;1000&#8216;)<br \/>\n(&#8218;CHX4    &#8218;, 129.54, &#8218;Germany&#8216;, &#8218;4473&#8216;)<\/p>\n<p>Die Keys f\u00fcr die Ausgabe, sind dann etwas anders als f\u00fcr Java:<\/p>\n<pre class=\"lang:python decode:true \" >keys = [\r\n        \"icao24\",\r\n        \"callsign\",\r\n        \"origin_country\",\r\n        \"time_position\",\r\n        \"last_contact\",\r\n        \"longitude\",\r\n        \"latitude\",\r\n        \"baro_altitude\",\r\n        \"on_ground\",\r\n        \"velocity\",\r\n        \"true_track\",\r\n        \"vertical_rate\",\r\n        \"sensors\",\r\n        \"geo_altitude\",\r\n        \"squawk\",\r\n        \"spi\",\r\n        \"position_source\",\r\n        \"category\",\r\n    ]<\/pre>\n<p>Auf meinem Mac kommt noch eine Warnung: <\/p>\n<pre class=\"lang:default decode:true \" >\/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\r\n  warnings.warn(<\/pre>\n<p>wie <a href=\"https:\/\/github.com\/urllib3\/urllib3\/issues\/3020\" rel=\"noopener\" target=\"_blank\">hier<\/a> beschrieben.<\/p>\n<p>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 <a href=\"http:\/\/blog.wenzlaff.de\/?p=8277\" rel=\"noopener\" target=\"_blank\">Arduino<\/a> oder auch auf eine <a href=\"http:\/\/blog.wenzlaff.de\/?s=oled\" rel=\"noopener\" target=\"_blank\">Pi mit OLED<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W\u00e4hre es nicht sch\u00f6n, wenn man auf einem Display (eines Raspberry Pi o\u00e4.), \u00e4hnlich wie am Flughafen alle Flugzeuge die in der N\u00e4he sind, angezeigt bekommt. Dazu m\u00fcsste 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.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4,4931,79,1023],"tags":[6015,6016,1929,684,683,2178,6014,2714,1996,5380,2340,3929],"class_list":["post-21929","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-eclipse","category-planespotting","category-programmierung","category-raspberry-pi","tag-breitengrad","tag-display","tag-eddv","tag-flughafen","tag-haj","tag-java","tag-laengengrad","tag-oled","tag-phyton","tag-planspotter","tag-python","tag-rest-api"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21929"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21929\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21929"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}