如何快速获得某点(长、后)邮政编码附近13条记录线 [英] How to quickly get 13 record line near a point (lon, lat) postgis

查看:15
本文介绍了如何快速获得某点(长、后)邮政编码附近13条记录线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

本例中:

i-want-to-display-in-postgis-files-that-are-less-than-10-000meter-and-their-calc

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

现在,我想知道A(Lon,Lat)附近的13行(任意)记录(卡片)。

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

  1. 如果我们承认我把

    SELECT ST_DISTANCE(Geog,ST_MakePoint(49.9,6.7)::Geomacy,TRUE) 从数据 其中ST_DWiThin(geog,ST_MakePoint(49.9,6.7),10000,TRUE);

我必须指定10,000米到ST_DWiThin。 如果我在一个非常大的城市查找这13行记录,很可能在1公里内有100行记录,但在小城镇则不太可能。

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

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

第一个是我当前使用的查询,非常长,在800ms到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

如果我遵循上一篇文章中的建议,我因此修改了查询,如下所示:

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子句中使用运算符<->应用距离函数。为此,规划者将使用GIST索引:

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

这篇关于如何快速获得某点(长、后)邮政编码附近13条记录线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