问题 如何在KML中简化(减少点数)?


我有类似的问题 这个帖子。我需要在嵌入式Google地图上显示多达1000个多边形。多边形位于SQL数据库中,我可以使用自定义HttpHandler(在ASP.NET中)将每个多边形渲染为单个KML文件,就像这样 http://alpha.foresttransparency.org/concession.1.kml 。

即使在我(非常快)的开发机器上,也需要一段时间来加载甚至几十个形状。真的有两个问题:

  1. 一旦超出某个缩放级别,将这些作为标记而非覆盖渲染的好策略是什么?

  2. 是否有公开的算法来简化多边形(减少点数),这样我在某个缩放级别上没有显示更多的点而不是有意义?


7683
2017-10-10 20:49


起源



答案:


对于你的第二个问题:你需要 Douglas-Peucker泛化算法


13
2017-10-10 21:02



谢谢,这就是我需要的。我已经改编了在CodeProject上找到的D-P的C#实现 - 似乎工作得很好。 - Herb Caudill


答案:


对于你的第二个问题:你需要 Douglas-Peucker泛化算法


13
2017-10-10 21:02



谢谢,这就是我需要的。我已经改编了在CodeProject上找到的D-P的C#实现 - 似乎工作得很好。 - Herb Caudill


对于第一个问题,您可以计算特定多边形的面积,并将每个缩放级别与特定的最小区域相关联,以便放大或缩小多边形时消失,并根据缩放级别显示标记。

对于第二个问题,我会使用Mark Bessey的建议。


2
2017-10-10 21:31





我不太了解KML,但我认为问题#2的通常解决方案是迭代点,并删除一定大小的任何线段。在某些情况下,这会导致一些“不幸”的效果,但它相对快速且容易做到。


0
2017-10-10 21:00





我会推荐两件事: - 计算并组合接触的多边形。这涉及很多处理和硬数学,但我已经做到了所以我知道这是可能的。 - 创建自己的叠加层而不是使用PNG格式的KML,同时在之前的建议中将它们组合在一起。你必须创建很多PNG,但它在客户端上的速度非常快。

祝你好运 :)


0
2017-10-10 21:01



谢谢 - 我真的没有足够的资源来复制Google API免费提供的内容。 - Herb Caudill


我需要一个解决你的#2问题的解决方案,在看了一些可用的行简化算法后,我创建了自己的。

这个过程很简单,似乎运行良好,但如果你没有正确实现它可能会有点慢:

P[0..n] 是你的点数  让 T[n] 被定义为由点形成的三角形 P[n-1], P[n], P[n+1] Max 是您尝试将此行减少到的点数。

  1. 计算每个可能三角形的面积 T[1..n-1] 在集合中。
  2. 选择三角形 T[i] 面积最小
  3. 删除点 P[i] 基本上使三角形变平
  4. 重新计算受影响三角形的面积 T[n-1], T[n+1]
  5. 如果点数>,请转到步骤#2 Max

0
2017-10-23 06:55



出于好奇,为什么不和Douglas-Peucker一起去?乍一看,您的算法似乎效率低得多。它还针对固定数量的点,而不是给定的公差 - 那么您如何将它应用于大量不同复杂形状? - Herb Caudill
你知道......我可能会尽快实现。我的应用程序的这部分很少运行,但再看一遍,它看起来确实是一个更好的方法。谢谢。 - Daniel Beardsley