我有一个以光栅形式存储的高程图。我想要将平滑的“向量”曲线拟合到恒定高程的等高线上。在我的应用程序中,数据实际上是地理高程,但这个问题可以推广到任何两个变量的函数。如果需要,我可以生成另一张带有反锯齿轮廓线的光栅图像,并将其用作矢量拟合过程的输入。这个问题与这个问题相似,但我正在寻找一个可以在我的Java应用程序中使用的免费库,或者我(一个非数学家)可以自己实现的算法说明。此外,在我的情况下,我已经找到了所有我关心的“边缘”,我只需要将它们转换成矢量形式。另一个问题涉及到了我的问题,但发帖者从未回来解释他如何实现最后一步,这正是我所缺少的部分。
您可能希望适合封闭的贝塞尔样条曲线。 有一个带有Java小程序可以完成这样的拟合。看看他们(未注释的)PSegment.java 如果这做得不够好,通过平方距离最小化将B样条曲线拟合到点云应该是过度解决问题。 欲了解更多信息,请使用Google(学者)搜索“b-spline拟合”和“封闭贝塞尔样条曲线”等内容。
MATLAB使用等高线图来完成这个任务:参见contour函数——它可以从一个f(x,y)数据网格中生成等高线数据。我不太了解他们使用的算法(他们有一个页面讨论了这个问题),但也许值得看一下Octave的等价物。有一个关于等高线绘制的论文和一个基于该论文的CodeProject页面。
我使用GDAL。在我看来,您可能不想创建贝塞尔样条曲线,因为这会增加复杂性。短线段已经足够好了。 唯一的问题是您必须在数据准备时间创建等高线,而不是在Java应用程序中创建。 这是一张地图,使用GDAL从USGS高程数据创建了一些等高线: