寻找相邻的多边形 - PostGIS 查询

4
问题: 我有一个装满多边形(国家地区)的表格。其中一些多边形具有某种可能已经被选中或未被选中的属性。在这种情况下,属性称为“spread”,而“checked”值为1。
现在我想运行一个查询,找到所有“checked”多边形。 类似于:
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(又名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"

运行此查询,它将设置相邻多边形的属性spread为1,time为2,同时不触及spread = 1的原始多边形。 因此,它提供了完美的答案。
2个回答

6
如果您想根据子查询更新表格,只找到那些具有相邻多边形的多边形(即它们与另一个多边形接触),那么以下内容应该适用于您。
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",这样可以避免a."GEM_NR" = b."GEM_NR"的情况,也就是本身,需要避免,并且减少一半的成对比较。我还使用了“a,b Where”方法而不是基于st_touches的“a join b”,尽管两者相同,但是我觉得基于空间连接更加混乱。最后,您只需将正在更新的GEM_NR表与子查询中找到的那些表相等即可。

感谢你的好建议。但它似乎不完全按照我的预期工作。我刚刚测试了一下,它更新了大约2000个多边形,而事实上只有10个相邻的多边形。......哦,我才意识到是我误读了你的评论。对不起。也许有点难以解释。假设我有一些带有特定属性(spread=1)的多边形。现在,我想找到所有这些多边形的邻居,并将它们的spread值也设置为1(并将时间设置为2)。清楚吗? - stopopol
所以,在子查询中将put spread = 1。啊,我看到这对你起作用了,太棒了。 - John Powell
如果您想更新原始问题并包含所有细节,以便基于属性更新相邻的触摸,我会点赞它。这是一个好问题。 - John Powell

2
直接的答案是:
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;

我在我的机器上进行了测试,它也会返回您在where类中提供的id。 我的多边形表的空间参考-EPSG:4326...

输入图像描述


使用 ST_DWithin 而不是不必要且昂贵的 ST_Buffer - Mike T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接