获取半径内的位置
Posted
技术标签:
【中文标题】获取半径内的位置【英文标题】:Get locations within a radius 【发布时间】:2013-07-09 13:02:09 【问题描述】:我正在开发 ios 应用程序,我想在其中找到某个半径内的所有位置。
objective-c 中是否有任何方法可以让我指定固定半径和位置,并告诉我哪些位置在该半径内?
我做了一些研究,我得到了这个代码sn-p,
- (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);
];
但它会崩溃并显示错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[CLPlacemark distanceFromLocation:]:
我走对了吗?这是一种从我指定的位置查找所有位置的方法吗?
提前致谢。
编辑:
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);
当我记录我的 closeLocations
数组时,它显示 null(Empty) 值。我在 testLocations 中提供的坐标靠近我当前的位置。
【问题讨论】:
您有一个位置(坐标)列表,并且您想找到在另一个坐标的设定距离内的位置?您不需要为此进行地理编码。你的源数据是什么? 我有数据库中所有位置的纬度和经度。我想找出我当前的latitude
和longitude
附近的经纬度。
我的代码有什么问题?我的placemarks array
应该包含所有位置名称吗?
【参考方案1】:
您在代码中尝试执行的是地理编码,这是将坐标转换为地址的过程,而不是您想要执行的操作。相反,您需要更基本的坐标边界。您可以在上面的代码中使用 distanceFromLocation:
方法并遍历您的坐标,将它们转换为 CLLocation
对象(如果它们还没有),然后检查到您的中心点的距离。
我可能会使用filteredArrayUsingPredicate
和使用predicateWithBlock
创建的谓词来进行距离检查,而不是使用indexesOfObjectsPassingTest
(除非您出于某种原因确实需要索引)。
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];
【讨论】:
很好的解释... :) 你能告诉我同样的代码 sn-p 吗? 在第一行testLocations
将是我的数据库中的纬度和经度数组?
是的,但请确保是 CLLocation
的实例。所以你可能需要使用initWithLatitude:longitude:
来生成数组。
它崩溃了,看看我的 EDIT 它显示了Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString distanceFromLocation:]:
CLLocation
提供coordinate
属性以上是关于获取半径内的位置的主要内容,如果未能解决你的问题,请参考以下文章