距离IOS地图中当前位置的最近位置

时间:2017-10-31 11:17:48

标签: ios objective-c mapkit

在地图视图上有一个按钮,用于计算我在地图上绘制的位置的最近位置。我已经应用了一些代码,但是当我点击按钮时,应用程序会因为出现此错误而崩溃,

  

[__ NSDictionaryI坐标]:无法识别的选择器发送到实例0x174e61b40       2017-10-31 15:20:00.434548 GuardsAutoZone [735:114166] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [__ NSDictionaryI坐标]:无法识别的选择器已发送例如0x174e61b40'       * 第一次抛出调用堆栈:   (0x1937d11b8 0x19220855c 0x1937d8268 0x1937d5270 0x1936ce80c 0x10011cec8 0x1996bbd30 0x1996bbcb0 0x1996a6128 0x1996bb59c 0x1996bb0c4 0x1996b6328 0x199686da0 0x199e7075c 0x199e6a130 0x19377eb5c 0x19377e4a4 0x19377c0a4 0x1936aa2b8 0x19515e198 0x1996f17fc 0x1996ec534 0x1000fc994 0x19268d5b8)   libc ++ abi.dylib:以NSException类型的未捕获异常终止   (LLDB)

我的代码是这样,我怀疑我的代码是否适合查找最近的位置?我使用的代码是,

- (IBAction)nearLocation:(id)sender {
CLLocation *userLocation = self.mapView.userLocation.location;
NSMutableDictionary *distances = [NSMutableDictionary dictionary];

for (MapPin *obj in locations) {
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:obj.coordinate.latitude longitude:obj.coordinate.longitude];
    CLLocationDistance distance = [loc distanceFromLocation:userLocation];

    NSLog(@"Distance from Annotations - %f", distance);

    [distances setObject:obj forKey:@( distance )];


}

NSArray *sortedKeys = [distances allKeys];
NSLog(@"List %@",sortedKeys);
//NSArray *closestKeys = [sortedKeys subarrayWithRange:NSMakeRange(0, MIN(3, sortedKeys.count))];

 // NSArray *closestAnnotations = [distances objectsForKeys:closestKeys notFoundMarker:[NSNull null]];


}

错误屏幕截图是, enter image description here

2 个答案:

答案 0 :(得分:0)

使用这组代码获取两个纬度和经度之间的距离。

目标C

@class CLLocation

CLLocation *location1 =[[CLLocation alloc] initWithLatitude:[@"23.039698" doubleValue] longitude:[@"77.571663" doubleValue]];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:[@"23.0422" doubleValue] longitude:[@"72.5644" doubleValue]];
CLLocationDistance distanceMeter = [location distanceFromLocation:location2];

Swift

import CoreLocation

let location1 = CLLocation(latitude: 5.0, longitude: 5.0)
let location2 = CLLocation(latitude: 5.0, longitude: 3.0)

let distanceInMeters = location1.distance(from: location2)

上面的代码将以米为单位给出距离。

一旦您通过坐标获得两个注释之间的距离,您就可以根据您的要求实现相同的距离。

答案 1 :(得分:0)

似乎locationsNSDictionary的数组。在for循环中,您将元素转换为MapPin*,但这只会让编译器感到满意。访问obj.coordinate.latitude会在对象coordinate上调用选择器obj。异常告诉我们它是一个NSDictionary对象。

检查运行时真正的对象locations,并相应地更改代码。