计算坐标之间的距离,并按顺序列出附近的地点

时间:2011-08-08 12:13:45

标签: iphone objective-c xcode cocoa-touch

我有一系列地点

NSArray *locations = [[NSArray alloc]initWithObjects:loc1, loc2, loc3, loc4, loc5, loc6, loc7, loc8, loc9, nil];

我遍历数组并将当前位置的不同距离存储到另一个数组中的loc1,loc2等,然后从最近到最远的位置对它们进行排序。这就像一个魅力。

但是,我需要将距离与位置名称相关联。例如:如果loc5是最近的地方,那应该在列表的顶部。我知道不同地点的名字,我只需要以某种方式联系它们。

有什么建议吗?

编辑:

考虑到你的建议,我认为我可以这样做:

我有一个包含所有存储距离的数组,让我们调用数组a。

NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithObjects:locations forKeys:a];
NSArray *sortedArray = [a sortedArrayUsingSelector:@selector(compare:)];

for(int i = 0; i <[sortedArray count]; i++){
    CLLocation *loc = [dic valueForKey:[sortedArray objectAtIndex:i]];

    NSLog(@"Lat: %f , Lng: %f" , loc.coordinate.latitude , loc.coordinate.longitude);
}

这样我将得到不同距离的纬度和经度,我可以根据我当地存储的坐标进行检查。然而,这给了我一个错误说:

  

- [NSCFNumber length]:无法识别的选择器发送到实例0x1891f0    * 因未捕获的异常而终止应用   'NSInvalidArgumentException',原因:' - [NSCFNumber length]:   无法识别的选择器发送到实例0x1891f0'

它指向了我的行

CLLocation *loc = [dic valueForKey:[sortedArray objectAtIndex:i]];

线程1:编程接收信号:“SIGABRT”。

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

我会创建一个信息持有者对象,其中包含您不同位置的所有数据(名称,位置,最后计算的距离等),将所有这些对象放入NSMutableArray,然后使用{对其进行排序sortUsingSelector:上的{1}}或sortUsingComparator:方法。

前者需要您在信息持有者上定义一个返回NSMutableArray的选择器,而后者(IIRC)允许您定义一个执行相同操作的块。

答案 1 :(得分:0)

您理论上也可以将名称存储为NSDictionary的键,并将CLLocation s作为值,然后使用keysSortedByValueUsingComparator:方法使用一个块来确定距离在CLLocations和您的参考位置。

这将不再需要明确的信息持有者,但是您可能需要计算大量的处理器时间,因为您需要计算距参考位置的距离以及每次运行时的两个CLLocation s NSComparator阻止。

答案 2 :(得分:0)

首先实现这些代理 - (假设您已经包含coreLocation框架并注册了位置更新。

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
   fromLocation:(CLLocation *)oldLocation
{
    // Handle location updates
} 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    // Handle error
}

可以通过调用结束位置的CLLocation方法并将起始位置作为参数进行计算来计算两个distanceFromLocation:点之间的距离。例如,以下代码计算newLocation和oldLocation指定的点之间的距离:

CLLocationDistance distance = [newLocation distanceFromLocation:oldLocation];