Postgres - 查找成对的邻居多边形

Postgres - Find pairs of neighbours polygons

我有一个 ID(多边形)列表,在 table(即 table 区域 )中,我有这些的所有可能排列身份证。在另一个 table(即 zonesid)中,我有它们相应的几何图形 [geometry(MultiPolygon,4326)].

table zones:
 index | zone1  | zone2 
-------+--------+--------
     0 |    100 |    100
     1 |    100 |    101
     2 |    100 |    102
     3 |    101 |    100
     4 |    101 |    101
     5 |    101 |    102
     6 |    102 |    100
     7 |    102 |    101
     8 |    102 |    102

table zonesid:
 index | zone_id | geom 
-------+--------+--------
     0 |    100 |  geom100  
     1 |    101 |  geom101
     2 |    102 |  geom102

现在我需要找出哪些区域是相邻的,然后在该对旁边写一个 1。

我已经阅读了问题 Finding neighbouring polygons - postgis query,我想我需要类似的东西,即使在这种情况下我需要让它指明确切的对。

在上面的例子中,假设只有 100 和 102 是相邻的。应该是:

table zones:
 index | zone1  | zone2   | adiacent
-------+--------+---------+--------
     0 |    100 |    100  |    0
     1 |    100 |    101  |    0
     2 |    100 |    102  |    1
     3 |    101 |    100  |    0
     4 |    101 |    101  |    0
     5 |    101 |    102  |    0
     6 |    102 |    100  |    1
     7 |    102 |    101  |    0
     8 |    102 |    102  |    0

我开始于:

ALTER TABLE zones
ADD COLUMN adjacent bigint;

UPDATE zones set adjacent=1, time=2
  FROM (
     SELECT (*)
       FROM zonesid as a,
            zonesid as b,
            zones as c,
            zones as d
       WHERE ST_Touches(a.geom, b.geom) 
       AND c.zone1 != d.zone2
     ) as subquery
 WHERE c.zone1 = subquery.zoneid

但是...我正在努力了解如何正确引用 table zoneid 来比较这些对,然后得到它们是什么。

我的一位同事帮助了我(再次感谢!)。我 post 对我有用的答案,以防它对其他人有用:

with adjacent_pairs as (
select
a.zone_id zone_id_1,
q.zone_id zone_id_2
from zonesid a
cross join lateral (
select zone_id
from zonesid b
where
st_dwithin(a.geom, b.geom, 0)
and a.zone_id != b.zone_id
) q
)
update zones a
set adjacent = 1
from adjacent_pairs b
where
a.zone_a = b.zone_id_1
and a.zone_b = b.zone_id_2;

update zones
set adjacent = 0
where adjacent is null;