在两个节点上的集群数据库(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会有问题。
答案 0 :(得分:2)
一般来说,不要缓冲几何体以进行邻近搜索。通过上面的尝试,它只适用于一个点几何,但在其他查询中,您可能会缓冲表的所有几何,这会使查询变得昂贵,因为它需要创建新的几何,并且无法使用索引。 使用ST_DWithin代替。
带有geometry
类型的ST_DWithin将使用与空间参考系统相同的距离单位。因此,对于SRID = 4326,这是以度为单位,这对任何方式都没有帮助。但是,如果position
是geography
类型,则ST_DWithin将使用以米为单位的距离参数,这更有用。所以WHERE过滤器看起来像:
WHERE id <> 0
AND ST_DWithin(ST_MakePoint(61.4019, 15.218205)::geography, position, 1160006)
...
这将对距离查询位置1160006米或1160公里的位置进行近距离搜索(顺便说一句,瑞典的不,如果您正在考虑的话)。如果position
是geometry
类型,您可以考虑更改类型,或者执行强制转换(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。