
Hier ist eine lange Formel zur Berechnung der Entfernung zwischen zwei Koordinatenpunkten auf der Erde
=ACOS(COS(RADIANT(90-LAT1)) *COS(RADIANT(90-LAT2)) +SIN(RADIANT(90-LAT1)) *SIN(RADIANT(90-LAT2)) *COS(RADIANT(Long1-Long2))) *6371
Da die Verwendung innerhalb anderer Formeln etwas umständlich ist, habe ich dafür eine benutzerdefinierte Funktion geschrieben.
Funktion DistXY(Lat1 als Single, Lng1 als Single, Lat2 als Single, Lng2 als Single) als Single
DistXY = Arbeitsblattfunktion.Acos(Cos(Arbeitsblattfunktion.Radians(90 - Lat1)) * Cos(Arbeitsblattfunktion.Radians(90 - Lat2)) + Sin(Arbeitsblattfunktion.Radians(90 - Lat1)) * Sin(Arbeitsblattfunktion.Radians(90 - Lat2)) * Cos(Arbeitsblattfunktion.Radians(Lng1 - Lng2))) * 6371
Funktion beenden
Wie Sie sehen, sind sie genau gleich. Da es in VBA keine Acos- oder Radians-Funktionen gibt, wird sogar die Methode „worksheetFunction“ verwendet.
Warum erhalte ich unterschiedliche Ergebnisse, wenn ich diese Formel auf dasselbe Paar XY-Koordinaten anwende?
Zum Beispiel:
Von ABC 45.4960674,-73.514446 nach XYZ 43.5369,-71.8592
DistXY()Ergebnisse: 254.313156128
Lange Formelmethode: 254.313268914
Ich folge dem Kommentar von @raystafarian und habe alle Typen auf „double“ geändert, um die Genauigkeit zu verbessern. Aber es gibt immer noch einen Unterschied.
Funktion DistXY(Lat1 als Double, Lng1 als Double, Lat2 als Double, Lng2 als Double) als Double …
Neue Ergebnisse:
DistXY(): 254.3132689135060km
Lange Formelmethode: 254.3132689135250km
Antwort1
Antwort2
Bezogen aufRaystafariansAntwort:
Public Function DistXY(Lat1 As Double, Lng1 As Double, Lat2 As Double, Lng2 As Double) As Double
Dim i As Double, f As Double
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
i = 90
f = 6371
DistXY = wf.Acos(Cos(wf.Radians(i - Lat1)) * Cos(wf.Radians(i - Lat2)) + Sin(wf.Radians(i - Lat1)) * Sin(wf.Radians(i - Lat2)) * Cos(wf.Radians(Lng1 - Lng2))) * f
End Function