【问题标题】:Is there any way to get CGAL's polyline simplification to work for inner/shared boundaries?有没有办法让 CGAL 的折线简化适用于内部/共享边界?
【发布时间】:2020-11-11 02:59:54
【问题描述】:

我一直在尝试借助 CGAL guide 对属于地图的多边形进行线条简化,例如韩国。

这是使用 CGAL 简化行后的 screenshot of South Korea

我通过将每个多边形添加到CGAL::Constrained_triangulation_plus_2<CDT> ct 然后运行CGAL::Polyline_simplification_2::simplify(ct, Cost(), Stop(0.5)); 来进行线条简化。

外部边界将得到简化,但内部/共享边界(省之间)不会。 有什么方法可以简化内部/共享边界?

我还尝试单独simplify 每个多边形,然后将它们组合在一起以形成整个国家。然而,问题是每个多边形都会被自己简化,因此如果Polygon1 被简化,则不能保证相邻Polygon2 的共享顶点将重新定位到与Polygon1 相同的坐标顶点,因此当您将它们重新组合在一起时会出现交叉点,就像这张韩国地图一样。

谢谢。

【问题讨论】:

  • 我认为您遇到了麻烦,因为您选择了一组错误的工具来表示地理信息。你看过GGAL2D Arrangements吗?您可以更自然地使用它们来表示具有弯曲边缘的平面图......手册在这里:doc.cgal.org/latest/Arrangement_on_surface_2/index.html
  • 嗨,HEKTO。感谢您的回复/建议,并为迟到的回复道歉。考虑到 2D Arrangements,有没有办法将 Polygon_2 对象转换为 2D Arrangement 对象,反之亦然?此外,有没有办法将 2D Arrangements 整体简化,因为 2D Arrangements 似乎不存在 simplify() 函数?再次感谢您的帮助。
  • 您正在使用的地图由许多折线组成,这些折线连接在端点 - 您可以将所有这些存储为一个排列。折线可以自己简化,而不是作为多边形的一部分。可以使用各种迭代器从排列中提取折线和多边形

标签: c++ line polygon cgal simplification


【解决方案1】:

当你写下“共享边界”时,我猜它们出现了两次,一次是从每个省看到的。您必须分割三个省份相交的省份多边形,并且 然后只取两个共享边界之一。

【讨论】:

  • 您好@Andreas,感谢您的回复。我相信我理解您的建议,并愿意这样做。但是,希望我能澄清一下,这是否意味着 CGAL 不提供任何“本机”方式来更方便地对共享边界进行线路简化?如果没有,您是否知道任何可以方便地简化共享边界的 C++ 包?因为我正在解析 GeoJSON 字段,所以我也在考虑将这些 GeoJSON 转换为 TopoJSON,因为我相信 TopoJSON 是为保留拓扑的转换而制作的。
  • 请注意,您可以通过使用函数 split_graph_into_polylines() 对最初填充所有输入段的提升 adjacency_list 来实现 Andreas 的建议。
  • 抱歉耽搁了,但我还没有收到通知。我在 gist.github.com 上添加了一个小的 example。它并没有真正打磨,应该在折线简化内,但也许它直接有用。
  • 您好 sloriot 和 Andreas,非常感谢您的帮助。也为延迟道歉,我也没有收到通知。我会试试这个,谢谢!
  • 你好,fillmmon。我们现在还有一个pull request,它可以简化具有公共子序列的折线。
猜你喜欢
  • 2018-03-04
  • 2012-08-09
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多