几何

2016-09-14 57 views
1

的名单我是新来的Pos​​tGIS的应用ST_Intersection,那么,对不起,如果这是一个愚蠢的问题。几何

我有一个表多边形的名单,我想找到他们之间的所有的intersetion。 我可以做一个ST_Union没有问题,像这样:

select ST_Union(t.geom) from mytable t

但同样不ST_Intersection

select ST_Intersection(t.geom) from mytable t` ERROR: function st_intersection(geometry) does not exist

工作在文档寻找ST_UnionST_Intersection,他们真的有不同的签名,这表明unlinke ST_Union,ST_Intersection只能应用到2个几何。

有没有解决方案呢?

在此先感谢

+0

您要查找的几何形状是所有这些的交集?他们是否都重叠在一个共同的地区? –

+0

?1没错。 ?2是的,在大多数情况下。如果不是,那么十字路口将有一个0区域,而且这些信息也很重要。 –

回答

0

你需要一个self join。 例如:

SELECT ST_intersection(a.geom,b.geom) 
FROM mytable AS a, mytable AS b 
WHERE st_equals(a.geom, b.geom) IS FALSE AND ST_intersects(a.geom, b.geom); 

通过这种方式,您可以将表格与自身进行比较。那里的条件保证两个:

  • 两个几何是不一样的
  • 两个几何相交(否则ST_Intersections将返回GEOMETRYCOLLECTION EMPTY

如果你的表有一个ID列,你可以使用

WHERE a.id != b.id 

,而不是

WHERE st_equals(a.geom, b.geom) IS FALSE 
+0

谢谢!这不是我想要的,这个想法可能会在未来派上用场。 –

0

我发现this solution这似乎工作最适合我的情况。

创建功能ST_IntersectionArray后像建议

create or replace function ST_IntersectionArray(geoms geometry[]) returns geometry as $$ declare i integer; tmpGeom geometry; begin tmpGeom := geoms[1]; FOR i IN 1..array_length(geoms,1) LOOP tmpGeom:= ST_Intersection(tmpGeom,geoms[i]); END LOOP; return tmpGeom; end; $$ LANGUAGE plpgsql;

你可以做

select ST_Intersection(array_agg(distinct t.geom)) from mytable t

的不同是很重要的。如果有可能发生错误的相同多边形。

这是最适合我的工作。

1

您可以使用WITH RECURSIVE common table expression来处理运行结果中的每个元素geometry[]

下面是一些示例数据,基于重叠缓冲的随机位置(图中的蓝色多边形):

DROP TABLE IF EXISTS ar; 
SELECT array_agg(ST_Buffer(ST_MakePoint(random(), random()), 0.5, 3)) AS geoms 
INTO TEMP ar 
FROM generate_series(1, 6) AS id; 
SELECT ST_Collect(geoms) FROM ar; 

,这里是魔法:

WITH RECURSIVE inter AS (
    -- First geometry 
    SELECT 1 AS idx, geoms[1] AS geom FROM ar a 
    UNION ALL 
    -- Remaining geometries with the previous result 
    SELECT a.idx + 1, ST_Intersection(a.geom, b.geoms[a.idx + 1]) 
    FROM inter a, ar b 
    WHERE a.idx + 1 <= array_length(geoms, 1) AND NOT ST_IsEmpty(a.geom) 
) 
SELECT * FROM inter 
ORDER BY idx DESC LIMIT 1; 

的“递归”停在最后一个数组索引,或者结果为空。此外,您可以通过注释掉最后一行来查看每个路口的步骤。

img