从SQLite数据库获取特定点周围的所有项目

时间:2013-04-19 17:21:40

标签: android sqlite

我有一个包含地图位置(Latitude, Longitude)的数据库,有没有办法让SQL查询返回某个位置周围的所有点?

现在我基本上抓住了数据库中的所有内容并遍历每一个并使用

检查距离
Location.distanceBetween(startPoint.latitude, startPoint.longitude,endPoint.latitude,endPoint.longitude, results);

并保持设定距离内的物品,但可能会有很多要点。

那么无论如何都要在SQL语句中执行此操作?

3 个答案:

答案 0 :(得分:2)

  

我有一个数据库,里面有地图位置(纬度,经度),有没有办法可以做一个SQL查询来返回某个位置周围的所有点?

您可以轻松查看方形区域。

使用非常简化的纬度/经度坐标说你在[25.86,57.03]并且你想要“邻居”(+/- .05)中的所有内容你可以使用这样的查询:

SELECT * FROM Coords WHERE (latitude BETWEEN 25.81 AND 25.91) AND (longitude BETWEEN 56.98 AND 57.08);

答案 1 :(得分:2)

您可以使用WHERE子句表达式来过滤距离原点(x0,y0)的角距离r。由于SQLite没有平方根函数,因此您必须使用平方距离:

SELECT ... FROM ...
    WHERE (Latitude-x0)*(Latitude-x0) + (Longitude-y0)*(Longitude-y0) < r*r;

唯一能够顺利运作的地方是靠近两极或本初子午线。它也是球体的平面近似,因此它仅适用于r非常小的值。最后,它平均地缩放纬度和经度,因此所选区域看起来越来越椭圆,原点离赤道越远。

您必须将线性距离(例如,&#34;在30米内&#34;)转换为纬度/经度差异。这是一个相当复杂的主题,因为地球不是一个完美的球体。但是,对于粗略计算,您可以使用赤道上1海里= 1852米=经度1弧分的近似值。由于当纬度远离赤道时经度线变得更近,因此您需要使用一些触发来确定在给定纬度使用r的值。有关此问题的详细信息,请参阅this threadthis one,或在网络上搜索&#34;将米转换为纬度经度&#34;

答案 2 :(得分:2)

您还可以使用SQLite R*Tree扩展名。

R-Tree是一个专门用于进行范围查询的索引。 R树最常用于地理空间系统,其中每个条目都是一个具有最小和最大X和Y坐标的矩形。

SQLite R * Tree模块的源代码作为SQLite3合并的一部分包含在内,但默认情况下处于禁用状态。要启用R * Tree模块,只需使用定义的SQLITE_ENABLE_RTREE C预处理器宏进行编译。