哪种接近函数提供最快,并在postGIS中使用空间索引?

时间:2011-12-08 09:37:09

标签: postgresql postgis spatial-index

我是PostgreSQL / PostGIS的新手。我正在评估它来解决一个简单的算法:尝试找到半径(米)中的所有点。这是我的表:

=> \d+ theuser;
                         Table "public.theuser"
  Column  |          Type          | Modifiers | Storage  | Description 
----------+------------------------+-----------+----------+-------------
 id       | bigint                 | not null  | plain    | 
 point    | geometry               |           | main     | 
Indexes:
    "theuser_pkey" PRIMARY KEY, btree (id)
    "point_index" gist (point)
Referenced by:
    ...
Has OIDs: no

我在point列中添加了一个gist索引,我不知道它是否是正确的设计。 插入的所有“点数”均为SRID=4326

似乎有两种方法可以获得附近的分数:

ST_DistanceST_Distance_Sphere。 以2为例:

select * from theuser where
ST_distance_sphere(point , ST_GeomFromText('POINT(120.9982 24.788)',4326)) < 100;

我想知道哪种算法使用“point_index”?如果有数百万点,那么两者都可以执行得非常快吗?

另一个问题,我怎样才能查询单元格的SRID(我找不到答案)? 我所能做的就是通过hibernate-spatial-postgis获取“com.vividsolutions.jts.geom.Point”,并从返回的点获取SRID。我如何在SQL中查询它?感谢。

环境:

=> select version();
                                                  version                                                  
-----------------------------------------------------------------------------------------------------------
 PostgreSQL 8.4.9 on i486-pc-linux-gnu, compiled by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit

=> SELECT postgis_lib_version();
 postgis_lib_version 
---------------------
 1.4.0

----更新----

谢谢@filiprem,我试过了:

=> explain select * from theuser where
ST_distance_sphere(point , ST_GeomFromText('POINT(120.9982 24.788)',4326)) < 100;
                                                          QUERY PLAN                                                           
-------------------------------------------------------------------------------------------------------------------------------
 Seq Scan on theuser  (cost=0.00..1.15 rows=3 width=2644)
   Filter: (st_distance_sphere(point, '0101000020E610000080B74082E23F5E407D3F355EBAC93840'::geometry) < 100::double precision)
(2 rows)

我如何知道它是否使用"point_index" gist (point)?它会在高数据量搜索下存活吗?

1 个答案:

答案 0 :(得分:2)

我曾经听说过ST_DWithin是最快的,实际上在documentation他们说在较新的版本中ST_DWithin已被调整。

  

在1.3之前,ST_Expand通常与&amp;&amp;和和   ST_Distance在1.3.4之前的这个函数中实现了相同的效果   对于那种结构来说,它基本上是简洁的。从1.3.4开始,ST_DWithin   使用更短距离的功能,这应该使它更多   对于较大的缓冲区域,效率高于先前版本。

它还使用了边界框比例和索引:

  

此函数调用将自动包含一个边界框   比较,将使用可用的任何索引   的几何形状。