distanceFromLocation方法如何工作?

我经常使用distanceFromLocation方法来获取CLLocation对象与其他位置的距离。 枚举CLLocations数组,然后使用此方法将每个CLLocations与我的参考位置进行比较。

我很想知道使用distanceFromLocation的处理/内存含义,特别是对于大量的CLLocation对象。 这个方法是如何工作的 – 它是连接到服务器来获取数据,还是根据一些数学公式计算距离,例如Haversine公式 ?

是否有更有效的方法来比较1个参考位置和CLLocation对象数组之间的距离?

他们可能正在使用余弦球面定律代替Haversine( 为什么?看这个问题 )。

如果您想要做的就是将多个点与一个点进行比较以查看哪个点最接近,那么您可能不关心计算距离的准确性和性能。 在这种情况下,也许使用毕达哥拉斯定理对你有用。

所有这些算法都在此网页上详细说明,部分内容如下:

 If performance is an issue and accuracy less important, for small distances Pythagoras' theorem can be used on an equirectangular projection:* 

您可以使用毕达哥拉斯定理实现一个函数,然后将其与CLLocation中的函数进行基准测试,并与我使用余弦球面定律的distanceInMetersFromRadians的实现进行比较,以查看有多少性能差异。

从文档:

distanceFromLocation:

该方法通过跟踪它们之间的跟随地球曲率的线来测量两个位置之间的距离。 得到的弧是平滑的曲线,并没有考虑两个位置之间的特定高度变化。

所以,是的,我认为它使用的是Haversine公式(或其修改)。

你用过仪器测量过吗? 在你完成之前,它毫无意义。

你可以走捷径。 假设您想要最近的点。 找到一个能够为您提供大致正确结果的公式。 通常有一个平方根,所以得到一个距离平方的公式 – 这更快,也可以。 找到最近的公式点。 现在说根据你的公式,最近的点相距178.96米。 然后,您可以使用确切的公式检查所有小于180米的点。

对于小距离和iOS 9,我发现distanceFromLocation获得的值与使用WGS-84椭圆体的Vincenty公式找到的值非常接近。 根据我的经验,它们在大约7或8个有效数字内是准确的。

球面模型,例如余弦定律或Haversine公式,对于小距离不能很好地比较。

有关更多信息,请参阅geopy文档和值表以进行比较 。