Mike在Excel工作表中跟踪纬度和经度值。由于这些实质上是网格上的点,因此Mike想计算任意两个给定的纬度/经度点之间的距离。

如果纬度和经度对实际上只是网格上的点,那么计算它们之间的距离将很容易。问题在于它们实际上是球体上的点,这意味着您不能使用平面网格计算来确定距离。此外,还有许多方法可以计算距离:最短的表面距离,最佳的飞行路径(“乌鸦飞翔”),通过地球的距离,行驶距离等。

显然,这可能是一个复杂的问题。在可用的空间中,我将研究几种确定大圆距的方法(“乌鸦飞来飞去”),然后为其他类型的计算提供更多信息的参考。

您需要弄清的第一件事是如何在Excel中表示每个点的纬度和经度。有几种表示方法。例如,您可以在各个单元格中输入度,分钟和秒。或者,您可以将它们放在DD:MM:SS的单个单元格中。两种方法都可以接受,但是您的公式将需要区别对待。为什么?因为如果您以DD:MM:SS输入纬度和经度,则Excel会在内部将它们转换为时间值,而您只需要考虑该转换即可。

无论如何,您都需要将纬度和经度转换为以弧度为单位的十进制值。如果在三个单独的单元格(度,分和秒)中都有一个坐标,则可以使用以下公式将其转换为以弧度表示的十进制值:

=RADIANS((Degrees3600+Minutes60+Seconds)/3600)

该公式为您的度数,分钟和秒使用命名范围。它将这三个值转换为代表总度数的单个值,然后使用RADIANS函数将其转换为弧度。

如果您以32度,48分钟和0秒的值开始,则该公式最终将如下所示:

=RADIANS((323600+4860+0)/3600)

=RADIANS((115200+2880+0)/3600)

=RADIANS(118080/3600)

=RADIANS(32.8)

=0.572467995

如果将DD:MM:SS格式的坐标存储在单个单元格(在此示例中为E12单元格)中,则可以使用以下公式将其转换为以弧度表示的十进制值:

=RADIANS((DAY(E12)86400+HOUR(E12)3600+MINUTE(E12)*60+SECOND(E12))/3600)

假设单元格E12包含32:48:00,则公式以如下形式结束:

=RADIANS((186400+83600+48*60+0)/3600)

=RADIANS((86400+28800+2880+0)/3600)

=RADIANS(118080/3600)

=RADIANS(32.8)

=0.572467995

使用以弧度为单位的坐标时,可以使用三角公式来计算沿球体表面的距离。可以使用许多这样的公式。以下公式足以满足我们的目的:

=ACOS(SIN(Lat1)SIN(Lat2)+COS(Lat1)COS(Lat2)COS(Lon2-Lon1))180/PI()*60

在这个公式中,每个纬度(Lat1和Lat2)和经度(Lon1和Lon2)坐标都必须是一个以弧度为单位的十进制值,如前所述。该公式返回一个以海里为单位的值,然后您可以将其应用于各种公式,以便根据需要转换为其他度量单位。

您应该认识到,通过使用任何公式来计算球体表面上的距离而得出的值都会产生一些错误的结果。为什么?因为地球不是一个完美的球体。因此,距离应仅视为近似值。如果您想获得更高的精度,则可以使用以下公式确定您的海里里程:

=ACOS(SIN(Lat1)SIN(Lat2)+COS(Lat1)COS(Lat2)COS(Lon2-Lon1))3443.89849

此公式将地球半径(3443.89849海里)替换为球体半径(180 / PI()* 60或3437.746771)。无论哪种方式,答案都仍应视为近似值。

如您所知,计算距离的公式很长。您可能会发现开发自己的用户定义函数会更容易,该函数将为您进行计算。以下函数采用四个值(两对经度和纬度,以度为单位),然后以海里为单位返回结果:

Function CrowFlies(dlat1, dlon1, dlat2, dlon2)

Pi = Application.Pi()

earthradius = 3443.89849  'nautical miles

lat1 = dlat1  Pi / 180     lat2 = dlat2  Pi / 180     lon1 = dlon1  Pi / 180     lon2 = dlon2  Pi / 180

cosX = Sin(lat1)  Sin(lat2) + Cos(lat1) _        Cos(lat2) * Cos(lon1 - lon2)

CrowFlies = earthradius * Application.Acos(cosX)

End Function

如果您希望对纬度和经度以及所涉及的数学有更深入的讨论,可以在此站点上找到大量的文章:

http://mathforum.org/library/drmath/sets/select/dm_lat_long.html

掌握数学知识之后,您就可以开始考虑可以使用的各种公式了。此网页上的VBA中有一个有趣的内容:

http://www.freevbcode.com/ShowCode.asp?ID=5532

在Chip Pearson的站点上也可以找到很好的通用讨论,网址为:

http://www.cpearson.com/excel/LatLong.aspx

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3275)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: