【问题标题】:Get all items around a certain point from SQLite Database从 SQLite 数据库中获取某个点附近的所有项目
【发布时间】:2013-04-13 04:12:52
【问题描述】:

我有一个充满地图位置 (Latitude, Longitude) 的数据库,有没有办法可以通过 SQL 查询返回某个位置周围的所有点?

现在我基本上抓取数据库中的所有内容并遍历每一个并使用检查距离

Location.distanceBetween(startPoint.latitude, startPoint.longitude,endPoint.latitude,endPoint.longitude, results);

并保留在设定距离内但可能有很多点需要循环的项目。

那么有没有办法在 SQL 语句中做到这一点?

【问题讨论】:

  • 表结构是什么? “特定位置”是给定值还是表中某一行的值?
  • @TedHopp 特定位置是地图上的某个点,即。只是一个纬度经度。基本上用户在地图上按下以获取纬度/经度

标签: android sqlite


【解决方案1】:

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

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

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

您必须将线性距离(例如,“30 米内”)转换为纬度/经度差异。这是一个相当复杂的主题,因为地球不是一个完美的球体。但是,对于粗略的计算,您可以使用 1 海里 = 1852 米 = 赤道经度的 1 角分的近似值。由于随着纬度远离赤道,经度线越来越靠近,因此您需要使用一些三角函数来确定在给定纬度处使用的 r 的值。有关此问题的更多信息,请参阅this threadthis one,或在网上搜索“将米转换为纬度经度”

【讨论】:

【解决方案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);

【讨论】:

  • 方形区域不起作用,因为我有一个设置,用户可以设置他们想要的半径(以米为单位),这就是我检查的内容。除非我能以某种方式将该距离添加到所选位置
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多