查询PostGis中指定距离内的所有地理点的有效方法?

时间:2018-03-17 16:02:43

标签: postgresql postgis

我在PostGis中有一个表points,其中包含id, city, the_geom这样的列,其中the_geom只是ST_GeomFromText('POINT(121.3937853 31.2086933144)')创建的地理点。
我有大量的位置点,并且对于每个点,我需要选择距离该点不超过1000米的所有表行。

我是PostGis的新手,我有两种可行的方法: a)

SELECT p.id, p.city
  FROM points p
  WHERE ST_DWithin(p.the_geom, ST_GeomFromText('POINT(112.979921623 28.198844793)', 4326)::geography, 1000)";

b)中 我从现有表中创建了另一个表,the_geom创建了ST_Buffer作为

INSERT INTO buffered_points(id, city, the_geom)
  SELECT p.id, p.city, ST_Buffer(p.the_geom, 1000) FROM points p;

然后查询它

SELECT bp.id, bp.city
  FROM buffered_points bp where ST_Contains(bp.the_geom::geometry, ST_GeomFromText('POINT(112.979921623 28.198844793)', 4326)::geometry)");

当然,我将在the_geom的所有这些表的USING GIST (the_geom)列上创建索引。

由于我需要处理的位置数量巨大,因此查询性能对我来说至关重要 因此,我的问题是,方法b)在表现方面优于方法a),表格索引的加速 我想由ST_Buffer创建的多边形可以从GIST索引中受益,但不确定a)的the_geom方法是否可以。

1 个答案:

答案 0 :(得分:0)

事实证明ST_Buffer方法比ST_DWithin方法慢得多。