获取半径内的位置
我正在开发iOS应用程序,我想在其中查找某个半径内的所有位置。
在objective-c中有什么办法可以让我指定一个固定的半径和位置,这将告诉我哪个位置在这个半径内?
我做了一些研究,我得到了这个代码片段,
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray *placemarks, NSError *error) { NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!"); if (error) { NSLog(@"Geocode failed with error: %@", error); return; } CLLocationDistance radius = 30; CLLocation* target = [[CLLocation alloc] initWithLatitude:51.5028 longitude:0.0031]; NSArray *locationsWithinRadius = [placemarks objectsAtIndexes: [placemarks indexesOfObjectsPassingTest: ^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [(CLLocation*)obj distanceFromLocation:target] < radius; }]]; NSLog(@"locationsWithinRadius=%@",locationsWithinRadius); }];
但它得到崩溃,并显示错误:
终止应用程序由于未捕获的exception“NSInvalidArgumentException”,原因:' – [CLPlacemark distanceFromLocation:]:
我正确的方向? 这是一种方法,从我指定的位置find所有的位置?
提前致谢。
编辑:
NSArray *testLocations = @[[[CLLocation alloc] initWithLatitude:19.0759 longitude:72.8776]]; CLLocationDistance maxRadius = 3000; // in meters CLLocation *targetLocation = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude]; //Current location coordinate.. NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(CLLocation *testLocation, NSDictionary *bindings) { return ([testLocation distanceFromLocation:targetLocation] <= maxRadius); }]; NSArray *closeLocations = [testLocations filteredArrayUsingPredicate:predicate]; NSLog(@"closeLocations=%@",closeLocations);
当我login我的closeLocations
数组时,它显示空值(空)。 我在testLocations中提供的坐标接近我的当前位置。
你在代码中要做的是地理编码,这是将坐标转换成地址的过程,而不是你想要做的。 相反,你需要更多的基本坐标边界。 您可以在上面的代码中使用distanceFromLocation:
方法,只需遍历坐标,将它们转换为CLLocation
对象(如果它们尚未),然后检查到中心点的距离。
而不是使用indexesOfObjectsPassingTest
,我可能会使用filteredArrayUsingPredicate
和由predicateWithBlock创build的predicateWithBlock
来做你的距离检查(除非你真的想要索引出于某种原因)。
NSArray *testLocations = @[ [[CLLocation alloc] initWithLatitude:11.2233 longitude:13.2244], ... ]; CLLocationDistance maxRadius = 30; // in meters CLLocation *targetLocation = [[CLLocation alloc] initWithLatitude:51.5028 longitude:0.0031]; NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(CLLocation *testLocation, NSDictionary *bindings) { return ([testLocation distanceFromLocation:targetLocation] <= maxRadius); }]; NSArray *closeLocations = [testLocations filteredArrayUsingPredicate:predicate];