2012-08-24 39 views
0

我有一個帶有點的幾何表。所有積分都有唯一的ID。現在我想查詢我選擇哪一點(ID爲34567),並圍繞此點做5公里的緩衝區分析。我的目標是選擇距離選定點超過5公里的所有點。所有數據都存儲在一個表中。在子查詢中使用ST_DWithin(PostGIS)

我有一個具有以下嘗試,

SELECT D.id,D.geometry,S.id,S.geometry FROM點爲d,分爲S 哪裏都不ST_DWithin(D.geometry,S .geometry,5000)AND D.id不喜歡'34567'

但是查詢永遠運行。

我在做什麼錯?

所有答案讚賞

+0

好的我找到了解決方案 – user1621922

+4

很高興知道您找到解決方案,並感謝您分享! http://xkcd.com/979/ – Pierre

+0

@Pierre,不錯的鏈接。我無法告訴你發生過多少次這樣的事情。 –

回答

2

最初編寫的查詢是回答這個問題的一個非常低效的方式,因爲它本質上涉及的空間自連接,而在事實上,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索引和幾何空間索引。

0

感謝JohnBarça爲此。我是新手,但PostGIS手冊中的所有示例都包含geom特徵作爲文本,這在正常生活中不太實用。 事情是,結果也將返回作爲參考的點(34567)。因此,將距離設置爲0,返回原始點或計數= 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兩次,不打我作爲非常有效的兩種。