我有两列经度和纬度值。我需要计算每行点之间的距离。我尝试使用半正矢公式如图所示这里:
这就是所谓的“大圆”计算。我需要对大量坐标进行这种计算。
数据如下:
| A B C D E F G
--|-------------------------------------------
0 | LAT LON rLAT dLAT dLON a DIST
1 | 52.39964 13.04729 ... ... ... ...
2 | 52.39985 13.04802 ... ... ... ... ???
3 | 52.40116 13.04744 ... ... ... ... ???
4 | 52.40147 13.04722 ... ... ... ... ???
5 | 52.40163 13.04685 ... ... ... ... ???
6 | ... ... ... ... ... ... ...
G2
现在,我对LibreOffice 中的字段进行了以下尝试:
C2=RADIANS(A2)
D2=RADIANS(A2-A1)
E2=RADIANS(B2-B1)
F2=SIN(D2/2)*SIN(D2/2)+SIN(E2/2)*SIN(E2/2)*COS(C1)*COS(C2)
G2=2*ATAN2(SQRT(F2), SQRT(1-F2))*6371
结果G2
是20015
相当……错误的。
如何在 Microsoft Excel 或 LibreOffice Calc 中计算由纬度和经度指定的两点之间的距离?我的公式有什么问题?
答案1
发现这里经过布赖恩·阿德金斯,这个用于计算两个纬度/经度点之间距离的 Excel 公式对我而言在 LibreOffice Calc 和 Microsoft Excel 2013 中均有效:
=ACOS(COS(RADIANS(90-A1))*COS(RADIANS(90-A2))+SIN(RADIANS(90-A1))*SIN(RADIANS(90-A2))*COS(RADIANS(B1-B2)))*6371
结果以公里为单位,对于短距离我过去*1000
以米为单位显示距离。
| A B C
--|--------------------------
0 | LAT LON DIST
1 | 52.39964 13.04729
2 | 52.39985 13.04802 54.8
3 | 52.40116 13.04744 150.9
4 | 52.40147 13.04722 37.6
5 | 52.40163 13.04685 30.8
6 | ... ... ...
要以英里为单位显示距离,请用*6371
替换*3958
。
答案2
只要您愿意接受误差因素,或者必须仅使用工作表公式来实现,那么 Haversine 方法是很好的。对于短距离和非关键情况,它可能没问题。但如果您需要精确度,则需要使用 Thaddeus Vincenty 开发的算法。根据使用的纬度/经度对的精度,其结果被认为精确到毫米。两者之间有多大差异?肯尼迪机场和东京之间的差异约为 14.9 法定英里(短)。洛杉矶和檀香山之间,您距离该岛仅约 3 英里。
在 Visual Basic(对于 Excel)中可以找到 Vincenty 算法的良好实现: http://lost-species.livejournal.com/38453.html 代码将在 32 位版本的 Excel 上“按原样”运行,但在 64 位版本的 Excel 中会失败,并出现“公式太复杂”错误。在发布完整代码的下方,我发布了对该问题的修复,使其能够在 32 位和 64 位版本的 VBA 引擎上运行。
问候,J.Latham,Microsoft MVP,Excel 2006-2014
答案3
完整的正/逆 Vincenty 公式 Excel VBA 实现(32/64 位插件)不仅允许计算距离,还允许计算方位角和反方位角,可在https://github.com/tdjastrzebski/VincentyExcel
答案4
如果你反转以下论点:
原为:G2=2*ATAN2(SQRT(F2),SQRT(1-F2))*6371
是:G2=2*ATAN2(SQRT(1-F2),SQRT(F2))*6371
你应该会得到正确的答案。希望这能有所帮助!