Seite 1 von 2
Haversine-Formel liefert falsche Werte
Verfasst: Sonntag 5. Mai 2019, 06:47
von Strawk
Hallo!
Die Haversine-Formel, zu finden unter
https://en.wikipedia.org/wiki/Haversine_formula in Python zu übertragen, habe ich versucht. Die zurückgelieferten Ergebnisse sind aber falsch. Warum?
Code: Alles auswählen
from __future__ import print_function, division
import numpy as np
def haversine(phi_1, phi_2, lambda_1, lambda_2):
""" calculates the distance in kilometers between two geographical points
"""
leftParenthesis = ((phi_2 - phi_1)/2)
rightParenthesis = ((lambda_2 - lambda_1)/2)
allUnderSquareRoot = ((np.sin(leftParenthesis))**2) + np.cos(phi_1)*np.cos(phi_2)*(np.sin(rightParenthesis))**2
squareRootResult = np.sqrt(allUnderSquareRoot)
arcSin = np.arcsin(squareRootResult)
r = 6371
result = 2 * r * arcSin
return result
if __name__ == "__main__":
'''
westlicher Ort: Position 1
östlicher Ort: Position 2
'''
'''
# Madrid (1) - Budapest (2)
PHI_1 = 40.4167754
PHI_2 = 47.497912
LAMBDA_1 = -3.7037902
LAMBDA_2 = 19.040235
'''
# New York (1) - Aachen (2)
phi_1 = 40.712784
phi_2 = 50.7753455
lambda_1 = -74.005941
lambda_2 = 6.0838868
result = haversine(phi_1, phi_2, lambda_1, lambda_2)
print(result)
Re: Haversine-Formel liefert falsche Werte
Verfasst: Sonntag 5. Mai 2019, 06:55
von ThomasL
Schau mal hier rein, eventuell hilfreich.
viewtopic.php?f=1&t=19980
Re: Haversine-Formel liefert falsche Werte
Verfasst: Sonntag 5. Mai 2019, 09:58
von Strawk
Hallo!
Das funktioniert, ja. Hilft mir aber nicht, den Fehler in meiner Formel zu finden, da jene Formel ganz anders aufgebaut ist. Schönen Sonntag!
Grüße
Strawk

