从相交的线串计算有界多边形

Posted

技术标签:

【中文标题】从相交的线串计算有界多边形【英文标题】:calculating bounded polygon from intersecting linestrings 【发布时间】:2019-07-15 08:45:06 【问题描述】:

我正在使用 boost 几何,我试图从相交的多段线(Boost 几何中的线串 2d)计算“有界”多边形(见下图)。目前,我的方法是 i)获取这些线之间的所有交点,然后 ii)在交点处“分割”每条线。然而,这个算法有点详尽。有谁知道 boost 几何是否有更有效的方法?

此外,我如何获得位于两个交点之间的每个线串的线段(或点向量)?例如,对于绿色线串,如果我有两个红色交点,如何获得这两个点之间的线串(包含两个红色交点和两个内部蓝色点的点向量)? boost几何中是否有任何类似“拆分”的功能?

非常感谢任何建议。提前非常感谢。

【问题讨论】:

您是否将折线与方形网格相交? 您好,非常感谢您的评论。交叉点可以在折线和线之间。对于给定的一组折线或线,我想计算如上图所示的边界多边形。对于给定的示例,我们有 3 条线和一条折线。 可以在两条折线之间吗?同时有多少条线/多段线? 是的,它也必须处理两条折线的情况。例如,它可以是两条折线之间的封闭区域,每条折线代表一个半圆。但是,折线的数量可以是任意数量,只要它们可以包围/形成边界多边形。 我认为您不是在追求“边界”多边形。而是一个“有界”多边形。 【参考方案1】:

从给定的描述来看,(多)线似乎成对相交以形成单个环,因此内部多边形被很好地定义。如果不是这样,则解决方案不是唯一的。

由于行数很少,穷举搜索成对的交点不会是一个大罪。对于 5 条(多段)线,有 10 对要尝试,而您预计有 5 个交叉点。从交叉点形成环路并不是什么大问题。

最重要的是 Boost Geometry 是否使用有效的算法来相交折线。不确定这是否记录在案。对于中等数量的顶点(比如 100 以下),这并不那么重要。

如果点的数量确实很大,您可以求助于有效的线段相交算法,它将复杂度从 O(n²+k) 降低到 O((n+k) log n)。见https://en.wikipedia.org/wiki/Bentley%E2%80%93Ottmann_algorithm。您可以一次性处理所有折线。

如果您的折线具有特定属性,则可以利用它们来简化任务。

【讨论】:

您好 Yves,非常感谢您的宝贵意见。多段线确实成对相交。正如您正确指出的那样,我的问题的第一部分与提升几何是否具有更有效的算法来返回给定多段线集的所有交点(例如扫描等)有关。我的问题的第二部分是关于给定计算的交点,我如何获得形成有界多边形边缘的(其余)折线点?例如,在我的第一篇文章中;对于绿线,我怎样才能得到交叉点之间的蓝点? @GioR:您需要知道交叉点属于哪些段(即,端点索引沿折线),一种或另一种方式。然后切割有用的部分并合并这些部分以生成单个轮廓是一件简单的事情。

以上是关于从相交的线串计算有界多边形的主要内容,如果未能解决你的问题,请参考以下文章

如何测试线是否与凸多边形相交?

查找 GPS 坐标路径上的所有城市

增强几何返回相交和相交的不一致结果

dtIntersectSegmentPoly2D 2D上的线段与多边形相交计算 产生结果:是否相交,线段跨越的开始和结束百分比,相交的边

从多边形中删除相交点

使用JAVA中的geotools从定义距离(km)内的线(GPS坐标)生成多边形