postgresql - 查找相邻的多边形 - postgis 查询

标签 postgresql gis postgis

问题: 我有一张满是多边形(一个国家的地区)的 table 。其中一些多边形具有可能会或可能不会被检查的特定属性。在这种情况下,该属性称为“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"

运行这个查询,它会将相邻多边形的属性 spread 设置为 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",即您想要避免的情况,并且还将成对比较减少了一半。我还使用了 a、b Where 方法而不是 st_touches 上的 a join b,这是相同的,但我发现空间连接更容易混淆。最后,您只需将要更新的表 GEM_NR 与在子查询中找到的表等同起来。

关于postgresql - 查找相邻的多边形 - postgis 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26866416/

相关文章:

Postgresql - 平均只有分钟和秒?

postgresql - Postgres 和 PostGis ,无法创建扩展

postgresql - 使用 PostGIS 获取基于位置的数据

php - PostGIS 中的聚类点

SQL 查询 : transform rows to columns

arrays - 将函数返回的数组转换为列

r - 如何在R或ArcGIS中处理多边形shapefile中的“孤立孔”?

postgresql - 使用 Postgis 和 pgRouting 的行车路线

ruby-on-rails - 迁移到 Rails 3.2.1 后关系 "translations"不存在

gis - OpenLayers 文本标签即使有填充也会重叠