
Aqui está uma longa fórmula para calcular a distância entre dois pontos de coordenadas na Terra
=ACOS(COS(RADIANOS(90-LAT1)) *COS(RADIANOS(90-LAT2)) +SIN(RADIANOS(90-LAT1)) *SIN(RADIANOS(90-LAT2)) *COS(RADIANOS(Longo1-Longo2) ))) *6371
Como é um pouco complicado usar dentro de outras fórmulas, escrevi uma função definida pelo usuário para isso.
Função DistXY (Lat1 como único, Lng1 como único, Lat2 como único, Lng2 como único) como único
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.Radians(Lng1 - Lng2))) * 6371
Função final
Como você pode ver, eles são exatamente iguais. Como não existem funções Acos ou Radianos no VBA, ele ainda utiliza o método "worksheetFunction".
Por que é que quando aplico essa fórmula ao mesmo par de coordenadas XY, obtenho resultados diferentes?
Por exemplo:
De ABC 45.4960674,-73.514446 a XYZ 43.5369,-71.8592
DistXY()resultados: 254.313156128
Método de fórmula longa: 254.313268914
Seguindo o comentário de @raystafarian , alterar todos os tipos para dobrar melhorou a precisão. Mas ainda há uma diferença.
Função DistXY(Lat1 como duplo, Lng1 como duplo, Lat2 como duplo, Lng2 como duplo) Como duplo ...
Novos resultados:
DistXY(): 254.3132689135060quilômetros
Método de fórmula longa: 254.3132689135250quilômetros
Responder1
Responder2
Baseado emde Raystafarianresponder:
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