线到多边形


11

我未能找到算法的“名称”,该算法将允许将线转换为多边形。由于这个问题跨越了GIS以及计算几何学和计算机科学领域。我不确定还有什么要添加的。我不愿意提供我搜索过的内容的清单,因为我也想知道其他人会认为他们是搜索标准的首选。

场景...我有线(构造一条线需要两个点)...每条线至少连接到另一条线。连接的线之间的中间空间将形成多边形。最简单的情况是三角形...一个矩形...并且可以超越多段特征。

对任何模糊的描述都感到抱歉,但是正如我所说,我不想将可能的解决方案引导到我已经访问过的道路上,因为我对“最初的想法”和最终解决方案都非常感兴趣。


线条可以重合吗?线可以交叉吗?(即干净吗?)如果是这样,我希望将这个过程称为Build并不会太特定于应用程序。
Kirk Kuykendall

在构造多边形之前,应先删除Kirk重合线和其他“缺陷”。因此,简而言之,请考虑到所有退化条件都已得到处理,并且剩下的干净线(2点线)与应该能够构造多边形的节点重合。关键在于线条存在,没有退化条件,并且需要将中间空间转换为多边形。谢谢

这些点是在平面上还是在球面上?
Kirk Kuykendall

Kirk ...在平面上,度量x,y坐标,而不是球面坐标。例如,假设您有形成伏洛诺伊图的线段,但是您所拥有的只是形成该伏洛诺伊图的线段,而不是导致它的实际数据结构。简而言之,每个网段都是相连的,每个网段都是唯一的。

Answers:


4

也许是“区域填充”?看到这里这里

编辑

另一种可能性是约束三角剖分。(该链接指向一个Java小程序,您可以用鼠标绘制一个图形,然后说明用平面扫描算法对它进行三角测量。)任何这种三角测量的结果,无论如何执行,都可以很容易地处理为创建所需的多边形:只需合并所有共享新创建边的相邻三角形。

原始图:

原始图

三角图:

在此处输入图片说明


比尔(Bill)要投票,因为我没有遇到过……不想限制来自各个学科的人的其他评论。

尽管在很大程度上处理栅格填充,但这是最接近的答案。除非将其附加到栅格或矢量上,否则我仍然没有算法名称,但是“扫描”算法可能就足够了,但是我一生都无法弄清楚为什么坐标要用Y而不是X来排序(在大多数语言中都很容易实现)。

@Dan按您的建议,按y或x排序并不重要。您还正确地涉及了平面扫描或线扫描算法,但是不幸的是,这是涵盖几乎所有计算几何过程的通用技术,因此它不是专门用于搜索算法的合适术语。请注意,这个特定问题不是纯粹的图论问题,因为它涉及将多义线复合体嵌入到平面(或球体)中,因此好的算法必须维护有关嵌入的信息:这就是为什么它确实是一个区域填充问题在心里。
whuber

5

图论中,此操作称为人脸计算。它与给定图的对的计算有关。

例如,在GeOxygèneJava库中,图形(称为CarteTopo)具有getFaces方法来检索其face

这在JTS中称为多边形


好的链接。但是,它们都假定@Dan的问题已经解决:能够将图形称为“平面”意味着您已经识别出多边形面。他想知道如何将任意弧(在平面中)集合转换为诚实至善的平面图。这需要构建其“拓扑”的表示形式,例如DCEL。
ub

非常感谢您,您是知识的源泉!我不知道有人会这么大胆。
2011年

4

RepRap主机软件将线段列表(以某种未知的随机顺序)转换为多边形列表,这听起来与您尝试执行的操作类似。

特别是RepRap的“末端匹配”算法可以处理许多病理情况。

遗憾的是,RepRap软件假定每个角都具有偶数个边缘,正常对象上有2条线到达角;当一个对象的角碰到另一个对象的角等时,会同时出现4条线。我不知道采用这种算法处理voronoi图有多难,通常每个角都有3条边。


+1有趣的发现!但是请当心:尽管此软件看起来能够解决与将线连接到多边形有关的许多问题,但它可能做得太多:它似乎也试图简化特征,这可能是不利的副作用。(例如,它可能破坏拓扑完整性。)
浮躁者

