在集群数据库上运行PostGIS命令

时间:2014-04-06 19:39:33

标签: sql database postgresql postgis stado

在两个节点上的集群数据库(stado)中使用Postgresql,我想测试这个查询:

select id,position,timestamp from table t1 WHERE id!=0 AND ST_Intersects ((Select ST_Buffer_Meters(ST_SetSRID(ST_MakePoint(61.4019,15.218205), 4326) ,1160006)),position) AND timestamp Between '2013-10-01' and '2013-12-30';

当我在命令行或psql(在协调器上)运行它时,我收到此错误:

Encountered ")" at line 1, column 171.

虽然其他sql命令(插入,更新,选择...等)工作正常。表格中的几何列似乎还可以,所以我不认为安装PostGIS会有问题。

2 个答案:

答案 0 :(得分:2)

一般来说,不要缓冲几何体以进行邻近搜索。通过上面的尝试,它只适用于一个点几何,但在其他查询中,您可能会缓冲表的所有几何,这会使查询变得昂贵,因为它需要创建新的几何,并且无法使用索引。 使用ST_DWithin代替

带有geometry类型的ST_DWithin将使用与空间参考系统相同的距离单位。因此,对于SRID = 4326,这是以度为单位,这对任何方式都没有帮助。但是,如果positiongeography类型,则ST_DWithin将使用以米为单位的距离参数,这更有用。所以WHERE过滤器看起来像:

WHERE id <> 0
  AND ST_DWithin(ST_MakePoint(61.4019, 15.218205)::geography, position, 1160006)
...

这将对距离查询位置1160006米或1160公里的位置进行近距离搜索(顺便说一句,瑞典的,如果您正在考虑的话)。如果positiongeometry类型,您可以考虑更改类型,或者执行强制转换(position::geography)或该投射操作的索引。

答案 1 :(得分:1)

我在PostGis手册中找不到功能ST_Buffer_Meters(),只有ST_Buffer()

无论哪种方式,我无法想象任何函数都需要子查询作为参数。请尝试改为:

SELECT id,position,timestamp
FROM   table t1
WHERE  id <> 0
AND    ST_Intersects(ST_Buffer_Meters(ST_SetSRID(
                     ST_MakePoint(61.4019, 15.218205), 4326), 1160006), position)
AND    timestamp BETWEEN '2013-10-01' AND '2013-12-30';

不要使用timestamp作为标识符。它是基本类型名称和reserved word in SQL