Vluchtdata analyseren met Opensky
Waar je gratis vluchtdata kunt vinden en hoe je ze in kunt zetten voor journalistiek onderzoek.
Ok, dit is een onderwerp waarbij we denk ik de journalistieke relevantie even moeten uitleggen. Want vluchtdata, die zijn toch vooral voor bezorgde ouders die willen kijken of het vliegtuig van hun kind al is geland, of voor chemtrails-adepten?
Niet per se. Zo kun je met deze data in kaart brengen wat de milieuschade is van de privéjets van publieke personen. Of kijken hoe vaak het bijna mis gaat op de landingsbaan. Zelf schreef ik ooit over de wapentransporten richting Oekraïne, die bijna allemaal via hetzelfde vliegveld binnenkomen.
Publieke data
Want ook die wapentransporten zijn te volgen. Dat komt door ADS-B, een systeem waarmee vliegtuigen hun locatie door kunnen geven. Iedereen met een geschikte ontvanger kan die data binnenhalen, niet alleen vliegvelden en andere partijen waarvan je het zou verwachten. Sites als Flightradar24 en het (betere) alternatief ADS-B exchange halen hun data uit een enorm netwerk van zulke ontvangers.
Naast ADS-B zenden sommige vliegtuigen ook uit via Mode-S. Meestal zijn dit militaire toestellen, of oude roestbakken zonder veel moderne apparatuur aan boord. Ook die zijn te tracken.
Welke vliegtuigen er op dit moment in de lucht hangen is met de bovengenoemde tracking-sites vrij gemakkelijk. Interessanter wordt het wanneer we historische data gaan binnenhalen en analyseren.
Historische data: voor wat hoort wat
Historische data zijn niet te bekijken via tracking-sites, maar ze zijn er wel. Een aantal partijen die zo’n netwerk aanbieden, slaan de data ook op. Hierbij maken ze meestal gebruik van een “voor wat hoort wat”-constructie, waarbij je toegang krijgt tot deze data wanneer je zelf een kastje ophangt om de vluchten te tracken.
Zo’n kastje is niet duur en kan een leuk hobbyproject zijn. Maar als journalist kun je ook op andere manieren toegang krijgen tot historische ADS-B-data. De makkelijkste manier is via Opensky, een non-profitorganisatie die een API aanbiedt waarvan journalisten en onderzoekers gratis gebruik kunnen maken. Daarvoor moet je jezelf wel even aanmelden en laten weten waarvoor je de data wilt gebruiken. Dat kan hier.
Mocht je de data van Opensky gebruiken in een productie, vergeet dan niet om ze te vermelden. En overweeg, zeker als het gaat om een grotere media-organisatie, een donatie of het installeren van een kastje.
Callsign en ICAO
Voordat we in de data duiken even een kort technisch lesje over het identificeren van vliegtuigen. Op jouw vliegtuig staat meestal een vluchtnummer vermeld, maar dat is meestal niet zo handig om een bepaald toestel te tracken. Dat kan immers meerdere routes vliegen.
Daarom gebruiken we meestal een callsign of het ICAO-nummer. Het eerste zie je vaak staan op de zijkant van een vliegtuig, naast de vlag van het land van registratie. Meestal is het een simpel rijtje letters/cijfers als YR-BGI. Het ICAO-nummer is iets langer en is het unieke identificatienummer bij de internationale luchtvaartorganisatie (IACO). Het tweede is ietsjes universeler en dus beter om te gebruiken bij het opzoeken van specifieke toestellen.
De data gebruiken
Wanneer je toegang is goedgekeurd, kun je op verschillende manieren toegang krijgen tot de historische database. Opensky heeft hier zelf een tutorial voor geschreven, die ik hier niet woord voor woord hoef te herhalen. Let op: ze gaan over naar een nieuw systeem in 2024, dus probeer de tools te gebruiken die ook het nieuwe systeem ondersteunen.
Het instapniveau van onderstaande datastappen is wat hoog, maar ik hoop dat ik in ieder geval de mogelijkheden kan laten zien die het systeem biedt. Mocht je er zelf niet uitkomen, dan kun je me altijd contacten. Ik denk graag mee.
Je kunt de data grofweg op twee manieren ophalen: door in te loggen op hun server en daar een SQL-query te gebruiken, of via een Python library. Bij het eerste bevraag je de data direct en krijg je meteen een tabel terug met de gewenste data. Dit kan handig zijn voor een snelle check.
Meestal wil je deze data opslaan en wat complexere vragen aan de data stellen. Hiervoor is de Python-optie het meest geschikt. Ik gebruik zelf de Traffic-library. Die installeer je via deze instructies, waarbij het belangrijk is om eerst Python zelf en de environment manager Conda te installeren.
Als je Traffic hebt geïnstalleerd, activeer je de bijbehorende omgeving en voeg je je gebruikersnaam en wachtwoord toe aan het configuratiebestand. Waar dat bestand staat, hangt een beetje af van je computer. Je vindt het met onderstaande commando’s, pas het daarna aan met een editor als Nano of Vim (of gewoon met kladblok/je code editor).
Na deze wat hachelijke eerste stappen kun je daadwerkelijk data gaan binnenhalen. Ik heb een repository gemaakt met daarin wat voorbeeldscripts, die je naar wens kunt aanpassen. Hieronder een voorbeeld waarmee je een losse vlucht uit de database kunt trekken. Zie de repository voor alle code.
# Libraries importeren
from traffic.data import opensky
import geopandas as gpd
from shapely.geometry import Point
# Vlucht ophalen
vlucht = opensky.history(
"2017-02-05 15:45",
stop="2017-02-05 16:45",
callsign="EZY158T",
return_flight=True
)
if vlucht is not None:
# Vlucht omzetten naar een GeoDataFrame en opslaan als geojson
df = vlucht.data
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.longitude, df.latitude))
gdf.to_file("vlucht.geojson", driver='GeoJSON')
else:
print("Helaas konden we geen data vinden voor deze vlucht en deze tijdsperiode.")
Visualiseren
Wanneer we de data hebben binnengehaald, willen we deze natuurlijk visualiseren. Mijn voorbeeld is vrij basaal (ik zet de losse punten niet eens om naar vluchtlijnen), maar toch is het goed om te laten zien hoe je deze data snel kunt analyseren.
Uit de bovenstaande code rolt een geojson-bestand, wat niet veel meer is dan een bak geodata. Deze kunnen we inladen in bijvoorbeeld Google Earth of geojson.io. Maar échte datajournalisten gebruiken natuurlijk Qgis, dat meteen een scala aan analysemogelijkheden biedt. Dus ik laat toch even snel zien hoe je daar de data inlaadt.
Open een nieuw gisbestand, en voeg een kaartlaag toe:
Sleep nu je geojson-bestand naar Qgis en je krijgt de binnengehaalde data mooi te zien op een kaart.
Dit stukje code is nog maar het puntje van de ijsberg, wil je hier dieper induiken dan kan ik aanraden om de documentatie van Traffic eens goed door te nemen. Uiteindelijk kun je met deze data ook precies opzoeken welke vluchten zijn vertrokken vanaf bepaalde luchthavens, wanneer specifieke toestellen in de lucht waren en nog veel meer. Het is werkelijk fantastisch dat Opensky deze data publiek toegankelijk heeft gemaakt voor ons journalisten. Laten we er dan ook veel mooie verhalen mee maken.
Zoals altijd, laat het vooral weten als je nog iets toe hebt te voegen!