3

您是否探索过GRASS的代码库来解决您的问题?-> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html


1
谢谢...但是我不是在寻找特定的“打包”解决方案,而是在GIS,Comp Geom和/或Comp Sci的各个领域使用的基础算法和/或名称...请继续关注这些想法

我想专门查看链接中提到的两个过程背后的源代码可能会对您有所帮助。
oeon 2011年

我想我必须安装该软件才能查看代码,因为除非缺少某些内容,否则这些页面上看不到任何列表。

1
您可以在线浏览GRASS来源:trac.osgeo.org/grass/browser
underdark

@underdark感谢您的指导。据我main.cv.type来源中所知,所有发生的都是将要素重新标记为边界:没有实际的处理发生。回想起来,这并不奇怪:如果(我不确定)使用完整的2D拓扑信息维护要素,则用于标识多边形区域的所有计算都将在要素创建或导入过程中自动进行,并始终保留所有地理处理操作。
ub

3

哈罗

我不认为您要寻找的是特定算法。根据您的数据集,该任务可能非常困难或非常简单。

您应该将问题至少分为两部分。1)更多是一个网络问题,如何找到线串的闭合环。2)将封闭的线串表示为多边形

第二部分是“将线转换为多边形”,其格式比多边形/线串表示更多。我的意思是从:

LINESTRING(1 1,2 2)
LINESTRING(2 2,2 1)
LINESTRING(2 1,1 1)

到:
POLYGON((1 1,2 2,2 1,1 1))

正在将线转换为多边形,但我想这不是您要说的。较困难的部分是第一个。如果您有意大利面条的线条,如何将它们作为闭合的线串排序。

我想这个问题的答案取决于很多数据集。正如柯克(Kirk)所问的,线是否可以跨越,问题就更大了。如果您知道所有“行集合”都是闭合线串的一部分,那么它将变得越来越容易。然后,您可以抓住任何一条线,沿着路径行走,直到再次回来,然后继续执行上面的第二步。

我的观点是,数据集的条件设置了有关如何执行操作的所有规则。如果您想在一串意大利面条中找到所有可能的多边形,我认为必须涉及很多不同的算法才能在所有交叉中放置顶点,搜索所有可能的路径,依此类推。

在PostGIS中,该函数称为ST_Polygonize。 该函数根据您提供的线串创建所有可能的多边形。

这是由GEOS执行的,因此您可以在GEOS和JTS代码中找到背后的算法。

只是一些想法

/尼克拉斯


1

您可以尝试搜索“ Forward Star”算法。有人告诉我它是通用的,但是我读过的关于它的唯一讨论总是在引用arcgis。也许看看这些讲义中引用的有关前卫明星的参考文献。


1
即使在此注释中也解决了其他一些建议的解决方案,我仍将在此处进行评论:问题不能在网络(或图形)中表示。它需要有关线在二维表面内如何连接的信息。因此,向前/向后的恒星表示将毫无用处;需要DCEL或类似的东西。
ub

@whuber-我以为Dan的评论是所有“缺陷”均已删除,这暗示着这些线是干净的。这样,应该有可能将其减少到在图形中找到所有循环的图形遍历问题。起初,我以为“前卫之星”会协助算法绕过一个图,并在每个节点处尽可能向右转右。但是,多看一点似乎可以找到更好的方法。stackoverflow.com/questions/261573/… 但是,这仍然假设问题可以重新表示为图表。
Kirk Kuykendall

1
在图形中查找循环与在平面图中查找面不同。考虑具有顶点{a,b,c,d}和边缘{a,b},{a,c},{b,c},{b,d},{c,d}的抽象图。循环的基础包括a-> b-> d-> c-> a和a-> b-> c-> a。在平面嵌入a->(0,1),b->(2,2),c->(2,0),d->(3,1)(其中所有边都是线段)的情况下,循环a-> b-> d-> c-> a 不是一张脸,但是如果将d移至(1,1),它就是一张脸。这说明了为什么“面部”的概念要求将图形嵌入到平面中,以及为什么不能仅从图形的抽象结构来计算面部。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.