![](/img/trans.png)
[英]Query for spatial intersection (point - polygons in column) using postgreSQL and PostGIS
[英]Finding neighbouring polygons - postgis query
問題:我有一張滿是多邊形的桌子(一個國家的區域)。 這些多邊形中的一些具有可能或可能不被檢查的特定屬性。 在這種情況下,該屬性稱為“spread”,“checked”值為1。
現在我想運行一個查找所有“已檢查”多邊形的查詢。 就像是:
SELECT * FROM gemstat WHERE spread = 1
然后我想在每個尚未檢查的相鄰多邊形中將“spread”屬性設置為“1”。 (我也想設置第二個屬性,但這只是一個小的補充)
首先,讓我們從一個查詢開始,該查詢選擇所有多邊形的多邊形,其中spread-value = 1
SELECT (b."GEM_NR")
FROM gemstat_simple5 as a
JOIN gemstat_simple5 as b
ON ST_Touches((a.the_geom),b.the_geom)
where a.spread =1;
此查詢返回所有多邊形的多邊形,其中spread = 1
現在我想根據該子查詢的結果更新表。 這是通過John Powell aka Barca提供的這段代碼實現的(請參閱下面的答案和評論):
Update gemstat_simple5 gem set spread=1, time=2
FROM (
SELECT (b."GEM_NR")
FROM gemstat_simple5 as a,
gemstat_simple5 as b
WHERE ST_Touches(a.the_geom, b.the_geom)
AND a."GEM_NR" != b."GEM_NR"
AND a.spread = 1
) as subquery
WHERE gem."GEM_NR" = subquery."GEM_NR"
運行此查詢,它將設置擴展為1和時間為2的相鄰多邊形的屬性,而不觸及spread = 1的原始多邊形。因此,它為我的問題提供了完美的答案。
如果您詢問如何基於子查詢更新表,只查找具有鄰居的多邊形(即,它們觸摸另一個多邊形),則以下內容應該適合您。
Update gemstat_simple5 gem set spread=1, time=2
FROM (
SELECT (b."GEM_NR")
FROM gemstat_simple5 as a,
gemstat_simple5 as b
WHERE ST_Touches(a.the_geom, b.the_geom)
AND a."GEM_NR" != b."GEM_NR"
AND a.spread = 1
) as subquery
WHERE gem."GEM_NR" = subquery."GEM_NR"
注意,我已經把AND a。“GEM_NR”<b。“GEM_NR”,它們都避免了AND a。“GEM_NR”= b。“GEM_NR”的情況,即你想要避免的GEM_NR,並且還減少了一半明智的比較。 我也使用a,b where方法而不是st_touches上的連接b,這是相同的,但我發現空間連接更令人困惑。 最后,您只需將要更新的表GEM_NR與在子查詢中找到的表等同起來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.