Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
junzis
GitHub Repository: junzis/openap
Path: blob/master/scripts/gen_airport_database.py
592 views
1
import argparse
2
import pandas as pd
3
import re
4
import reverse_geocoder as rg
5
6
7
parser = argparse.ArgumentParser()
8
parser.add_argument('--input', dest="fin", required=True,
9
help="path to x-plane apt.dat")
10
args = parser.parse_args()
11
12
fin = args.fin
13
14
curr_ap = None
15
prev_ap = None
16
skip = False
17
18
aps = []
19
20
with open(fin, 'rb') as f:
21
for line in f:
22
try:
23
line = line.strip().decode()
24
except UnicodeDecodeError:
25
continue
26
items = re.split('\s+', line)
27
28
29
if items[0] == '1':
30
icao = items[4]
31
name = ' '.join(items[5:]).title()
32
alt = items[1]
33
34
prev_ap = curr_ap
35
curr_ap = icao
36
37
if (not icao.isalpha()) or len(icao)!=4:
38
skip = True
39
elif 'closed' in name.lower() or '[x]' in name.lower():
40
skip = True
41
else:
42
skip = False
43
44
if items[0] == '100':
45
if skip:
46
continue
47
48
if curr_ap == prev_ap:
49
continue
50
51
lat = round(float(items[9]), 5)
52
lon = round(float(items[10]), 5)
53
54
# print(icao, lat, lon, alt, name)
55
56
ap = {
57
'icao': icao,
58
'lat': lat,
59
'lon': lon,
60
'alt': alt,
61
'name': name,
62
}
63
64
aps.append(ap)
65
prev_ap = curr_ap
66
67
df = pd.DataFrame(aps)
68
latlons = df[['lat','lon']].values.tolist()
69
latlons = [tuple(l) for l in latlons]
70
geo = rg.search(latlons)
71
dfgeo = pd.DataFrame(geo)
72
df['country'] = dfgeo['cc']
73
df['location'] = dfgeo['name']
74
75
df = df[['icao', 'lat', 'lon', 'alt', 'country', 'name', 'location']]
76
df = df.sort_values('icao')
77
78
df.to_csv('db/airports.csv', index=False)
79
80