
地球上の2つの座標点間の距離を計算する長い式は次のとおりです。
=ACOS(COS(RADIANS(90-LAT1)) *COS(RADIANS(90-LAT2)) +SIN(RADIANS(90-LAT1)) *SIN(RADIANS(90-LAT2)) *COS(RADIANS(Long1-Long2))) *6371
他の数式内で使用するのは少し面倒なので、そのためにユーザー定義関数を作成しました。
関数 DistXY(Lat1 As Single、Lng1 As Single、Lat2 As Single、Lng2 As Single) As Single
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
終了関数
ご覧のとおり、これらはまったく同じです。VBA には Acos または Radians 関数がないため、"worksheetFunction" メソッドも使用されます。
これらの式を同じ XY 座標のペアに適用すると、異なる結果が得られるのはなぜですか?
例えば:
ABC 45.4960674,-73.514446 から XYZ 43.5369,-71.8592 へ
XY距離()結果: 254.313156128
長い式法: 254.313268914
@raystafarian のコメントに従って、すべての型を double に変更すると精度が向上しました。しかし、まだ違いがあります。
関数 DistXY(Lat1 は double、Lng1 は double、Lat2 は double、Lng2 は double) は 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