2011-01-25 40 views
2

我已经定义了一个名为FGLocation的类,它符合MKAnnotation协议,我试图做的是测量这两个对象之间的距离。我注意到我可以使用方法distanceFromLocation:它被定义为CLLocation类的方法。正如你在下面看到的,我创建了两个临时CLLocation对象来进行计算,但我不禁想到我可能错过了一个更好/更简单的方法。有没有人对我正在做的事情有什么意见,或者我可以怎样做得更好?使用distanceFromLocation:on none 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]; 

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

@interface FGLocation : NSObject <MKAnnotation> { 

回答

2

我认为,你在做什么是一个公平的做法,与您可能要实现某种形式的重新计算缓存机制/门槛的,如果你经常或上一分不少这样做可能是个例外。准确计算距离涉及非欧几里德几何,并且计算起来很昂贵。 http://en.wikipedia.org/wiki/Haversine_formula

具体情况取决于点位于地球上的,以及是否精度是非常重要的,你也可以通过假装在欧几里得空间进行合作,并借助勾股定理捏造的东西。我已经使用这种方案在大型数据集上创建粗滤器,然后对通过滤波器的点进行更精确的计算。

+0

嗨,这是一个公平的观点,在这个阶段有很少的几点,可能约为36个。你的权利,我不需要担心地球的曲率,因为点都是非常地方的(在大约50公里范围内),并且公平地说,我不会为了超级准确而烦恼,在100米范围内没事的。我主要担心的是,我正在围绕某种方式进行计算,并缺少一些可以直接在我的FGLocation对象上调用distanceFromLocation而不创建两个临时CLLocation对象的pro技巧。很多apprciated。 – fuzzygoat 2011-01-25 18:58:46