Re: Haversine-Formel liefert falsche Werte
Verfasst: Sonntag 5. Mai 2019, 10:16
von Sirius3
@Strawk: der Fehler im verlinkten Beitrag ist der selbe, wie bei Dir. Trigonometrische Funktionen erwarten den Winkel in Radians.
Re: Haversine-Formel liefert falsche Werte
Verfasst: Sonntag 5. Mai 2019, 10:28
von Strawk
Hallo!
Funktioniert jetzt!
Code:
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 26 10:45:34 2019
@author: Karl Kraft
"""
from __future__ import print_function, division
from math import radians
import numpy as np
def haversine(lat1, lat2, lon1, lon2):
""" calculates the distance in kilometers between two geographical points
"""
lat1 = radians(lat1)
lat2 = radians(lat2)
lon1 = radians(lon1)
lon2 = radians(lon2)
leftParenthesis = ((lat2 - lat1)/2)
rightParenthesis = ((lon2 - lon1)/2)
allUnderSquareRoot = ((np.sin(leftParenthesis))**2) + np.cos(lat1)*np.cos(lat2)*(np.sin(rightParenthesis))**2
squareRootResult = np.sqrt(allUnderSquareRoot)
arcSin = np.arcsin(squareRootResult)
r = 6371
result = 2 * r * arcSin
return result
if __name__ == "__main__":
'''
westlicher Ort: Position 1
östlicher Ort: Position 2
'''
'''
# Madrid (1) - Budapest (2)
lat1 = 40.4167754
lat2 = 47.497912
lon1 = -3.7037902
lon2 = 19.040235
'''
'''
# New York (1) - Aachen (2)
lat1 = 40.712784
lat2 = 50.7753455
lon1 = -74.005941
lon2 = 6.0838868
'''
# Berlin (1) - Pretoria (2)
lat1 = 52.520007
lat2 = -25.746111
lon1 = 13.404954
lon2 = 28.188056
result = haversine(lat1, lat2, lon1, lon2)
print("km: %.1f" % (result), "\t")
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 14:31
von Strawk
@ThomasL: Das war ein heißer Tipp, der zum Erfolg führte. Danke!
Grüße
Strawk

Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 16:56
von Strawk
Hallo!
Ich möchte die Abstände aller weltweiten Flughäfen zu allen berechnen. Das dauert auf meinem Rechner mit der geopy-Modul-Funktion „distance“ (Methode „great_circle“) ca. 10 Minuten bei folgenden Werten:
distances_airports_worldwide.py:
country == "All"
number of calculations: 25,801,336 (25 Mio.)
km: 218,753,071,512.4 (219 Mrd. km)
Computation of distances took 554.27 secs = ca. 9 min 15 secs
Ich habe jetzt bei unten stehendem Code alle Breitengrade (lats) und alle Längengrade (lons) als numpy-arrays vorliegen. Nun möchte ich die Haversine-Funktion über den ganzen Vektor anwenden, um die Rechenzeit erheblich zu verkürzen. Hierzu erbitte ich eure Tipps.
Danke.
Grüße
Strawk
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 26 10:45:34 2019
@author: Karl Kraft
"""
from __future__ import print_function, division
import numpy as np
from math import radians
# from gpx_project import dist
from distances_airports_worldwide import get_airport_positions
def haversine(lat1, lat2, lon1, lon2):
""" calculates the distance in kilometers between two geographical points
"""
lat1 = radians(lat1)
lat2 = radians(lat2)
lon1 = radians(lon1)
lon2 = radians(lon2)
leftParenthesis = ((lat2 - lat1)/2)
rightParenthesis = ((lon2 - lon1)/2)
allUnderSquareRoot = ((np.sin(leftParenthesis))**2) + np.cos(lat1)*np.cos(lat2)*(np.sin(rightParenthesis))**2
squareRootResult = np.sqrt(allUnderSquareRoot)
arcSin = np.arcsin(squareRootResult)
# before: 6371 km
middleEarthRadiusKm = 6378.1
middleEarthRadiusM = middleEarthRadiusKm * 1000
result = 2 * middleEarthRadiusM * arcSin
return result
def distvec(lat0, lon0, lats, lons):
"""calculates the distance of all airports worldwide to each other in kilometers
"""
myResult = haversine(lat0, lon0, lats, lons)
'''
lst = [2, 3, 7.9, 3.3, 6.9, 0.11, 10.3, 12.9]
v = np.array(lst)
print(v + 2)
'''
return myResult
if __name__ == "__main__":
coords = get_airport_positions("data\\airports.dat", "All")
lats = [t[0] for t in coords]
lons = [t[1] for t in coords]
lats = np.array(lats)
lons = np.array(lons)
myResult = distvec(-6.081689834590001, 145.391998291, lats, lons)
print(myResult)
'''
westlicher Ort: Position 1
östlicher Ort: Position 2
'''
'''
# Madrid (1) - Budapest (2)
lat1 = 40.4167754
lat2 = 47.497912
lon1 = -3.7037902
lon2 = 19.040235
'''
'''
# New York (1) - Aachen (2)
lat1 = 40.712784
lat2 = 50.7753455
lon1 = -74.005941
lon2 = 6.0838868
'''
'''
# Berlin (1) - Pretoria (2)
lat1 = 52.520007
lat2 = -25.746111
lon1 = 13.404954
lon2 = 28.188056
'''
'''
# Pretoria (1) - Moskau (2)
lat1 = -25.746111
lat2 = 55.755826
lon1 = 28.188056
lon2 = 37.617300
'''
'''
# Aachen (1) - Mönchengladbach (2)
lat1 = 50.7753455
lat2 = 51.1804572
lon1 = 6.0838868
lon2 = 6.4428041
'''
'''
result = haversine(lat1, lat2, lon1, lon2)
print("km: %.1f" % (result), "\t")
'''
'''
result_haversine = haversine(lat1, lat2, lon1, lon2) / 1000
result_great_circle = dist((lat1, lon1), (lat2, lon2), method="great_circle") / 1000
rel_error = abs((result_great_circle - result_haversine) / result_great_circle)
rel_error_percent = rel_error * 100
print("result haversine km: %.1f" % (result_haversine), "\t")
print("result great_circle km: %.1f" % (result_great_circle), "\t")
print("result rel_error km: %.7f" % (rel_error), "\t")
print("result rel_error_percent %.1f" % (rel_error_percent), "\t")
'''
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 17:42
von Sirius3
Was ist denn `coords` für ein Typ. Die LCs sehen irgendwie falsch aus.
Wo hängt es denn nun noch? Gibt es einen Fehler? Wie weicht das erwartete vom eigentlichen Ergebnis ab?
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 18:05
von Strawk
@Sirius3: 'coords' ist vom Typen <class 'list'>. Was bedeutet "LC"s? In der Tat war die Funktionsschnittstelle falsch. Ich habe sie jetzt geändert:
Es hängt dahingehend:
TypeError: only size-1 arrays can be converted to Python scalars
Für ein Ergebnis ist es noch zu früh. Weder ist es mir bisher gelungen, über 2 numpy-arrays zu rechnen, noch das Dreiecksmatrixproblem zu lösen (Flughafen mit sich selbst, A:B = B:A)
Grüße
Strawk
So sieht coords aus:
[(-6.0816898345900015, 145.391998291), (-5.20707988739, 145.789001465), (-5.826789855957031, 144.29600524902344), (-6.569803, 146.725977), (-9.443380355834961, 147.22000122070312), (-3.5838301181800003, 143.66900634799998), (61.1604995728, -45.4259986877), (64.19090271, -51.678100585900005), (67.0122218992, -50.7116031647), (76.5311965942, -68.70320129390001), (65.66000366210939, -18.07270050048828), (65.28330230712889, -14.401399612426758), (64.295601, -15.2272), (65.952301, -17.426001), (66.05809783935547, -23.13529968261719), (63.985000610352, -22.605600357055998), (65.555801, -23.965), (64.1299972534, -21.9405994415), (66.133301, -18.9167), (63.42430114746094, -20.27890014648437), (46.48500061035156, -84.5093994140625), (50.0564002991, -97.0325012207), (44.639701843299996, -63.4994010925), (51.391899108900006, -56.083099365200006), (49.079833, -125.77558300000001), (68.534401, -89.808098), (49.13249969482422, -68.20439910888672), (48.33060073852539, -70.99639892578125), (64.29889678960001, -96.077796936), (49.950 ... ... ... ... ...
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 18:18
von Sirius3
LCs sind ListComprehensions und die kann man also einfach ersetzen:
Jetzt wäre es noch gut, zu wissen, wo genau der Fehler auftritt, denn dort wirst Du merken, dass Du eine Funktion durch die äquivalente Numpy-Variante ersetzen mußt.
`myResult` ist ein schlechter Name, oder gibt es auch ein your_result?
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 18:28
von Strawk
@Sirius3: Der Fehler tritt bei Zeile 17 auf, wo mit
ein Array, anstatt eines einzelnen Wertes übergeben wird. Wie lautet denn die äquivalente Numpy-Variante? Ich habe 'myResult' durch zwei erwartete Ergebnisse ersetzt: 'sumMeters' und 'nCalculations '. Das sind die Summe der Meter und die Anzahl der getätigten Distanzberechnungen.
Grüße, Strawk
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 18:44
von __blackjack__
Du musst das `radians()` aus `numpy` nehmen. Das aus `math` kennt logischerweise keine Numpy-Arrays.
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 18:47
von Strawk
Hallo ihrs!
Der Code sieht jetzt so aus:
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 26 10:45:34 2019
@author: Karl Kraft
"""
from __future__ import print_function, division
import numpy as np
# from math import radians
# from gpx_project import dist
from distances_airports_worldwide import get_airport_positions
def haversine(lat1, lat2, lon1, lon2):
""" calculates the distance in kilometers between two geographical points
"""
# nCalculations = len(lat2)
lat1 = np.radians(lat1)
lat2 = np.radians(lat2)
lon1 = np.radians(lon1)
lon2 = np.radians(lon2)
leftParenthesis = ((lat2 - lat1)/2)
rightParenthesis = ((lon2 - lon1)/2)
allUnderSquareRoot = ((np.sin(leftParenthesis))**2) + np.cos(lat1)*np.cos(lat2)*(np.sin(rightParenthesis))**2
squareRootResult = np.sqrt(allUnderSquareRoot)
arcSin = np.arcsin(squareRootResult)
# before: 6371 km
middleEarthRadiusKm = 6378.1
middleEarthRadiusM = middleEarthRadiusKm * 1000
result = 2 * middleEarthRadiusM * arcSin
return result #, nCalculations
def distvec(lat0, lats, lon0, lons):
"""calculates the distance of all airports worldwide to each other in kilometers
"""
# lats = lats.astype(float)
# lons = lons.astype(float)
print(type(lats))
print(type(lons))
# lats = np.array(lats).astype(float)
# lons = np.array(lons).astype(float)
sumMeters = haversine(lat0, lats, lon0, lons)
return sumMeters
# lst = [2, 3, 7.9, 3.3, 6.9, 0.11, 10.3, 12.9]
# v = np.array(lst)
# print(v + 2)
# return myResult
if __name__ == "__main__":
coords = get_airport_positions("data\\airports.dat", "All")
# print(coords)
# print(type(coords))
lats = [t[0] for t in coords]
lons = [t[1] for t in coords]
lats = np.array(lats)
lons = np.array(lons)
sumMeters = distvec(-6.081689834590001, lats, 145.391998291, lons)
print(sumMeters)
'''
westlicher Ort: Position 1
östlicher Ort: Position 2
'''
'''
# Madrid (1) - Budapest (2)
lat1 = 40.4167754
lat2 = 47.497912
lon1 = -3.7037902
lon2 = 19.040235
'''
'''
# New York (1) - Aachen (2)
lat1 = 40.712784
lat2 = 50.7753455
lon1 = -74.005941
lon2 = 6.0838868
'''
'''
# Berlin (1) - Pretoria (2)
lat1 = 52.520007
lat2 = -25.746111
lon1 = 13.404954
lon2 = 28.188056
'''
'''
# Pretoria (1) - Moskau (2)
lat1 = -25.746111
lat2 = 55.755826
lon1 = 28.188056
lon2 = 37.617300
'''
'''
# Aachen (1) - Mönchengladbach (2)
lat1 = 50.7753455
lat2 = 51.1804572
lon1 = 6.0838868
lon2 = 6.4428041
'''
'''
result = haversine(lat1, lat2, lon1, lon2)
print("km: %.1f" % (result), "\t")
'''
'''
result_haversine = haversine(lat1, lat2, lon1, lon2) / 1000
result_great_circle = dist((lat1, lon1), (lat2, lon2), method="great_circle") / 1000
rel_error = abs((result_great_circle - result_haversine) / result_great_circle)
rel_error_percent = rel_error * 100
print("result haversine km: %.1f" % (result_haversine), "\t")
print("result great_circle km: %.1f" % (result_great_circle), "\t")
print("result rel_error km: %.7f" % (rel_error), "\t")
print("result rel_error_percent %.1f" % (rel_error_percent), "\t")
'''
und ich erhalte als Ergebnis:
runfile('C:/Users/Karl Kraft/Documents/Programmierung_ausser_PHP/Python/analysis_of_geo_data/geosphere_distances.py', wdir='C:/Users/Karl Kraft/Documents/Programmierung_ausser_PHP/Python/analysis_of_geo_data')
Reloaded modules: distances_airports_worldwide, gpx_project, extremesBoundBoxMap
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
[8.85139184e-11 1.06832824e+05 1.24619768e+05 ... 7.77830749e+06
5.70006415e+06 5.77467174e+06]
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 19:10
von Sirius3
Das Problem ist nur, dass da gar keine Summe aus Metern gebildet wird

. Namenskonvention ist in Python Variablen klein_mit_unterstrich zu schreiben.
Re: Haversine-Formel liefert falsche Werte
Verfasst: Montag 6. Mai 2019, 19:14
von Strawk
Ja, genau. Eine einzelne Meter-Berechnung erfolgt. Zum Ziel siehe bitte meinen Beitrag von heute 17.56 Uhr. 2 Probleme bestehen noch: Wie sagt man der haversine-Funktion, dass sie eine Menge berechnen soll, nicht 1 Abstand. Und wie trägt man dabei dem Dreiecksmatrixproblem Rechnung? Alles also wie gehabt. Ideen?
Code aktuell:
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 26 10:45:34 2019
@author: Karl Kraft
"""
from __future__ import print_function, division
import numpy as np
# from math import radians
# from gpx_project import dist
from distances_airports_worldwide import get_airport_positions
def haversine(lat1, lat2, lon1, lon2):
""" calculates the distance in kilometers between two geographical points
"""
# nCalculations = len(lat2)
lat1 = np.radians(lat1)
lat2 = np.radians(lat2)
lon1 = np.radians(lon1)
lon2 = np.radians(lon2)
leftParenthesis = ((lat2 - lat1)/2)
rightParenthesis = ((lon2 - lon1)/2)
allUnderSquareRoot = ((np.sin(leftParenthesis))**2) + np.cos(lat1)*np.cos(lat2)*(np.sin(rightParenthesis))**2
squareRootResult = np.sqrt(allUnderSquareRoot)
arcSin = np.arcsin(squareRootResult)
# before: 6371 km
middleEarthRadiusKm = 6378.1
middleEarthRadiusM = middleEarthRadiusKm * 1000
result = 2 * middleEarthRadiusM * arcSin
result = sum(np.array(result))
return result #, nCalculations
def distvec(lat0, lats, lon0, lons):
"""calculates the distance of all airports worldwide to each other in kilometers
"""
# lats = lats.astype(float)
# lons = lons.astype(float)
# print(type(lats))
# print(type(lons))
# lats = np.array(lats).astype(float)
# lons = np.array(lons).astype(float)
sumMeters = haversine(lat0, lats, lon0, lons)
return sumMeters
# lst = [2, 3, 7.9, 3.3, 6.9, 0.11, 10.3, 12.9]
# v = np.array(lst)
# print(v + 2)
# return myResult
if __name__ == "__main__":
coords = get_airport_positions("data\\airports.dat", "All")
# print(coords)
# print(type(coords))
lats = [t[0] for t in coords]
lons = [t[1] for t in coords]
lats = np.array(lats)
lons = np.array(lons)
sumMeters = distvec(-6.081689834590001, lats, 145.391998291, lons)
print(sumMeters)
'''
westlicher Ort: Position 1
östlicher Ort: Position 2
'''
'''
# Madrid (1) - Budapest (2)
lat1 = 40.4167754
lat2 = 47.497912
lon1 = -3.7037902
lon2 = 19.040235
'''
'''
# New York (1) - Aachen (2)
lat1 = 40.712784
lat2 = 50.7753455
lon1 = -74.005941
lon2 = 6.0838868
'''
'''
# Berlin (1) - Pretoria (2)
lat1 = 52.520007
lat2 = -25.746111
lon1 = 13.404954
lon2 = 28.188056
'''
'''
# Pretoria (1) - Moskau (2)
lat1 = -25.746111
lat2 = 55.755826
lon1 = 28.188056
lon2 = 37.617300
'''
'''
# Aachen (1) - Mönchengladbach (2)
lat1 = 50.7753455
lat2 = 51.1804572
lon1 = 6.0838868
lon2 = 6.4428041
'''
'''
result = haversine(lat1, lat2, lon1, lon2)
print("km: %.1f" % (result), "\t")
'''
'''
result_haversine = haversine(lat1, lat2, lon1, lon2) / 1000
result_great_circle = dist((lat1, lon1), (lat2, lon2), method="great_circle") / 1000
rel_error = abs((result_great_circle - result_haversine) / result_great_circle)
rel_error_percent = rel_error * 100
print("result haversine km: %.1f" % (result_haversine), "\t")
print("result great_circle km: %.1f" % (result_great_circle), "\t")
print("result rel_error km: %.7f" % (rel_error), "\t")
print("result rel_error_percent %.1f" % (rel_error_percent), "\t")
'''
Re: Haversine-Formel liefert falsche Werte
Verfasst: Dienstag 7. Mai 2019, 18:28
von Strawk
Hallo!
Es hat sich was getan. Die Haversine-Funktion ist jetzt in der Lage, einen Vektor aufzunehmen und zu berechnen. Auf diese Weise erhält man alle Abstände von einem gegebenen Flughafen zu allen anderen Flughäfen (hier am Beispiel Deutschlands).
Was seltsam anmutet: Im Ergebnis kommen 3x viel zu hohe Werte vor: 8003.1 km, 928.8 km und 8215.7 km. So groß ist die Ausdehnung Deutschlands bekanntlich nicht. Ich hoffe, dass es sich hier um einen kleinen, einfach zu korrigierenden Fehler handelt.
Fernziel: Alle Abstände von allen Flughäfen zu allen berechnen. Das Dreiecksmatrixproblem kann hierbei erstmal außen vor bleiben. Hat jemand eine Idee, wie man bei gegebenen Koordinaten der Flughäfen alle Abstände aller Flughäfen zu allen in einem oder mehreren Vektoren ausdrücke kann. Die Berechnung wäre dann 100x schneller, als mit einer Doppelschleife.
Grüße
Strawk
Aktueller Code:
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 26 10:45:34 2019
@author: Karl Kraft
"""
from __future__ import print_function, division
import numpy as np
from distances_airports_worldwide import get_airport_positions
def haversine(lat1, lat2, lon1, lon2):
""" calculates the distance in meters between geographical points
"""
# Haversine formula
lat1 = np.radians(lat1)
lat2 = np.radians(lat2)
lon1 = np.radians(lon1)
lon2 = np.radians(lon2)
leftParenthesis = ((lat2 - lat1)/2)
rightParenthesis = ((lon2 - lon1)/2)
allUnderSquareRoot = ((np.sin(leftParenthesis))**2) + np.cos(lat1)*np.cos(lat2)*(np.sin(rightParenthesis))**2
squareRootResult = np.sqrt(allUnderSquareRoot)
arcSin = np.arcsin(squareRootResult)
middleEarthRadiusKm = 6371.009
middleEarthRadiusM = middleEarthRadiusKm * 1000
distanceMeters = 2 * middleEarthRadiusM * arcSin
return distanceMeters
def haversine_vectorized(coord0, coords):
""" prepares data vor vectorized use of haversine-function
"""
lat0, lon0 = coord0
lats = coords[:,0] # 1. Spalte von coords (= array von latitudes)
lons = coords[:,1] # 2. Spalte von coords (= array von longitudes)
result_vectorized = haversine(lat0, lats, lon0, lons)
return result_vectorized
if __name__ == "__main__":
coords = get_airport_positions("data\\airports.dat", "Germany")
coord0 = coords[0]
coords = np.array(coords)
coord0 = np.array(coord0)
result_vectorized = haversine_vectorized(coord0, coords) / 1000
np.set_printoptions(formatter={'float': '{: 0.1f}'.format})
print(result_vectorized)
Ergebnis:
[ 0.0 142.6 176.1 111.5 68.3 180.4 175.7 81.8 263.9 159.7 146.4
370.2 198.5 239.4 222.4 35.4 299.1 77.4 29.6 148.7 52.9 249.9
439.0 482.7 409.6 161.6 517.0 539.6 371.8 308.4 160.8 571.1
470.2 173.9 360.8 442.2 436.7 530.5 467.0 407.9 470.2 470.0
283.0 454.0 410.9 460.3 387.9 568.1 482.6 460.9 527.5 421.6
558.1 412.0 537.6 480.8 401.2 484.3 336.7 447.6 417.1 292.3
299.9 493.0 533.2 310.2 244.5 405.7 243.7 285.6 212.7 310.4
500.9 565.9 479.7 552.4 561.1 596.7 509.0 408.6 70.8 300.1
357.7 333.8 478.6 552.5 534.2 508.5 593.1 567.2 525.9 472.2
584.1 568.8 528.5 365.4 393.3 345.5 505.8 365.1 468.0 514.6
380.8 327.8 352.9 246.9 407.7 291.0 345.6 489.1 451.1 592.5
482.1 519.7 338.7 551.2 494.6 533.5 377.0 261.0 466.0 455.0
433.9 537.2 368.8 406.3 113.3 348.6 425.5 363.6 437.0 471.2
584.2 532.6 582.6 565.9 576.2 299.6 501.5 555.3 363.6 476.1
203.6 425.3 417.3 76.4 532.8 362.3 532.8 531.6 553.3 8132.5
461.1 360.8 496.6 492.1 691.9 8003.1 928.8 8215.7 146.9 515.2
512.4 573.7 286.7 226.7 347.4 456.3 214.7 324.2 50.1 413.0
498.2 466.9 236.0 428.2 458.7 403.9 458.2 504.7 270.6 378.9
412.8 344.7 341.1 467.7 165.7 406.3 409.2 371.2 489.9 187.3
477.0 301.7 442.8 471.9 392.2 473.5 523.2 306.9 237.7 217.4
522.6 487.7 524.8 549.4 170.2 413.1 136.2 190.2 157.8 504.7
456.2 567.7 226.5 333.4 311.5 315.9 617.5 578.4 334.2 341.1
391.3 408.4 270.3 445.3 539.9 276.2 437.2 430.5 422.2 392.7
362.4 409.7 408.0 400.4 404.6 444.9 280.2 291.4 186.7]
Re: Haversine-Formel liefert falsche Werte
Verfasst: Dienstag 7. Mai 2019, 21:10
von Sirius3
Du mußt halt die gesamte Matrix aller Kombinationen ausrechnen, also lat1/lon1 als Spalten- und lat2/lon2 als Zeilenvektor benutzen.
Re: Haversine-Formel liefert falsche Werte
Verfasst: Donnerstag 9. Mai 2019, 11:50
von Strawk
@Sirius3: Aber bedeutet das nicht, dass ich wieder zur Schleife zurückkehren muss? Bisher wurde erreicht, dass über einen ganzen Vektor berechnet werden kann.
Re: Haversine-Formel liefert falsche Werte
Verfasst: Donnerstag 9. Mai 2019, 12:12
von Sirius3
@Strawk: nein, keine Schleife, nur Matrizen statt Vektoren.
Re: Haversine-Formel liefert falsche Werte
Verfasst: Donnerstag 9. Mai 2019, 12:48
von Strawk
Hallo!
Code: Alles auswählen
print(len(coords))
for i in range(7184):
coord0 = coords[i]
ergibt:
7184
IndexError: index 119 is out of bounds for axis 0 with size 44
Was ist da los?