【问题标题】:Split Polygon into Small Polygons by contain 1 point each将多边形拆分为小多边形,每个包含 1 个点
【发布时间】:2014-12-02 23:54:47
【问题描述】:

我不确定这个算法是否存在,如果有人可以提供算法的名称,我会很感激,然后我可以谷歌它。

基本上假设我在一个多边形内有 N 个点(凸面和凹面),我想有一种方法/算法将这个多边形分成 N 个多边形,每个 N 个多边形只包含 1 个点。

谢谢。

【问题讨论】:

    标签: algorithm split polygon point


    【解决方案1】:

    我不愿意将此作为答案发布,但它不适合 cmets。 在 GIS 世界中,这有时被称为 voronoi 算法。大多数 GIS 工具,如 ESRI ArcMap 可以从一组点生成 veronoi polgons。对于您的用例,我认为您可以使用下面链接中的包(它是兼容的)从您的点创建一个 veronoi 多边形集,然后获取该输出,并进行一些花哨的空间连接,以用多个多边形替换您的多边形。

    这是描述该概念的维基百科页面的链接

    http://en.wikipedia.org/wiki/Voronoi_diagram

    delaunoy 三角测量也是您可能想要研究的另一种方法

    http://www.spatialdbadvisor.com/oracle_spatial_tips_tricks/283/application-of-delaunay-triangulation-and-inverse-distance-weighting-idw-in-oracle

    这里有另一个链接,其中提到了上面提到的 st_veronoi 函数。 http://www.spatialdbadvisor.com/source_code/223/geoprocessing-package-documentation

    这个包的基础似乎是 java JTS,它显然是在 oracle 的 java 存储过程中编译的。 JTS 是 Java 中几何运算的“标准”。我想我会自己尝试一下。

    请记住,我只使用 ArcGIS 之类的工具完成了这项工作,没有使用我上面提到的任何东西....所以 HTH 我不会把你带进老鼠洞。

    【讨论】:

      【解决方案2】:

      我不能给你一个名字,但可以描述三种不同的算法

      我将调用给你的点集“目标”以简化我的解决方案,因为我想调用普通“点”上的任意位置:

      您将在 2 向量上进行大量算术运算

      我分割多边形的算法很简单:找到最近的目标。

      最接近任何目标的点集将具有直边。顶点将与三个(或更多)目标等距(或边缘与边界多边形相交的位置),

      你的算法可能是这样的:

      将原始目标集与自身交叉两次以生成一组三元组,拒绝那些不包含三个不同目标的三元组。

      对于每组三个找到与所有三个目标等距的点,如果该点更接近任何其他目标,则拒绝它。

      最终您将拥有(最多)n-2 个顶点,然后您只需要弄清楚边是如何连接起来的。您可以通过查看生成每个顶点的目标来做到这一点。

      现在您需要添加以无穷远结束的边缘,并交叉目标和自身 并找到每对目标之间的中点,任何没有两个最近目标的点都可以被拒绝,这些点中的每一个代表一条线(垂直平分线),它将在一个顶点或无穷远处结束

      最后使用边界多边形修剪地图,您可能希望从任何不包含目标的片段中删除其中一条边


      另一种方式

      另一方面,您可以使用分形分区方案将多边形划分为多个块,将每个块划分得更小,直到它包含一个多边形,结果在美学上会不那么令人愉悦,但外观不是 AFAICT 的设计要求。

      例如用于 IP 地址的分形映射。

      然后将坐标转换为数字,然后在方便的点将其分成块,(即通过删除不需要的尾随 1)


      另一种方式

      测量一组目标的范围,如果它比它更宽,画一条垂直线将它分成两半,否则水平画。 如果点燃的目标之一变热,请调整它以使其未命中。

      重复每一半,直到 extet 为零(这意味着一个点)

      【讨论】:

        【解决方案3】:

        您没有提到对包含多边形的形状有任何限制,所以我假设您不在乎。我还将假设我们处于二维中,尽管这可以很容易地扩展。这个想法很简单:通过在 x 轴上相邻点之间的中间用垂直条切割初始多边形来创建新多边形。如果点共享 x 坐标,则在 y 轴上的点之间用垂直切片分割包含它们的条带。

        如果长而薄的切片不适合您,请使用 markg 的建议。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-20
          • 2018-08-05
          • 1970-01-01
          • 1970-01-01
          • 2013-04-18
          • 2023-03-22
          • 2011-12-19
          相关资源
          最近更新 更多