【问题标题】:How does the distanceFromLocation method work?distanceFromLocation 方法是如何工作的?
【发布时间】:2013-03-11 01:57:11
【问题描述】:

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

我很想知道使用distanceFromLocation 对处理/内存的影响,尤其是对于连续使用大量CLLocation 对象。这种方法是如何工作的 - 它是连接到服务器以获取数据,还是根据一些数学公式计算距离,例如Haversine Formula

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

【问题讨论】:

    标签: ios core-location cllocation


    【解决方案1】:

    来自文档:

    距离位置:

    此方法通过追踪它们之间的一条沿地球曲率的线来测量两个位置之间的距离。生成的弧线是一条平滑曲线,没有考虑两个位置之间的特定高度变化。

    所以是的,我假设它使用的是 Haversine 公式(或它的修改版)。

    【讨论】:

    • 也在位置感知编程指南中:收集位置数据是一项耗电的操作。它涉及启动车载无线电并查询可用的手机信号塔、Wi-Fi 热点或 GPS 卫星,这可能需要几秒钟的时间。
    • @petert 我想我的问题不太清楚,我知道收集位置数据很耗电。我的意思是——在大量位置对象上使用distanceFromLocation 方法效率低吗?有没有更好的方法来比较 CPU/内存密集度较低的位置?
    【解决方案2】:

    他们很可能使用的是球面余弦定律而不是半正弦 (why? see this question)。

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

    所有这些算法在@​​987654322@ 上都有详细说明,其中部分内容是:

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

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

    【讨论】:

    • 应该注意的是,Haversine 公式和所有假设地球是椭球体的基于墨卡托的公式(如 Google、Apple 和 Bing 地图所使用的)都是距离的近似值,不应使用用于需要精确地面测量的 GIS 长度关键计算。 99% 的应用程序使用 Haversine 并依赖内置计算就足够了……对于大多数应用程序来说,它是 +/- 1m,误差为 0.1%,在短距离和远离两极的情况下是可以的。如果您想要完全准确,则需要计算 UTM 或 Lambert 投影中的距离。
    【解决方案3】:

    你用过仪器并测量过吗?在你完成之前,这是没有意义的。

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

    【讨论】:

      【解决方案4】:

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

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

      有关详细信息,请参阅 geopy documentationtable of values for comparison

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 2019-05-20
        • 2012-04-21
        • 2016-07-26
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多