在给定初始位置的情况下,我必须获得一个SQLite SQL Sentence,用于按最近的纬度和经度坐标进行排序。
这是我在sqlite数据库中的表的例句:
SELECT id, name, lat, lng FROM items
EXAMPLE RESULT: 1, Museu, 41375310.0, 2175970.0
我必须使用SQLite和该表来实现这一点。我不能使用其他技术,因为这是一个存在的SQlite数据库,我无法改变。
使用Android和SQlite存在实现此目的的方法吗?我检查了很多stackoverflow帖子,我没有找到实现这个目标的方法
由于
答案 0 :(得分:20)
SELECT * AS distance FROM items ORDER BY ABS(location_lat - lat) + ABS(location_lng - lng) ASC
这应该粗略地对MySQL中的距离项进行排序,而应在SQLite中工作 如果你需要对它们进行排序,你可以尝试使用毕达哥拉斯定理(a ^ 2 + b ^ 2 = c ^ 2)来得到精确的距离。
答案 1 :(得分:17)
Darkwater的答案几乎是正确的。 要正确,您需要使用差异的平方。 由于方形函数在SqLite上不可用,您需要自己乘以差值。 无需计算平方根。
SELECT * AS distance FROM items ORDER BY ((location_lat-lat)*(location_lat-lat)) + ((location_lng - lng)*(location_lng - lng)) ASC
答案 2 :(得分:8)
克里斯提出的解决方案:
当我们靠近赤道时,SELECT * AS FROM FROM items ORDER BY((location_lat-lat)*(location_lat-lat)) +((location_lng - lng)*(location_lng - lng))ASC
是正确的。为了让它在其他纬度上正常工作,我建议:
SELECT * AS FROM FROM items ORDER BY ((location_lat-lat)*(location_lat-lat))+((location_lng - lng)*(location_lng - lng)* cos_lat_2 )ASC
我们必须预先计算:
cos_lat_2 = cos(location_lat * PI / 180) ^ 2
问题:
如果我们在赤道并且我们在经度(东或西)移动一度,我们在40,000 km的圆周上移动,表示距离为40.000 / 360.如果我们移动一度纬度(北纬或南方),我们在一个穿过两极的圆上这样做,这也涉及到40.000 / 360的距离(考虑到地球是一个球体)。
但是,如果我们在英格兰南部,纬度为50°,我们在经度(东或西)移动一度,我们在第50个平行线上进行,其周长小于赤道。距离为perimeter_parallel_50 / 360.计算此周长很简单:perimeter_parallel_50 = cos(50)* 2 * PI * EARHT_RADIUS = 0.64 * 40,000 km。如果我们向南或向北移动一度,则不会看到距离的减少。我们移动的周长仍然是40,000公里的周长。
解决方案:
由于location_lat是预先知道的值,我们可以预先计算cos(location_lat)的值,以便它可以用作比例因子,因此经度和纬度的位移是等价的。此外,我们预先设定它以避免必须将它乘以两次。
注:
这仍然是近似值,当移动大距离时会产生错误的结果,特别是在极点附近和穿过第180个子午线时。
答案 3 :(得分:3)
如果您能够加载记录;将它们转换为地点然后use the distanceTo function我建议但是......
您可以使用纯SQL来估算两点之间的距离,并且各种方法都是laid out clearly here。如果您使用简单的计算
,那么您比较的点越远,您的值就越来越不正确如果您自己计算这些内容并且您的位置可以在任何地方,那么如果您要比较国际日期行周围的位置,您可能需要注意价值观。
答案 4 :(得分:3)
如果你知道,1度纬度约为111111米,1度经度是111111 * cos(纬度)米,那么你就可以轻松获得特定广场内的所有地方。
SELECT * FROM items WHERE latitude BETWEEN %f AND %f AND longitude BETWEEN %f AND %f
此查询速度非常快,即使有数百万行也是如此。但不要忘记创建纬度和经度的索引:
CREATE INDEX position ON items (latitude, longitude)
我在Objective-C中使用它来获取当前位置周围3公里范围内的所有景点:
double latDist = 1.0 / 111111.0 * 3.0;
double lonDist = 1.0 / ABS(111111.0*cos(location.coordinate.latitude)) * 3.0;
FMResultSet *results = [database executeQueryWithFormat:@"SELECT * FROM items WHERE latitude BETWEEN %f AND %f AND longitude BETWEEN %f AND %f", location.coordinate.latitude - latDist, location.coordinate.latitude + latDist, location.coordinate.longitude - lonDist, location.coordinate.longitude + lonDist];
您现在可以计算确切距离并对结果进行排序......