sto*_*pol 4 gis postgresql postgis
问题:我有一张充满多边形(一个国家的地区)的桌子。其中一些多边形具有可能会或可能不会被检查的特定属性。在这种情况下,该属性称为“spread”,“checked”值为 1。
现在我想运行一个查询来查找所有“检查”的多边形。就像是:
SELECT * FROM gemstat WHERE spread = 1
Run Code Online (Sandbox Code Playgroud)
然后我想在每个尚未检查的相邻多边形中将“spread”属性设置为“1”。(我还想设置第二个属性,但这只是一个小补充)
首先,我们从一个查询开始,该查询选择与分布值 = 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;
Run Code Online (Sandbox Code Playgroud)
此查询返回与 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"
Run Code Online (Sandbox Code Playgroud)
运行此查询,它会将相邻多边形的属性 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"
Run Code Online (Sandbox Code Playgroud)
注意,我把 AND a."GEM_NR" < b."GEM_NR" 放在一起,这既避免了 AND a."GEM_NR" = b."GEM_NR" 的情况,即您想要避免的情况,也减少了两两比较一半。我还使用了 a, bWhere 方法,而不是 st_touches 上的 join b,这是相同的,但我发现空间连接更令人困惑。最后,您只需将要更新的表 GEM_NR 与子查询中找到的表等同起来即可。
| 归档时间: |
|
| 查看次数: |
6605 次 |
| 最近记录: |