import requests import csv from io import StringIO from .model import Device, AddressOrigin, Airport from geopy.geocoders import Nominatim from geopy.exc import GeopyError from aerofiles.seeyou import Reader from ogn.parser.utils import feet2m DDB_URL = "http://ddb.glidernet.org/download" address_prefixes = {'F': 'FLR', 'O': 'OGN', 'I': 'ICA'} nm2m = 1852 mi2m = 1609.34 def get_ddb(csvfile=None): if csvfile is None: r = requests.get(DDB_URL) rows = '\n'.join(i for i in r.text.splitlines() if i[0] != '#') address_origin = AddressOrigin.ogn_ddb else: r = open(csvfile, 'r') rows = ''.join(i for i in r.readlines() if i[0] != '#') address_origin = AddressOrigin.user_defined data = csv.reader(StringIO(rows), quotechar="'", quoting=csv.QUOTE_ALL) devices = list() for row in data: flarm = Device() flarm.address_type = row[0] flarm.address = row[1] flarm.aircraft = row[2] flarm.registration = row[3] flarm.competition = row[4] flarm.tracked = row[5] == 'Y' flarm.identified = row[6] == 'Y' flarm.address_origin = address_origin devices.append(flarm) return devices def get_trackable(ddb): l = [] for i in ddb: if i.tracked and i.address_type in address_prefixes: l.append("{}{}".format(address_prefixes[i.address_type], i.address)) return l def get_country_code(latitude, longitude): geolocator = Nominatim() try: location = geolocator.reverse("{}, {}".format(latitude, longitude)) country_code = location.raw['address']['country_code'] except KeyError: country_code = None except GeopyError: country_code = None return country_code def get_airports(cupfile): airports = list() with open(cupfile) as f: for line in f: try: for waypoint in Reader([line]): airport = Airport() airport.name = waypoint['name'] airport.code = waypoint['code'] airport.country_code = waypoint['country'] airport.style = waypoint['style'] airport.description = waypoint['description'] airport.latitude = waypoint['latitude'] airport.longitude = waypoint['longitude'] airport.altitude = waypoint['elevation']['value'] if (waypoint['elevation']['unit'] == 'ft'): airport.altitude = airport.altitude*feet2m airport.runway_direction = waypoint['runway_direction'] airport.runway_length = waypoint['runway_length']['value'] if (waypoint['runway_length']['unit'] == 'nm'): airport.altitude = airport.altitude*nm2m elif (waypoint['runway_length']['unit'] == 'ml'): airport.altitude = airport.altitude*mi2m airport.frequency = waypoint['frequency'] airports.append(airport) except Exception: print('Failed to parse line: {}'.format(line)) return airports def haversine_distance(location0, location1): from math import asin, sqrt, sin, cos, atan2, radians, degrees lat0 = radians(location0[0]) lon0 = radians(location0[1]) lat1 = radians(location1[0]) lon1 = radians(location1[1]) distance = 6366000 * 2 * asin(sqrt((sin((lat0 - lat1) / 2))**2 + cos(lat0) * cos(lat1) * (sin((lon0 - lon1) / 2))**2)) phi = degrees(atan2(sin(lon0 - lon1) * cos(lat1), cos(lat0) * sin(lat1) - sin(lat0) * cos(lat1) * cos(lon0 - lon1))) return distance, phi