import requests from typing import List, Dict, Any def fetch_flights_in_area( latitude: float, longitude: float, radius: float = 0.5 ) -> List[Dict[str, Any]]: """ Fetch and summarize flight data for a given area using the OpenSky Network API. Args: latitude (float): The latitude of the center point. longitude (float): The longitude of the center point. radius (float): The radius around the center point to search for flights, in degrees. Default is 0.5. Returns: List[Dict[str, Any]]: A list of summarized flight data in the specified area. Raises: Exception: If the request fails or the response is invalid. """ url = "https://opensky-network.org/api/states/all" params = { "lamin": latitude - radius, "lamax": latitude + radius, "lomin": longitude - radius, "lomax": longitude + radius, } try: response = requests.get(url, params=params) response.raise_for_status() data = response.json() flights = data.get("states", []) summarized_flights = [] for flight in flights: if ( flight[1] and flight[5] and flight[6] and flight[7] is not None ): # Ensure essential data is available summarized_flights.append( { "callsign": flight[1].strip(), "origin_country": flight[2], "last_position": f"Lat: {flight[5]}, Lon: {flight[6]}", "altitude_meters": flight[7], } ) return summarized_flights except requests.RequestException as e: raise Exception(f"Failed to fetch flight data: {e}") except ValueError: raise Exception("Invalid response format.") # Example usage latitude = 28.3922 # Latitude for Cape Canaveral, FL longitude = -80.6077 # Longitude for Cape Canaveral, FL radius = 0.5 # 0.5 degrees (~55 km) try: flights = fetch_flights_in_area(latitude, longitude, radius) for flight in flights: print( f"Callsign: {flight['callsign']}, Origin: {flight['origin_country']}, " f"Position: {flight['last_position']}, Altitude: {flight['altitude_meters']} meters" ) except Exception as e: print(e)