1

我有一个带点的几何表。所有点都有唯一的 ID。现在我想进行查询,选择一个点(id 为 34567)并围绕该点进行 5 公里的缓冲区分析。我的目标是选择距离所选点超过 5 公里的所有点。所有数据都存储在一张表中。

我尝试了以下方法,

SELECT D.id, D.geometry, S.id, S.geometry
FROM points AS D, points AS S
WHERE not ST_DWithin(D.geometry, S.geometry, 5000) AND D.id not like '34567'

但是查询永远运行。

我究竟做错了什么?

所有答案表示赞赏

4

2 回答 2

3

最初编写的查询是回答这个问题的一种非常低效的方式,因为它本质上涉及空间自连接,而实际上,OP 只想知道距离 id=34567 的单点超过 5 公里的点. 如果您想为每个点查找距离所有其他点超过 5 公里的所有点,则将使用自连接,这本质上是一个 0(n^2) 操作。

对原始查询的解释将显示一个嵌套循环,其中包含两个全序列扫描(即点 A 和点 B)以及 ST_DWithin 的空间连接。

查询可以更好地写为

SELECT count(S.id) FROM points AS S WHERE not ST_Dwithin(S.geometry, 
(select geometry from points where id=34567), 5000);

假设在 id 上有一个索引,在几何上有一个空间索引。

于 2014-01-28T08:21:49.820 回答
0

感谢约翰·巴萨。我是新手,但 PostGIS 手册中的所有示例都将几何特征作为文本包含在内,这在日常生活中不太实用。问题是结果还将返回作为参考的点(34567)。所以设置距离为0,返回原点,或者count=1。我想最快的解决方案是做一个EXCEPT

SELECT S.id, S.geometry FROM points AS S WHERE not ST_Dwithin(S.geometry, 
(select geometry from points where id=34567), 5000)
EXCEPT
SELECT S.id from POINTS where id=34567

但是你必须放id两次,这对我来说也不是很有效。

于 2015-02-13T17:32:29.207 回答