使用最近的纬度和附近的SQLITE进行订购经度坐标

时间:2012-10-01 11:53:00

标签: java android sqlite latitude-longitude

在给定初始位置的情况下,我必须获得一个SQLite SQL Sentence,用于按最近的纬度和经度坐标进行排序。

这是我在sqlite数据库中的表的例句:

SELECT id, name, lat, lng FROM items

EXAMPLE RESULT: 1, Museu, 41375310.0, 2175970.0

我必须使用SQLite和该表来实现这一点。我不能使用其他技术,因为这是一个存在的SQlite数据库,我无法改变。

使用Android和SQlite存在实现此目的的方法吗?我检查了很多stackoverflow帖子,我没有找到实现这个目标的方法

由于

5 个答案:

答案 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];

您现在可以计算确切距离并对结果进行排序......