Sql 空间群集-将群集属性(id)与作为群集一部分的几何体相关联

Sql 空间群集-将群集属性(id)与作为群集一部分的几何体相关联,sql,cluster-analysis,postgis,Sql,Cluster Analysis,Postgis,我在将一组聚集的几何体与它们自己的特性相关联方面遇到了一些问题 资料 我有一张桌子,上面有一组几何图形 buildings { gid integer, geom geometry(Multipoligon,4326) } 我在“buildings”表中以一定的阈值运行函数。 通过聚类分析,我得到了一个名为“clusters”的表 问题: 我希望将所有几何体及其自身的集群信息提取到一个表中 clustered_building { gid Integer cid Integer geom ge

我在将一组聚集的几何体与它们自己的特性相关联方面遇到了一些问题

资料 我有一张桌子,上面有一组几何图形

buildings {
gid integer,
geom geometry(Multipoligon,4326)
}
我在“buildings”表中以一定的阈值运行函数。 通过聚类分析,我得到了一个名为“clusters”的表

问题: 我希望将所有几何体及其自身的集群信息提取到一个表中

clustered_building {
gid Integer
cid Integer
geom geometry(Multipoligon,4326)
}

 gid |    cid     |       geom            |   
-----+------------+-----------------------+
  1  |     1      | multypoligon(...)     |
  2  |     1      | multypoligon(...)     |
  3  |     1      | multypoligon(...)     |
  4  |     2      | multypoligon(...)     |
  5  |     3      | multypoligon(...)     |
  6  |     3      | multypoligon(...)     |
我所做的(但不起作用) 我一直在尝试使用两个函数/parse-each-MultyGeometry,并使用这个查询提取集群的信息,该查询来自ST_Geometry手册页面的一个标准示例

INSERT INTO  clustered_building (cid, c_item , geom)
SELECT sel.cid, n, ST_GeometryN(sel.geom, n) as singlegeom
FROM ( SELECT cid, geom, ST_NumGeometries(geom) as num
       FROM clusters") AS sel
       CROSS JOIN generate_series(1,sel.num) n
WHERE n <= ST_NumGeometries(sel.geom);
但当我要求根据每个GeometryCollection中的项目数生成一个系列时,它就卡住了。 而且,这个查询不允许我将单个几何体与他自己的特征链接到建筑表中,因为我丢失了“gid”

谁能帮帮我吗, 谢谢


Stefano

我没有您的数据,但是使用一些虚拟值,其中ID 1、2和3相交,ID 4和5相交,您可以执行如下操作:

WITH 
  temp (id, geom) AS 
    (VALUES (1, ST_Buffer(ST_Makepoint(0, 0), 2)),
    (2, ST_Buffer(ST_MakePoint(1, 1), 2)),
    (3, ST_Buffer(ST_MakePoint(2, 2), 2)), 
    (4, ST_Buffer(ST_MakePoint(9, 9), 2)), 
    (5, ST_Buffer(ST_MakePoint(10, 10), 2))),
  clusters(geom) as 
    (SELECT 
        ST_Makevalid(
          ST_CollectionExtract(
              unnest(ST_ClusterIntersecting(geom)), 3)) 
      FROM temp
    )
 SELECT array_agg(temp.id), cl.geom 
   FROM clusters cl, temp 
  WHERE ST_Intersects(cl.geom, temp.geom) 
GROUP BY cl.geom;
如果将最终cl.geom is ST_AsText包装起来,您将看到如下内容:

{1,2,3}|多边形((其中,2.414213562373731-0.4141414141414141414141414141411357373737373737 7-0.76564141414141414141414141414141414141414141135737373737373737373737373737 7 7 7-0 0.4141414141414141414141414141414141414141414141414141417373737373737373737373737-0 0 0 0 0 0 0 0.41414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141427,2.81905966523328 0.180940334766718)

{4,5}|多边形(((10.8190596652333 8.18094033476672,10.6629392246051 7.8888595339608,10.4142135623731 7.58578643762691,10.1111404660392 7.33706077539491,9.76536686473018 7.15224093497743,9.39018064403226 7.03842943919354,9 7,8.60981935596775 7.03842943919354,8.23463313526982 7.15224093497743,7.8888595339608 7.33706077539491,7.58578643762691 7.5857864376269,7.33706077539491 7.88885953396079,7.15224093497743 8.23463313526982

在这里,您可以看到ID 1、2、3位于第一个多边形下方,而ID 4、5位于另一个多边形下方

总体思路是对数据进行聚类,然后将返回的簇与原始数据相交,使用将ID分组在一起,以便返回的多个多边形现在包含原始ID。使用with 3作为第二个参数,结合使用,可拆分ST_ClusterIntersectin返回的几何体集合g返回到行中,将每个相邻簇作为(多)多边形返回。这是因为有时,当几何体与其他相关几何体相交时,例如原始多边形与簇聚多边形相交时,会出现奇怪的舍入效果和非节点交点的GEOS错误等


我最近在gis.stackexchange上回答了一个您可能会觉得有用的问题。

谢谢您的明确回答。我现在将在我的数据集上尝试。我不知道在真实的geom和群集的geom之间运行ST_Intersect的可能性。这样应该可以工作!!:)太好了。再次感谢您!
CROSS JOIN generate_series(1,10)
WITH 
  temp (id, geom) AS 
    (VALUES (1, ST_Buffer(ST_Makepoint(0, 0), 2)),
    (2, ST_Buffer(ST_MakePoint(1, 1), 2)),
    (3, ST_Buffer(ST_MakePoint(2, 2), 2)), 
    (4, ST_Buffer(ST_MakePoint(9, 9), 2)), 
    (5, ST_Buffer(ST_MakePoint(10, 10), 2))),
  clusters(geom) as 
    (SELECT 
        ST_Makevalid(
          ST_CollectionExtract(
              unnest(ST_ClusterIntersecting(geom)), 3)) 
      FROM temp
    )
 SELECT array_agg(temp.id), cl.geom 
   FROM clusters cl, temp 
  WHERE ST_Intersects(cl.geom, temp.geom) 
GROUP BY cl.geom;