【发布时间】:2015-06-20 07:36:37
【问题描述】:
我有一个 SQLite 数据库,其中包含多个位置的纬度和经度。
我想从我的 SQLite 数据库中找到距离我当前位置 15 公里半径范围内的所有位置的纬度和经度。
我的 SQLite 查询会是什么?
【问题讨论】:
标签: iphone swift sqlite location
我有一个 SQLite 数据库,其中包含多个位置的纬度和经度。
我想从我的 SQLite 数据库中找到距离我当前位置 15 公里半径范围内的所有位置的纬度和经度。
我的 SQLite 查询会是什么?
【问题讨论】:
标签: iphone swift sqlite location
纬度差1度等于111公里,经度差1度等于94公里。因此,现在检查与您当前位置相差 (+/-)(15/111) 的所有纬度和与您当前位置相差 (+/-)(15/94) 的经度。 重要link供参考。
【讨论】:
你可以使用这个改编自@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
}
您可以像这样将它与 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])
注意:结果未排序。
【讨论】:
要按升序排列它们,请将所有距离存储在带有键的字典中。喜欢,
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);
这将为您提供按升序排序的结果距离数组。
【讨论】: