如何在 MS Excel 或 LibreOffice 中进行“大圆”计算?

如何在 MS Excel 或 LibreOffice 中进行“大圆”计算?

我有两列经度和纬度值。我需要计算每行点之间的距离。我尝试使用半正矢公式如图所示这里

半正弦计算

这就是所谓的“大圆”计算。我需要对大量坐标进行这种计算。

数据如下:

  |        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

结果G220015相当……错误的。

如何在 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

你应该会得到正确的答案。希望这能有所帮助!

相关内容