
這是一個計算地球上兩個座標點之間距離的長公式
=ACOS(COS(弧度(90-LAT1)) *COS(弧度(90-LAT2)) +SIN(弧度(90-LAT1)) *SIN(弧度(90-LAT2)) *COS(弧度(長1-長2) )))*6371
由於在其他公式中使用有點麻煩,我為此編寫了一個用戶定義的函數。
函數 DistXY(Lat1 作為單個,Lng1 作為單個,Lat2 作為單個,Lng2 作為單一) 作為單個
DistXY = WorksheetFunction.Acos(Cos(WorksheetFunction.Radians(90 - Lat1)) * Cos(WorksheetFunction.Radians(90 - Lat2)) + Sin(WorksheetFunction.Radians(90 - Lat1)) * Sin(WorksheetFunction。 Lat1)) * Sin(WorksheetFunction.Radians(90 - Lat1)) Lat2)) * Cos(WorksheetFunction.Radians(Lng1 - Lng2))) * 6371
結束功能
正如您所看到的,它們是完全相同的。由於VBA中沒有Acos或Radians函數,它甚至使用「worksheetFunction」方法。
為什麼當我將這些公式應用於同一對 XY 座標時,會得到不同的結果?
例如:
從 ABC 45.4960674,-73.514446 到 XYZ 43.5369,-71.8592
距離XY()結果:254.313156128
長公式法: 254.313268914
按照 @raystafarian 的評論,將所有類型更改為雙倍提高了精度。但還是有差別的。
函數 DistXY(Lat1 As double, Lng1 As double, Lat2 As double, Lng2 As double) As double ...
新結果:
距離XY(): 254.3132689135060公里
長公式法: 254.3132689135250公里
答案1
答案2
基於雷斯塔法里安的答:
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