
Aquí hay una fórmula larga para calcular la distancia entre dos puntos de coordenadas en la Tierra.
=ACOS(COS(RADIANES(90-LAT1)) *COS(RADIANES(90-LAT2)) +SIN(RADIANES(90-LAT1)) *SIN(RADIANES(90-LAT2)) *COS(RADIANES(Largo1-Largo2 ))) *6371
Como es un poco complicado de usar dentro de otras fórmulas, escribí una función definida por el usuario para eso.
Función DistXY(Lat1 como única, Lng1 como única, Lat2 como única, Lng2 como única) como única
DistXY = WorksheetFunction.Acos(Cos(WorksheetFunction.Radians(90 - Lat1)) * Cos(WorksheetFunction.Radians(90 - Lat2)) + Sin(WorksheetFunction.Radians(90 - Lat1)) * Sin(WorksheetFunction.Radians(90 - Lat2)) * Cos(WorksheetFunction.Radianes(Lng1 - Lng2))) * 6371
Función final
Como puedes ver, son exactamente iguales. Como no hay funciones Acos o Radians en VBA, incluso utiliza el método "worksheetFunction".
¿Por qué cuando aplico esta fórmula al mismo par de coordenadas XY obtengo resultados diferentes?
Por ejemplo:
De ABC 45.4960674,-73.514446 a XYZ 43.5369,-71.8592
DistXY()resultados: 254.313156128
Método de fórmula larga: 254.313268914
Siguiendo el comentario de @raystafarian, cambiar todos los tipos al doble mejoró la precisión. Pero todavía hay una diferencia.
Función DistXY(Lat1 Como doble, Lng1 Como doble, Lat2 Como doble, Lng2 Como doble) Como doble...
Nuevos resultados:
DistXY(): 254.3132689135060kilómetros
Método de fórmula larga: 254.3132689135250kilómetros
Respuesta1
Respuesta2
Residencia enRaystafarirespuesta:
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