【问题标题】:I want to display in postgis files that are less than 10,000meter and their calculated distance我想在小于 10,000 米的 postgis 文件中显示它们的计算距离
【发布时间】:2021-10-02 13:13:43
【问题描述】:

我认为我的查询没有经过优化。

我想对距某个点一定距离的文件(每个文件包含 1 lon 和 1 lat)进行排序,并显示文件与给定点之间距离的计算。

 SELECT  *, ST_DistanceSphere( st_point(lon, lat) , st_point(49.9, 6.7)) as result  from data
  where
  ST_DistanceSphere( st_point(lon, lat) , st_point(49.9 ,6.7)) < 10000

所以我想检索距离小于 10,000 米的点列表,并且结果列包含计算出的距离。 返回结果需要1秒以上。

要么没有优化,要么在 postgis 中还有另一种方法可以更快地得到答案...

您能帮我优化一下这个查询吗?

我的桌子:

        drop table if exists data cascade;
        CREATE TABLE data(
idSERIAL PRIMARY KEY,
        lon float,
        lat float,
      
        );

谢谢

【问题讨论】:

  • 除了索引,为什么不显示创建表并解释您的查询
  • 这篇文章或许能解决你的问题:gis.stackexchange.com/questions/77072/…
  • nbk: 我不知道给 lon 和 lat 添加索引是否能解决我的速度问题
  • anamul:4326 会比我的要求快吗?一开始我试过了,我不相信,然后我可能犯了一个错误
  • SELECT *, ST_DistanceSphere( ST_SetSRID(st_point(lon, lat), 4326) , ST_SetSRID(st_point(6.49413, 49.181477), 4326)) 作为结果来自数据 WHERE ST_DWithin(ST_SetSRID(ST_MakePoint(lon, lat), 4326), ST_SetSRID(ST_MakePoint(6.49413, 49.181476), 4326), 10) 按结果限制排序 10 响应时间比以前更糟

标签: sql postgresql postgis


【解决方案1】:

最简单、最快的方法是将坐标存储为geometrygeography,而不是单独的坐标对:

ALTER TABLE data ADD COLUMN geog geography (point,4326);
UPDATE data SET geog = ST_MakePoint(lon,lat);

之后,在这个新列上创建一个 gist 索引:

CREATE INDEX idx_data_point ON data USING gist (geog) ;

使用ST_DWithin 查询距离,因为ST_DistanceSphereST_Distance使用空间索引!

SELECT ST_Distance(geog,ST_MakePoint(49.9 ,6.7)::geography,true)
FROM data
WHERE ST_DWithin(geog,ST_MakePoint(49.9,6.7),10000,true); 
  • 注意:函数ST_DWithinST_Distance中的true表示use_spheroid=true,这是geography参数的默认值。

演示:db&lt;&gt;fiddle

另请参阅:Getting all Buildings in range of 5 miles from specified coordinates

【讨论】:

  • 好吧,我已经用过那个了……但我没有把索引放在 geog =) 所以这是我的要求:SELECT *, ST_DistanceSphere(st_point(lon, lat), ST_Point(7.5 , 49.9)) 作为结果 FROM data WHERE ST_DWithin(geog,ST_MakePoint(7.5 ,49.9),10000,true) 突然,根据您的回答,我认为仍然可以改进执行,因为我使用 St_distanceSphere 知道距离但是重用geog可能会更好,如何计算射击距离?
  • @Camel4488 查看我的最后编辑:st_distance 和 st_dwithin 末尾的 true 大致意思是“使用球体”
  • 除了感谢您将我分开... 3 我的运行时,我不知道该告诉您什么!我有其他改进要求,我先尝试,然后我会发布它们(在这里或在另一个帖子上)!非常感谢!!
  • @Camel4488 我很高兴它有帮助。在我的另一个答案中,我更详细地处理了 ST_DWithin 和 ST_Distance.. stackoverflow.com/questions/51889155/…欢呼
  • @Camel4488 我相信没有太大区别。即使我们重复相同的查询,第二个查询也会更快:dbfiddle.uk/… 但值得仔细研究 :)
猜你喜欢
  • 1970-01-01
  • 2014-08-28
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多