我有一个多边形的PostGIS表,其中一些相互相交。这就是我想要做的事情:


对于由id选择的给定多边形,请给我所有相交的多边形。基本上,从这些多边形开始,我需要创建一个新的多边形,使交点成为一个新的多边形。因此,如果多边形A与多边形B相交,我将得到3个新多边形:A减去AB,AB和B减去AB。

有什么想法吗?

评论

嗯,我想看看您正在获得什么,但是简单的图形可能会帮助我们(和其他人)准确地了解您想要的内容。

在我的答案中添加了一些内容。

#1 楼

由于您说的是每个感兴趣的多边形都有一组相交的多边形,因此您可能需要创建一个称为“多边形覆盖物”的东西。

这并不是亚当的解决方案正在做。要查看差异,请看下面这张ABC交集的图片: “ AB!C”和“ ABC”,以及覆盖“ AC!B”和“ ABC”的“ AC”多边形,以及“ BC!A”和“ ABC”的“ BC”多边形。因此,“ AB”,“ AC”和“ BC”输出多边形将全部与“ ABC”区域重叠。

多边形覆盖会产生不重叠的多边形,因此AB!C将是一个多边形

在PostGIS中创建多边形叠加层实际上非常简单。

基本上有三个步骤。

步骤1是提取线条[请注意,我使用的是多边形的外环,如果要正确处理孔,确实会更加复杂]:

SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines

步骤2是“连接”线条(在每个交叉点产生一个节点)。有些库(例如JTS)具有“ Noder”类,您可以使用它来执行此操作,但是在PostGIS中,ST_Union函数可以为您完成此操作:由ST_Polygonize函数完成的所有这些线可能产生的非重叠多边形:

表,也可以将它们全部合并为一个语句: )拥有一张表格,其中每一行都是构成多边形叠加层的多边形之一。

评论


请注意,ST_ExteriorRing会掉落任何孔。 ST_Boundary将保留内部环,但也会在内部环中创建一个多边形。

– jpmc26
19年1月18日在18:42

多边形过多时,外环的并集会崩溃。不幸的是,这种“直截了当”的解决方案仅适用于小范围。

–皮埃尔·拉辛(Pierre Racine)
19 Mar 15 '15:12



#2 楼

如果我理解正确,那么您想采取(A是左侧的几何图形,B是右侧的几何图形):AbrB的图像http://img838.imageshack.us/img838/3996/intersectab1 .png

并提取:

A∖AB

A∖AB的图片http://img830.imageshack.us/img830/273 /intersectab2.png

AB

AB的图像http://img828.imageshack.us/img828/7413/intersectab3.png

和B∖AB

B∖AB的图片http://img839.imageshack.us/img839/5458/intersectab4.png

即-每个相交的三种不同几何形状对。

首先,让我们创建所有相交几何的视图。假设您的表名是polygons_table,我们将使用:

CREATE OR REPLACE VIEW p_intersections AS    -- Create a view with the 
SELECT t1.the_geom as t1_geom,               -- intersecting geoms. Each pair
       t2.the_geom as t2_geom                -- appears once (t2.id<t2.id)
    FROM polygons_table t1, polygons_table t2  
         WHERE t1.id<t2.id AND t1.the_geom && t2.the_geom 
                           AND intersects t1.the_geom, t2.the_geom;


现在我们有了一个视图(实际上是一个只读表),该视图存储成对的相交几何,其中由于t1.id<t2.id的情况,每对仅出现一次。 />
注意:


A∖AB运算符在AB运算符之前用作过滤器,以提高性能。
我选择创建一个B∖AB来代替一个巨大的查询;这只是为了方便。
如果您要确定UNION&&intersects的并集,而不是交点,请在适当的位置在VIEW查询中使用ST_Union而不是st_intersection。设置差异的unicode符号;如果它混淆了您的数据库,请将其从代码中删除。
图片由Wikimedia Commons的nice Set theory类提供。


评论


我在meta上的错误单:meta.gis.stackexchange.com/questions/79/…

–亚当·马坦(Adam Matan)
2010年8月2日,7:50

很好的解释!结果与scw解决方案中的结果相同,但是他的方法应该更快(不计算/或存储/附加A和B的交集)

– Stachu
2010年8月3日,下午6:51

谢谢!我想我不存储任何其他信息,因为我仅创建SQL VIEW,而不创建表。

–亚当·马坦(Adam Matan)
2010年8月3日,下午6:56

是的,的确如此,但是您无需计算A和B的附加交集

– Stachu
2010年8月3日,12:21

此答案中的图像不再起作用。

– Fezter♦
13年2月2日在6:39

#3 楼

您要描述的是Union运算符在ArcGIS中的工作方式,但与GEOS世界中的Union或Intersection有点不同。 Shapely手册中有一些示例,说明了集如何在GEOS中工作。但是,PostGIS Wiki确实有一个很好的示例,说明了使用线条的技巧,可以为您解决问题。

或者,您可以计算三件事: geom_a,geom_b)
ST_Difference(geom_a,geom_b)
ST_Difference(geom_b,geom_a)

这些应该是您在第二个要点提到的三个多边形。

评论


PostGIS Wiki示例很好

–fmark
2010年7月23日在2:41

如果ST_Intersects相交与否,它们是否不返回布尔值?我认为ST_Intersection将起作用。

–詹森
2010年7月23日在2:52

是的,我的错别字-现在已固定在原文中,谢谢杰森!

– scw
2010年7月23日在2:56

#4 楼



将其插入到new_table值中>编辑:您需要多边形的实际交点。 />看看是否可行。