使用distanceFromLocation:on无CLLocation对象?

时间:2011-01-25 17:48:12

标签: iphone objective-c cocoa-touch

我已经定义了一个符合MKAnnotation协议的名为FGLocation的类,我要做的是测量其中两个对象之间的距离。我注意到我可以使用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> {

1 个答案:

答案 0 :(得分:2)

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

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