Het tekstbestand luchthavens.txt bevat
informatie over alle luchthavens van de Verenigde Staten. De informatie
van elke luchthaven staat op een afzonderlijke regel, en bestaat uit de
volgende vijf informatievelden die van elkaar worden gescheiden door een
tab:
code: unieke
identificatiecode voor de luchthaven
latitude: breedtegraad
waarop de luchthaven gelegen is (uitgedrukt in decimale graden)
longitude: lengtegraad
waarop de luchthaven gelegen is (uitgedrukt in decimale graden)
city: naam van de stad
waarin de luchthaven gelegen is
state: (afgekorte) naam
van de staat waarin de luchthaven gelegen is
De eerste regel van het bestand is een hoofding die de namen van de
verschillende kolommen bevat.
Opgave
Schrijf een functie
leesLuchthavens(bestandsnaam)
waaraan de locatie van het tekstbestand luchthavens.txt (of een
bestand met een gelijkaardige opmaak) moet doorgegeven worden. Deze
functie moet als resultaat een dictionary teruggeven, waarin informatie
over de luchthavens snel kan opgezocht worden. De unieke
identificatiecode van de luchthavens wordt in deze dictionary als
sleutel gebruikt, en de geassocieerde waarde is een tuple dat bestaat
uit de vier informatievelden (latitude,
longitude, city, state). Hierbij moeten de breedte- en
lengtegraad als reële getallen opgenomen worden in de tuple, en de
stad en staat waarin de luchthaven gelegen is als strings.
Schrijf een functie
afstand(code1, code2, luchthavens)
die de afstand tussen twee gegeven luchthavens teruggeeft (uitgedrukt in
kilometer). Aan deze functie moeten de unieke identificatiecodes van
twee luchthavens als argument doorgegeven worden, samen met een
dictionary die de informatie over de luchthavens bevat (in het formaat
zoals deze door de functie leesLuchthavens
wordt teruggegeven).
Om de afstand tussen twee luchthavens te berekenen, maak je gebruik van
onderstaande formule \[ R\cdot \arctan\left(\frac{\sqrt{(\cos b_2\sin
(l_1-l_2))^2 + (\cos b_1\sin b_2-\sin b_1\cos b_2
\cos(l_1-l_2))^2}}{\sin b_1\sin b_2+\cos b_1\cos
b_2\cos(l_1-l_2)}\right) \] Dit is eigenlijk een formule die de afstand
tussen twee punten op een bol met straal $$R$$ berekent. We stellen de
Aarde hierbij dus benaderend voor als een bol, met straal $$R =
6372{,}795$$ km. Voorts stellen $$b_1$$ en $$b_2$$ (resp. $$l_1$$ en $$l_2$$) de
breedteligging (resp. lengteligging) voor van de twee punten op de bol,
uitgedrukt in radialen. Voor de omzetting van graden naar radialen moet
je gebruikmaken van de waarde pi
uit de module math van de
Python Standard Library.
Schrijf een functie
tussenlanding(code1, code2, luchthavens[, reikwijdte=4000])
die gebruikt kan worden om het optimale vluchtschema met één
enkele tussenlanding (voor een extra tankbeurt) te bepalen, in het geval
men een vlucht wil maken tussen twee punten waarvan de afstand groter is
dan de maximale reikwijdte van het vliegtuig. Het optimale vluchtschema
om van punt $$A$$ naar punt $$B$$ te vliegen, heeft een tussenlanding in een
luchthaven die op punt $$C$$ gelegen is en waarvoor de afstand om van $$A$$
naar $$C$$ te vliegen en van $$C$$ naar $$B$$ te vliegen telkens binnen het
bereik van het vliegtuig ligt, en waarvoor de totale vliegafstand zo
klein mogelijk is. Aan deze functie moeten verplicht dezelfde drie
argumenten als voor de functie afstand
doorgegeven worden. Optioneel kan ook nog een vierde argument
doorgegeven worden, dat de maximale reikwijdte van het vliegtuig
(uitgedrukt in kilometer) aangeeft. Standaard wordt als maximale
reikwijdte 4.000 km genomen. De functie moet als resultaat de unieke
identificatiecode van de luchthaven teruggeven die zorgt voor een
optimaal vluchtschema. De functie moet de waarde None
teruggeven indien de twee opgegeven luchthavens binnen het bereik van
het vliegtuig liggen (als er met andere woorden rechtstreeks kan
gevlogen worden), of als een vluchtschema met één enkele
tussenlanding niet mogelijk is.
Voorbeeld
In onderstaande interactieve Python sessie
gaan we ervan uit dat het tekstbestand luchthavens.txt zich in de
huidige directory bevindt.
>>> luchthavens = leesLuchthavens('luchthavens.txt')
>>> luchthavens
{'AGN': (57.83, 134.97, 'Angoon', 'AK'), ...}
>>> luchthavens['ADK']
(51.88, 176.65, 'Adak', 'AK')
>>> luchthavens['DCA']
(38.85, 77.04, 'Washington/Natl', 'DC')
>>> luchthavens['4OM']
(48.42, 119.53, 'Omak', 'WA')
>>> afstand('P60', 'MSN', luchthavens)
1694.54554995
>>> afstand('ADK', 'DCA', luchthavens)
7295.50355678
>>> tussenlanding('ADK', 'DCA', luchthavens, 4000)
'4OM'