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

Pan*_*cho 5 macos maps objective-c ios swift

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

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

我该如何处理这个问题?

Pan*_*cho 8

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

  1. 要将Degrees转换为Radians的宏

    #define deg2rad(degrees) ((degrees) / 180.0 M_PI)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 宏来保持我的搜索距离

    #define searchDistance 5.00 //float value in KM
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建谓词如下

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude <= %f AND latitude >= %f AND longitude <= %f AND longitude >= %f", maxLat, minLat, maxLon, minLon];
    
    Run Code Online (Sandbox Code Playgroud)

这将创建一个方形userLocation并检查给定位置是否落入其坐标.

更新:Swift 2.*实现

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

func deg2rad(degrees:Double) -> Double{
    return degrees * M_PI / 180
}
Run Code Online (Sandbox Code Playgroud)

计算并创建最小值和最大值Latitude以及Longitude

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)
Run Code Online (Sandbox Code Playgroud)

最后创建NSPredicate以查询CoreData位置.在我的情况下,我正在查询值latitude,longitude但你应该改变它以匹配你的CoreData对象

let predicate = NSPredicate(format: "latitude <= \(maxLat) AND latitude >= \(minLat) AND longitude <= \(maxLon) AND longitude >= \(minLon)")
Run Code Online (Sandbox Code Playgroud)