簡體   English   中英

查找相鄰多邊形 - 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與在子查詢中找到的表等同起來。

直接的答案是

SELECT a.*
FROM polygon1 as a
JOIN polygon1 as b
ON st_intersects((st_buffer(a.the_geom,0.00001)),b.the_geom) 
where b.id = 561334;

在我的機器中測試過,它還提供了你在哪個類中給出的id。 我的多邊形表格的空間參考 - EPSG:4326 ...

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM