【问题标题】:Fast search of nearest values in SQL在 SQL 中快速搜索最接近的值
【发布时间】:2012-12-31 08:31:09
【问题描述】:

我在 SQLite 数据库中获得了带高度的长/纬度坐标。

一些示例数据:

latitude   longitude  altitude
------------------------------
48.003333  11.0       652    
48.036667  11.000833  651
48.280833  11.000833  533

现在我想要一些 SQL 查询,它会给我最接近给定纬度/经度坐标的高度,例如

给定纬度/经度将是 48.023445/11.000733,因此最接近的是 海拔 651 纬度/经度 48.036667/11.000833。试图搜索很多论坛,但没有任何用处。到处都是关于一个变量或非常慢查询的示例。我非常需要这个查询,并看到了一些基于 UNIONS 的解决方案。我需要它快,因为我将在这张表上进行大约 150 万次查询。我正在使用事务和索引。

【问题讨论】:

  • 您使用的是什么数据库? PostgreSQL?
  • 这可能会帮助stackoverflow.com/questions/1006654/… 或可能使用 postgresql + PostGIS (postgis.org)
  • @MartinŠevic 您的查询是否都是针对矩形区域中的连续点?在这种情况下,您应该为您的问题添加更多上下文。
  • 好的,我有一张指定高度和宽度的图片。每个像素都有自己的 gps 坐标,我要做的就是将高度分配给 everz 像素。

标签: mysql sql performance sqlite


【解决方案1】:

出于您的目的(靠近搜索坐标的点),您不妨使用平面上的距离公式来最小化。

(lat-latitude)*(lat-latitude) + (long-longitude)*(long-longitude)

【讨论】:

    【解决方案2】:

    使用经度和纬度坐标计算球体上两点之间距离的公式远非简单,is described here。如页面中所述,如果点相当接近,您可以使用简单的平面三角法,而只需使用点之间的欧几里得距离:

    【讨论】:

      【解决方案3】:

      我会使用类似于以下查询的内容:

      select * from pos order by ((lat-48.00333)*(lat-48.00333)+(long-11.0)*(long-11.0)+(alt-652)*(alt-652));
      

      SQLite 不支持 SQRT,但由于 SQRT 很单调,您可以在距离公式中跳过它。

      【讨论】:

      • 但我不想计算距离,我只想为地图上的每个像素指定高度。每个像素都有自己的坐标,所以我只想搜索 long=xx.xxxxx 和 lat=yy.yyyyyy 的最近行
      • 据我了解,你试图做类似的事情:foreach y foreach x find最接近点的高度(x,y)这是对的吗?在这种情况下,扫描是 O(n^2),因此这种查询效率很低。
      • 在这种情况下,我将在应用程序级别实现一些缓存。我会在内存中获取一个 500*500 点的窗口,并在此数据中搜索您的点的高度。因此,您将在内存中获取更大的结果集并减少对 DB 的查询。如果出现疼痛未命中,您将不得不获取另一个窗口,但惩罚会更低。查看这个问题 stackoverflow.com/questions/1006654/... 的第二个答案(通过 pitrekkr 获得的网址)了解一些不暗示空间索引的实现思路
      • 我知道有点晚了,但你帮了我。我想你应该知道。我做了一个简单的缓存,其中从数据库中读取当前图片的所有点,并一一插入到 csv 文件中。此外,我在应用程序级别上做了一个算法,它计算了我插入的每个点的确切行(每条记录之间的数据库中有一个顺序)。所以首先加载文件 1800*900 像素大约需要一分钟。由于缓存,此地图上的任何其他加载都会持续大约 2-3 秒。它很好用,因为用户很少更改此文件。
      猜你喜欢
      • 2011-05-11
      • 2011-08-29
      • 1970-01-01
      • 2020-05-21
      • 2020-12-27
      • 1970-01-01
      • 2019-11-03
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多