获取半径内的位置

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 中提供的坐标靠近我当前的位置。

【问题讨论】:

您有一个位置(坐标)列表,并且您想找到在另一个坐标的设定距离内的位置?您不需要为此进行地理编码。你的源数据是什么? 我有数据库中所有位置的纬度和经度。我想找出我当前的latitudelongitude 附近的经纬度。 我的代码有什么问题?我的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 属性

以上是关于获取半径内的位置的主要内容,如果未能解决你的问题,请参考以下文章

Twitter - 查询特定地理位置半径内的推文

半径内的html5地理位置搜索

SQL查询位置半径内的总点数

获取半径内的附近街道地址

Android geofire获取一定半径内的用户列表

显示用户在PHP中当前位置的10公里半径范围内的用户