【问题标题】:Get all locations within certain radius from SQLite Database in XCode从 XCode 中的 SQLite 数据库获取特定半径内的所有位置
【发布时间】:2015-06-20 07:36:37
【问题描述】:

我有一个 SQLite 数据库,其中包含多个位置的纬度和经度。

我想从我的 SQLite 数据库中找到距离我当前位置 15 公里半径范围内的所有位置的纬度和经度。

我的 SQLite 查询会是什么?

【问题讨论】:

    标签: iphone swift sqlite location


    【解决方案1】:

    纬度差1度等于111公里,经度差1度等于94公里。因此,现在检查与您当前位置相差 (+/-)(15/111) 的所有纬度和与您当前位置相差 (+/-)(15/94) 的经度。 重要link供参考。

    【讨论】:

    • ..他说的(基本上,在以您感兴趣的位置为中心的正方形中查找所有位置。正方形必须用您感兴趣的半径包围圆圈。当你得到数据库中的结果,您运行然后过滤掉正方形内但不在圆内的那些(diffLong^2 + diffLat^2 > radius^2)。
    • @Pradeep 我正在获取半径 15 公里范围内的所有位置纬度和经度。但是我怎样才能按升序排列所有位置?
    • 抱歉,但我没有对坐标进行排序,但我认为这可能会对您有所帮助 stackoverflow.com/questions/12456153/… 它在 C++ 中,但它可能会帮助您实现所需的目标。
    【解决方案2】:

    对于仍在寻找答案的人:

    你可以使用这个改编自@breceivemail's answer [JAVA]的方法获取附近的位置

    这是Swift的翻译版本:

    private func calculateDerivedPosition(point: CGPoint, range: Double, bearing: Double)-> CGPoint {
        let EarthRadius: Double = 6371000
    
        let latA = Double(point.x.degreesToRadians)
        let lonA = Double(point.y.degreesToRadians)
        let angularDistance = range / EarthRadius
        let trueCourse = bearing.degreesToRadians
    
        var lat = asin(sin(latA) * cos(angularDistance) +
                       cos(latA) * sin(angularDistance) *
                       cos(trueCourse))
    
        let dlon = atan2(sin(trueCourse) * sin(angularDistance) * cos(latA),
                         cos(angularDistance) - sin(latA) * sin(lat))
    
        var lon = ((lonA + dlon + Double.pi).truncatingRemainder(dividingBy: (Double.pi * 2))) - Double.pi
    
        lat = lat.radiansToDegrees
        lon = lon.radiansToDegrees
    
        let newPoint = CGPoint(x: lat, y: lon)
    
        return newPoint
    } 
    

    radiansToDegree Extension

    您可以像这样将它与 FMDB(或任何 Sqlite 库)一起使用:

        let center = CGPoint(x: currentLocation.latitude, y: currentLocation.longitude)
        let mult: Double = 1 // mult = 1.1 is more reliable
        let radius: Double = 5000 //in meters
    
        let point1 = calculateDerivedPosition(point: center, range: radius * mult, bearing: 0)
        let point2 = calculateDerivedPosition(point: center, range: radius * mult, bearing: 90)
        let point3 = calculateDerivedPosition(point: center, range: radius * mult, bearing: 180)
        let point4 = calculateDerivedPosition(point: center, range: radius * mult, bearing: 270)
    
        let result = try!db.executeQuery("SELECT * FROM items WHERE lat > ? AND lat < ? AND lng < ? AND lng > ?" , values: [point3.x, point1.x, point2.y, point4.y])
    

    注意:结果未排序。

    【讨论】:

      【解决方案3】:

      要按升序排列它们,请将所有距离存储在带有键的字典中。喜欢,

       distanceDic = [[NSMutableDictionary alloc]initWithObjectsAndKeys:[NSNumber numberWithFloat:distanceVal],@"distance",nil];
      
       [distanceArray addObject:distanceDic];
      

      在这里,distanceDic 是我的字典, distaceVal 是包含距离的字符串。 distanceArray 是包含距离的 NSMutableArray。 现在对 distanceDic 进行排序,

      NSArray *array = [NSArray arrayWithArray:[distanceArray mutableCopy]]; // Copying NSMutableArray to NSArray.
      NSSortDescriptor *sortDescriptor;
      
      sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES];
      
      NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
      
      array = [array sortedArrayUsingDescriptors:sortDescriptors];
      
      NSLog(@"#The Final Distance Array After Sorting :%@",array);
      

      这将为您提供按升序排序的结果距离数组。

      【讨论】:

        猜你喜欢
        • 2012-08-21
        • 1970-01-01
        • 2013-08-30
        • 2019-05-08
        • 2016-05-08
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        相关资源
        最近更新 更多