【问题标题】:Finding neighbouring polygons - postgis query查找相邻多边形 - postgis 查询
【发布时间】:2015-01-08 02:12:09
【问题描述】:

问题: 我有一张满是多边形的桌子(一个国家的地区)。其中一些多边形具有特定的属性,可能会或可能不会检查。在这种情况下,该属性称为“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 提供的这段代码实现的(请参阅下面的答案和 cmets):

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 的原始多边形。 因此,它完美地回答了我的问题。

【问题讨论】:

    标签: postgresql gis postgis


    【解决方案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"

    【讨论】:

    • 感谢您的宝贵意见。但它似乎并不像我希望的那样工作。我刚刚对其进行了测试,它更新了大约 2000 个多边形,而实际上只有 10 个相邻的多边形。 ...哦,我刚刚意识到我是误读你评论的人。对不起。也许有点难以解释。假设我有许多具有特定属性(spread=1)的多边形。现在我想找到这些多边形的所有邻居并将它们的传播值也设置为 1(时间设置为 2)。够清楚吗?
    • 所以,把 spread = 1 放在子查询中。啊,我知道这对你有用,太好了。
    • 如果你想用所有细节更新你的原始问题,如何根据属性更新触摸邻居的,我会赞成。这是个好问题。
    【解决方案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 class 中给出的 id。 我的多边形表的空间参考 - EPSG:4326...

    【讨论】:

    • 使用ST_DWithin而不是不必要且昂贵的ST_Buffer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2017-09-22
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多