【问题标题】:Postgres - Find pairs of neighbours polygonsPostgres - 查找邻居多边形对
【发布时间】:2021-02-16 16:51:00
【问题描述】:

我有一个 ID 列表(多边形)和一个表(即表 zones)我有这些 ID 的所有可能排列。在另一个表中(即 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

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

【问题讨论】:

    标签: postgresql gis postgis


    【解决方案1】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2020-01-29
      • 2014-01-22
      • 2017-09-22
      相关资源
      最近更新 更多