ogn-python/ogn/utils.py

65 wiersze
1.8 KiB
Python

import requests
import csv
from io import StringIO
from math import sin, cos, asin, atan2, sqrt, pi
from .model import Device, AddressOrigin
from geopy.geocoders import Nominatim
DDB_URL = "http://ddb.glidernet.org/download"
deg2rad = pi/180
rad2deg = 1/deg2rad
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.userdefined
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_country_code(latitude, longitude):
geolocator = Nominatim()
location = geolocator.reverse("%f, %f" % (latitude, longitude))
try:
country_code = location.raw["address"]["country_code"]
except KeyError:
country_code = None
return country_code
def wgs84_to_sphere(lat1, lat2, lon1, lon2, alt1, alt2):
lat1 = lat1*deg2rad
lat2 = lat2*deg2rad
lon1 = lon1*deg2rad
lon2 = lon2*deg2rad
radius = 6366000*2*asin(sqrt((sin((lat1-lat2)/2))**2 + cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))**2))
theta = atan2(alt2-alt1, radius)*rad2deg
phi = atan2(sin(lon2-lon1)*cos(lat2), cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1))*rad2deg
return radius, theta, phi