我想在小于 10,000 米的 postgis 文件中显示它们的计算距离

I want to display in postgis files that are less than 10,000meter and their calculated distance

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

我想对距某个点一定距离的文件(每个文件包含 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 米的点列表,并且结果列包含计算的距离。 return 结果需要 1 秒以上。

在没有优化之后,或者在 postgis 中有另一种方法可以更快地获得答案......

你能帮我优化这个查询吗?

我的table:

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

谢谢

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

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

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

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_DWithin and ST_Distance中的true表示use_spheroid=true,这是geography的默认值参数.

演示:db<>fiddle

另请参阅: