通过距离位置计算MAX和MIN纬度和经度 - 目标C.

时间:2014-04-11 14:30:44

标签: ios objective-c swift macos maps

我需要从具有一定距离的位置计算MAX和MIN纬度和经度值。

我在CoreData中存储了数千个位置,我想只显示距用户位置5公里范围内的位置。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

这是一个可能的解决方案:

  1. 将度数转换为Radians的宏

    #define deg2rad(degrees) ((degrees) / 180.0 M_PI)
    
  2. 用于保持搜索距离的宏

    #define searchDistance 5.00 //float value in KM
    
  3. 设置最小和最大纬度,经度值

    float minLat = userLocation.coordinate.latitude - (searchDistance / 69);
    float maxLat = userLocation.coordinate.latitude + (searchDistance / 69);
    float minLon = userLocation.coordinate.latitude - searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69);
    float maxLon = userLocation.coordinate.longitude + searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69);
    
  4. 按如下方式创建谓词

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude <= %f AND latitude >= %f AND longitude <= %f AND longitude >= %f", maxLat, minLat, maxLon, minLon];
    
  5. 这将在userLocation周围创建一个方格,并检查给定位置是否落入其坐标。

      

    更新:Swift 2. *实施

    首先创建一个计算度数到弧度的函数

    func deg2rad(degrees:Double) -> Double{
        return degrees * M_PI / 180
    }
    

    计算并创建最小和最大LatitudeLongitude

    let searchDistance:Double =  5.00 //float value in KM    
    
    let minLat = userLocation.coordinate.latitude - (searchDistance / 69)
    let maxLat = userLocation.coordinate.latitude + (searchDistance / 69)
    
    let minLon = userLocation.coordinate.longitude - searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69)
    let maxLon = userLocation.coordinate.longitude + searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69)
    

    上次创建NSPredicate以查询CoreData的位置信息。在我的情况下,我正在查询值latitudelongitude,但您应该更改此值以匹配您的CoreData对象

    let predicate = NSPredicate(format: "latitude <= \(maxLat) AND latitude >= \(minLat) AND longitude <= \(maxLon) AND longitude >= \(minLon)")
    

答案 1 :(得分:0)

使用CoreLocation方法distanceFromLocation:,它返回两点之间的距离(以米为单位):

CLLocation* location = [[CLLocation alloc] initWithLatitude:lat longitude:lon];
if([userLocation distanceFromLocation:location) < searchDistance)
    // do something with close point

合适的谓词可以构造为:

NSPredicate* predicate = [NSPredicate predicateWithBlock:(BOOL (^)(NSDictionary* target, NSDictionary *bindings)) {
    CLLocation* location = [[CLLocation alloc] initWithLatitude:[target[@"lat"] doubleValue] longitude:[target[@"lon"] doubleValue]];
    return [userLocation distanceFromLocation:location] < searchDistance;
}];

这具有以下优点:它实际返回范围内的项目,而不是接近范围的正方形中的项目。它也(可能,我们不知道细节)使用更准确的范围本身近似。它的缺点是谓词需要加载每个对象,因为它不能表示为sqlite查询。