5

我有一堆具有自相交的多边形,这会导致在进一步后处理它们时出现一些错误(特别是 - 我无法计算这些多边形与其他多边形的相交面积)。这是一个破碎多边形的例子:

{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [
        [
          6.881057785381658,
          46.82373306675715
        ],
        [
          6.857171686909481,
          46.81861230543794
        ],
        [
          6.857354659059071,
          46.81856788926046
        ],
        [
          6.856993473052509,
          46.82693029065604
        ],
        [
          6.8612894138116785,
          46.83422796373707
        ],
        [
          6.86720955648855,
          46.835636765630476
        ],
        [
          6.871281147359957,
          46.83078486366309
        ],
        [
          6.871573291317274,
          46.8306215963777
        ],
        [
          6.877608228639841,
          46.82771553607934
        ],
        [
          6.877758462659651,
          46.82772313420989
        ],
        [
          6.877852632482749,
          46.827735617670285
        ],
        [
          6.880928107931434,
          46.82630213148064
        ],
        [
          6.8810399979122305,
          46.82622029042867
        ],
        [
          6.881117606743071,
          46.826115612819855
        ],
        [
          6.881057785381658,
          46.82373306675715
        ]
      ]
    ]
  ]
}

这就是它在地图上的样子——如您所见,有两条多边形边相交。RGeo 抛出一个错误,指向交叉点坐标(我猜)=> "Geos::GEOSException: TopologyException: Input geom 0 is invalid: Self-intersection at or near point 6.8573510795579145 46.818650764080992 at 6.8573510795579145 46.818650764080992":。所以,我至少拥有它。

我的问题是:有没有办法自动修复那个交叉点?我读到,一个可能的解决方案是插入 2 个具有自相交坐标的相似点。但问题是 - 多边形有一个特定的顺序,我不知道在哪里插入这些点。

此外,也许有一些现有的工具可以帮助解决这个问题......

自相交示例

4

1 回答 1

4

我将使用的解决方案是postgis 的 ST_MakeValid 选项用于 postgres,如果这是一个选项,你可以按照以下方式做一些事情,ST_AsText(ST_MakeValid(geom_column))或者如果你宁愿传递文本,这里是一个使用 prepair 中显示的蝴蝶结示例的示例

select ST_AsText(ST_MakeValid(ST_GeomFromText('POLYGON((0 0, 0 10, 10 0, 10 10, 0 0))')));
st_astext                         
-----------------------------------------------------------
MULTIPOLYGON(((0 0,0 10,5 5,0 0)),((5 5,10 10,10 0,5 5)))
(1 row)

如果您对此不感兴趣,您可以导出这些几何图形并使用prepair之类的工具进行转换。总结一下这是如何在幕后工作的,它将这些“蝴蝶结”分割成多个多边形,然后将这些多边形制成一个多多边形。相同类型的修复将应用于多面体。

于 2018-02-21T15:22:33.063 回答