【问题标题】:Using distanceFromLocation: on none CLLocation objects?在没有 CLLocation 对象上使用 distanceFromLocation:?
【发布时间】:2011-06-15 09:11:27
【问题描述】:

我已经定义了一个名为 FGLocation 的类,它符合 MKAnnotation 协议,我想做的是测量其中两个对象之间的距离。我注意到我可以使用方法 distanceFromLocation: 定义为 CLLocation 类的方法。正如您在下面看到的,我正在创建两个临时 CLLocation 对象来进行计算,但我不禁想到我可能错过了更好/更简单的方法。有没有人对我正在做什么或如何做得更好有任何意见?

// IS THERE A BETTER WAY TO DO THIS?
FGLocation *root = [annotations objectAtIndex:counter-1];
FGLocation *leaf = [annotations objectAtIndex:counter];

CLLocation *rootLocation = [[CLLocation alloc] initWithLatitude:[root coordinate].latitude longitude:[root coordinate].longitude];
CLLocation *leafLocation = [[CLLocation alloc] initWithLatitude:[leaf coordinate].latitude longitude:[leaf coordinate].longitude];                                
CLLocationDistance thisDistance = [rootLocation distanceFromLocation:leafLocation];
[rootLocation release];
[leafLocation release];

注意:我的 FGLocation 对象定义为(见下文)我在文档中注意到我不应该继承 CLLocation。

@interface FGLocation : NSObject <MKAnnotation> {

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    我认为您所做的是一种公平的方法,但可能的例外是,如果您经常或在很多方面这样做,您可能希望实现某种缓存机制/重新计算的阈值。准确计算距离涉及非欧几里得几何,并且计算成本很高。 http://en.wikipedia.org/wiki/Haversine_formula

    根据点在地球上的位置以及精度是否非常重要,您还可以假装在欧几里得空间中工作并利用勾股定理来捏造事情。我使用这种方案在大型数据集上创建了粗过滤器,然后对通过过滤器的点进行更精确的计算。

    【讨论】:

    • 嗨,这是一个公平的观点,在这个阶段只有很少的点,可能总共大约 36 个。你的权利,我不需要担心地球的曲率,因为这些点都是非常局部的(在大约 50 公里的范围内),公平地说,我不担心在 100 米以内是否超级准确没事的。我主要担心的是我正在以一种迂回的方式进行计算并且错过了一些专业技术,我可以直接在我的 FGLocation 对象上调用 distanceFromLocation 而无需创建两个临时 CLLocation 对象。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2011-05-07
    • 2014-04-10
    相关资源
    最近更新 更多