如何在一个点附近快速获得13条记录线(lon,lat)postgis

How to quickly get 13 record line near a point (lon, lat) postgis

在这个例子中:

我在找记录线(postgis中的卡片),距离10公里。然后我想在视图中显示它并为其添加分页;返回结果是5条记录还是20000条并不重要

现在,我想知道靠近 A(lon,lat)的 13(任意)行记录(卡片)。

我可以使用相同的查询但是:

  1. 如果让我们承认我把

    SELECT ST_Distance (geog, ST_MakePoint (49.9, 6.7) :: geography, true) 来自数据 WHERE ST_DWithin (geog, ST_MakePoint (49.9,6.7), 10000, true);

我不得不指定10,000米到St_DWithin。 如果我在一个很大的城市里找13条记录,1公里内很可能有一百条,但在一个小镇上就不太可能了。

此外,在我的数据库中,注册行,因此文件按主题分组。所以没有什么告诉我,如果我寻找具有特定主题的卡片,即使在大城市中,第 9 张卡片也可以在 10 公里后找到。

对我来说,我有两种方法:

第一个是我目前正在使用的查询,它很长,在 800 毫秒到 1 秒之间:

 SELECT  *, ST_DistanceSphere( st_point(lon, lat) , st_point(6.5, 48.7)) as result  from data  +
              where
        id_poi != '%s
          order by 13 limit 13

如果我遵循我之前 post 的建议,我会修改查询如下:

SELECT  *, ST_Distance(geog , st_point(6.5, 48.7)) as result  from data 
               where
        id_poi != '%s'
          order by 13 limit 13

但是演出没有。

这有点正常,我有大约 410,000 行要排序,我要求 postgis 计算所有文件的距离,然后对它们进行排序,然后将结果限制为 13。

所以我的问题是,如何获得最接近给定经度和纬度的 13 张记录卡?

for example

谢谢

您可以直接在 ORDER BY 子句中使用运算符 <-> 应用距离函数。这样做规划器将使用要点索引:

EXPLAIN (ANALYSE,COSTS OFF)
SELECT * FROM data
ORDER BY geog <-> ST_Point(6.5, 48.7) 
LIMIT 13;

                            QUERY PLAN
----------------------------------------------------------------------
Limit (actual time=15.019..15.213 rows=13 loops=1)
  ->  Index Scan using idx_data_point on data (actual time=15.017..15.210 rows=13 loops=1)
        Order By: (geog <-> '0101000020E61000000000000000001A409A99999999594840'::geography)
Planning Time: 0.372 ms
Execution Time: 15.309 ms

演示:db<>fiddle