这是一个计算地球上两个坐标点之间距离的长公式
=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.弧度(90 - 纬度 1)) * Cos(WorksheetFunction.弧度(90 - 纬度 2)) + Sin(WorksheetFunction.弧度(90 - 纬度 1)) * Sin(WorksheetFunction.弧度(90 - 纬度 2)) * Cos(WorksheetFunction.弧度(经度 1 - 经度 2))) * 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 作为双精度型,Lng1 作为双精度型,Lat2 作为双精度型,Lng2 作为双精度型) 作为双精度型...
新结果:
距离XY()地址:254.3132689135060公里
长公式法地址:254.3132689135250公里
答案1
答案2
基于Raystafarian 的回答:
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