-[CLLocation distanceFromLocation:] 或 MKMetersBetweenMapPoints 后面写了啥代码?

Posted

技术标签:

【中文标题】-[CLLocation distanceFromLocation:] 或 MKMetersBetweenMapPoints 后面写了啥代码?【英文标题】:What code is written behind -[CLLocation distanceFromLocation:] or MKMetersBetweenMapPoints?-[CLLocation distanceFromLocation:] 或 MKMetersBetweenMapPoints 后面写了什么代码? 【发布时间】:2014-01-20 18:43:13 【问题描述】:

我会感谢任何可以向我解释这些方法之一(或两者)如何工作的算法的人:

我有两个 CLLocationCoordinate2D 或两个 MKMapPoints - 我应该执行哪些计算来计算它们之间相对于真实世界表面的距离? (显然,欧几里得距离的独立计算不适用于此任务。)

背景:我想知道这些方法的内部知识是否有助于我优化涉及 MapKit 地图上大量点的一些计算。

【问题讨论】:

类似this 或者this 或者the answer to one of these questions? 描述您想要对一组点执行的计算并提出一个关于优化的问题似乎更有帮助。目前,您正在询问一个框架方法的实现细节,该方法可能会发生变化,并且可能不为 Apple 以外的人所知。 @DavidRönnqvist, this one is closer. @NikolaiRuhe,感谢您的回答。我在这里问的不是关于 Apple API 的严格实现,而是关于它们如何实现它们的提示。老实说,我觉得我在发布后问了一个模糊的问题。 【参考方案1】:

Geographical distance 上的***文章有一些计算测地线距离的公式。

这是我目前正在使用的一段代码,它给出了可接受的结果:

const float EarthRadius = 6378137.0f;

float SquaredGeodesicDistance(CLLocationCoordinate2D a, CLLocationCoordinate2D b)

    float dtheta = (a.latitude - b.latitude) * (M_PI / 180.0);
    float dlambda = (a.longitude - b.longitude) * (M_PI / 180.0);
    float mean_t = (a.latitude + b.latitude) * (M_PI / 180.0) / 2.0;
    float cos_meant = cosf(mean_t);

    return (EarthRadius * EarthRadius) * (dtheta * dtheta + cos_meant * cos_meant * dlambda * dlambda);


float GeodesicDistance(CLLocationCoordinate2D a, CLLocationCoordinate2D b)

    return sqrtf(SquaredGeodesicDistance(a, b));

【讨论】:

明天我会测试你的例子。现在我可以说,当您处理基于 CLLocationDegrees(基于双精度)的 CLLocationCoordinate2D 时,使用浮点数是非常危险的 - 您很可能会在计算中失去精度。 然后我猜是用 double 代替?算法不应该有很大的不同吗?无论如何,该算法已经是一个粗略的近似值,但坐标和距离通常不需要精确到米(至少在我的应用程序中) 另请注意,这将为您提供远距离的结果(想想> 1000km)。就像我说的,如果您的应用程序需要更精确的内容,请查看我链接到的***页面,了解更复杂但更准确的算法。 是的,双倍或 CLLocationDegrees。这取决于上下文,使用 CGFloat 是否会导致一些非常难以调试的问题,就像我遇到的那样;)。谢谢你的回答。 我已经测试了你的代码。实际上,与 distanceFromLocation: 和 MKMetersBetweenMapPoints 相比,它给出了可接受的结果。两个注释来完善您的答案:1)您是否介意更改代码以使用 CLLocationDegrees 而不是 float 2)既然您使用平方地球半径 - 为什么不将其用作 const 呢?

以上是关于-[CLLocation distanceFromLocation:] 或 MKMetersBetweenMapPoints 后面写了啥代码?的主要内容,如果未能解决你的问题,请参考以下文章

需要归档 CLLocation 数据

寻找最近的CLLocation

带有纬度和经度的 CLLocation 对象

无法创建 CLLocation 对象

在 Swift 中将 CLLocation 转换为 MKMapItem

CLLocation 如何实现 Equatable 协议?