我是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_Distance,ST_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)
?它会在高数据量搜索下存活吗?
答案 0 :(得分:2)
我曾经听说过ST_DWithin是最快的,实际上在documentation他们说在较新的版本中ST_DWithin已被调整。
在1.3之前,ST_Expand通常与&amp;&amp;和和 ST_Distance在1.3.4之前的这个函数中实现了相同的效果 对于那种结构来说,它基本上是简洁的。从1.3.4开始,ST_DWithin 使用更短距离的功能,这应该使它更多 对于较大的缓冲区域,效率高于先前版本。
它还使用了边界框比例和索引:
此函数调用将自动包含一个边界框 比较,将使用可用的任何索引 的几何形状。