Compare commits

..

2 commits

Author SHA1 Message Date
Edward Betts eb3be4cb51 Show flight distance 2024-04-06 09:26:09 +02:00
Edward Betts 87aaba64b2 Calculate flight distances 2024-04-06 09:25:32 +02:00
4 changed files with 34 additions and 6 deletions

View file

@ -14,6 +14,31 @@ Leg = dict[str, str]
TravelList = list[dict[str, typing.Any]]
RouteDistances = dict[tuple[str, str], float]
def coords(airport: StrDict) -> tuple[float, float]:
"""Longitude / Latitude as coordinate tuples."""
# return (airport["longitude"], airport["latitude"])
return (airport["latitude"], airport["longitude"])
def flight_distance(f: StrDict) -> float:
"""Distance of flight."""
return float(geodesic(coords(f["from_airport"]), coords(f["to_airport"])).km)
def route_distances_as_json(route_distances: RouteDistances) -> str:
"""Format route distances as JSON string."""
return (
"[\n"
+ ",\n".join(
" " + json.dumps([s1, s2, dist])
for (s1, s2), dist in route_distances.items()
)
+ "\n]"
)
def parse_yaml(travel_type: str, data_dir: str) -> TravelList:
"""Parse flights YAML and return list of travel."""
@ -67,9 +92,6 @@ def all_events(data_dir: str) -> list[Event]:
return get_trains(data_dir) + get_flights(data_dir)
RouteDistances = dict[tuple[str, str], float]
def train_leg_distance(geojson_data: StrDict) -> float:
"""Calculate the total length of a LineString in kilometers from GeoJSON data."""
# Extract coordinates
@ -81,7 +103,6 @@ def train_leg_distance(geojson_data: StrDict) -> float:
else:
first_object["type"] == "MultiLineString"
coord_list = first_object["coordinates"]
# pprint(coordinates)
total_length_km = 0.0

View file

@ -1,3 +1,5 @@
"""Trips."""
import os
from datetime import date, datetime, time
from zoneinfo import ZoneInfo
@ -73,6 +75,8 @@ def load_flights(data_dir: str) -> list[StrDict]:
flight["to_airport"] = airports[flight["to"]]
if "airline" in flight:
flight["airline_name"] = airlines.get(flight["airline"], "[unknown]")
flight["distance"] = travel.flight_distance(flight)
return flights

View file

@ -98,7 +98,10 @@
| <a href="https://uk.flightaware.com/live/flight/{{ full_flight_number | replace("U2", "EZY") }}">FlightAware</a>
| <a href="{{ radarbox_url }}">radarbox</a>
</div>
<div class="grid-item">
<div class="grid-item text-end">
{% if item.distance %}
{{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }}
{% endif %}
</div>
{% endmacro %}

View file

@ -110,7 +110,7 @@ async def weekends() -> str:
def travel_list() -> str:
"""Page showing a list of upcoming travel."""
data_dir = app.config["PERSONAL_DATA"]
flights = travel.parse_yaml("flights", data_dir)
flights = agenda.trip.load_flights(data_dir)
trains = [
item
for item in travel.parse_yaml("trains", data_dir)