如何在一个点附近快速获得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(任意)行记录(卡片)。
我可以使用相同的查询但是:
如果让我们承认我把
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 张记录卡?
谢谢
您可以直接在 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
在这个例子中:
我在找记录线(postgis中的卡片),距离10公里。然后我想在视图中显示它并为其添加分页;返回结果是5条记录还是20000条并不重要
现在,我想知道靠近 A(lon,lat)的 13(任意)行记录(卡片)。
我可以使用相同的查询但是:
如果让我们承认我把
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 张记录卡?
谢谢
您可以直接在 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