Hallo ihrs!
Programm jetzt:
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 26 10:45:34 2019
@author: Karl Kraft
"""
import pandas as pd
def get_airport_positions(country, airport_file):
csvData = pd.read_csv(airport_file,
names = [# 'Airport',
# 'Name',
# 'City',
'Country',
# 'IATA',
# 'ICAO',
'Latitude',
'Longitude'
# 'Altitude',
# 'Timezone',
# 'DST',
# 'Tz',
# 'Type',
# 'Source'
], encoding='utf-8',
usecols=[3,6,7])
countrydata, lat, lon = csvData['Country'], csvData['Latitude'], csvData['Longitude']
df = pd.DataFrame(list(zip(countrydata, lat,lon)))
coords = df.loc[df[0] == country]
numberAirports = coords[0].count()
coords.index = range(numberAirports)
return coords
'''
def calculate_distances(self):
"""
calculates all the single distances between each two adjoining points
"""
df = self.df
if self.dim == 2:
geopoints = list(zip(df['lat'], df['lon']))
else: # dim == 3
geopoints = list(zip(df['lat'], df['lon'], df['alt']))
Npoints = len(geopoints)
lstDistances = []
for i in range(0, Npoints-1):
lstDistances.append(dist(geopoints[i], geopoints[i+1], self.method, self.dim))
return lstDistances
def dist(coord1, coord2, method="karney", dim=2):
"""
calculates distance between two coordinates (= tuples of (lat,lon)).
Available methods: "karney", "vincenty" and "great_circle"
"""
if dim not in [2,3]:
raise ValueError("Invalid dimension: %s" % (dim))
if method == "karney":
d = distance.distance(coord1, coord2).m
elif method == "vincenty":
d = distance.vincenty(coord1, coord2).m
elif method == "great_circle":
d = distance.great_circle(coord1, coord2).m
else:
raise ValueError("unknown method for distance calculation: %s" % method)
if dim == 3:
if not (len(coord1) == 3 and len(coord2) == 3):
raise TypeError("elevation not available: coord1 = %s, coord2 = %s" % (coord1, coord2))
d3 = coord2[2] - coord1[2]
d = np.sqrt(d*d+d3*d3)
return d
'''
if __name__ == "__main__":
coords = get_airport_positions(country="Iceland", airport_file="data\\airports.dat")
print(coords)
Zur Erinnerung: Das Fernziel ist es, den Abstand in Kilometern aller Flughäfen der Welt zueinander zu berechnen. Um die Rechenoperationen zunächst gering zu halten, wurden im Vor-Thread nur die isländischen Flughäfen ausgewählt. 20 an der Zahl. Gehen wird nun einmal davon aus, es handle sich zunächst um 10 Flughäfen. Bzw. hier deren Positionen in Breiten- und Längengrad angegeben. Zur Berechnung ergibt sich eine Matrix wir folgt: 10 Flughafenpositionen in den Zeilen, 10 in der Spalten. Jetzt hat die Matrix noch 100 Elemente. Es liegt ja nun in der Natur der Sache, dass die Positionen zu sich selbst nicht berechnet werden können/müssen. Es wäre sinnfrei, den Abstand des Flughafens A zum Flughafen A zu berechnen. Es ergibt sich also eine 10-elementige Diagonale, womit die Elemente auf 90 schrumpfen. Siehe Bild unten. Ebenso sinnfrei wäre es, nachdem ich den Abstand des Flughafens A zu B ermittelt habe, auch den B zu A zu ermitteln, denn der ist logischerweise identisch. Folglich genügt es, die Elemente oberhalb (oder unterhalb) der Diagonale zu ermitteln. Damit sind wir bei 45 notwendigen Berechnungen. Frage nun: aus dem Python-Dataframe eine solche Matrix erstellen, und dann über Vektoren die Berechnungen durchführen. Denn sonst würde die Berechnung später aller 7100 Flughäfen Stunden dauert. Also: Matrix aus Dataframe, Vektorberechnung, wie macht man das in Python?
Grüße Strawk
Bild:
https://ibb.co/v1nD3nv