将矢量轮廓区域(边框)转换为栅格地图(像素网格)

时间:2009-11-06 11:43:03

标签: algorithm geospatial raster geography

我有一张地图,按世界地图上的国家/地区按边界(轮廓)划分为多个地区。每个区域都有一定的表面覆盖等级 S (例如0表示水,0.03表示草...)。边界由以下定义:

  • S 的任何一个值位于其两侧(一侧为0.03,另一侧为0.0,在下例中为0.0)
  • 边框的构成点数( n = 7,如下例所示),
  • n 坐标对( x y )。

这是一个例子。

0.0300      0.0000           7
2660607.5   6332685.5   2660565.0   6332690.5   2660541.5   6332794.5 
2660621.7   6332860.5   2660673.8   6332770.5   2660669.0   6332709.5 
2660607.5   6332685.5

我想制作一个栅格地图,其中每个像素的值 S 对应于像素中心所在的区域。

请注意,边框表示 S 中的步骤更改。 S 的各种值表示离散类(例如草或水),并且不是可以平均的值(即没有湿草!)。

另请注意,并非所有边框都是闭环,如上例所示。这有点像国界:例如美国和加拿大的边界不是一个封闭的环路,而是两端连接着两条其他边界的线:加拿大 - 海洋和美国 - 海洋“边界”。 (尽管如此,闭环边界do exist!)

有人能指出我能做到这一点的算法吗?我不想重新发明轮子!

5 个答案:

答案 0 :(得分:6)

以矢量形式处理这种几何的一般情况可能非常困难,特别是因为您描述的结构没有任何要求几何是一致的。但是,由于您只想对其进行栅格化,因此将该问题视为线段的Voronoi图可以更加稳健。

通过将每个线段绘制为一对形成帐篷形状的四边形,可以在OpenGL中以图形方式完成Voronoi图的近似。 z缓冲区用于使最接近的四边形优先,从而根据最接近的线对像素着色。这里的不同之处在于,您需要根据多边形所在线的哪一侧而不是它们所代表的线来为多边形着色。讨论类似算法的好文章是Hoff等人的Fast Computation of Generalized Voronoi Diagrams Using Graphics Hardware

三维几何图形看起来像这个草图,有3个红色/黄色段和1个蓝色/绿色段:

sketch of 3d geometry

此过程不要求您将任何内容转换为闭环,并且不需要任何花哨的几何库。一切都由z缓冲区处理,并且应该足够快,以便在任何现代图形卡上实时运行。一个改进是使用齐次坐标使基础投影到无穷大。

我在http://www.pasteall.org/9062/python的Python脚本中实现了这个算法。一个有趣的警告是,使用锥体盖住线条的末端不会扭曲锥体的形状,因为代表片段终点的锥体是z-格斗。对于您提供的样本几何,输出如下所示:

voronoi rendering output

答案 1 :(得分:1)

我建议您使用像CGAL这样的几何算法库。特别是参考手册的“2D多边形”页面中的the second example应该为您提供所需的信息。您可以将每个“边框”定义为多边形,并检查某些点是否在多边形内。所以基本上它会像

for every y in raster grid
  for every x in raster grid
    for each defined polygon p
      if point(x,y) is inside polygon p
        pixel[X][Y] = inside_color[p]

我不太确定如何处理outside_color,因为外部区域会重叠,不是吗?无论如何,看看你的例子,每个外部区域都可能是水,所以你只能做最后的

    if pixel[X][Y] still undefined then pixel[X][Y] = water_value

(或者,在迭代多边形列表之前,将像素[X] [Y]设置为water_value)

答案 2 :(得分:0)

  • 首先,将所有边框转换为闭环(可能包括地图的边缘),并识别内部颜色。这必须是可能的,否则您的数据会有不一致
  • 使用bresenham的算法以一种未使用的颜色绘制地图上的所有边框线
    • 在您执行此操作时存储所有“边框像素”的列表
  • 然后为每个边界
    • 三角测量(delaunay)
    • 遍历三角形,直到找到一个中心位于边界内的点(多边形点测试)
    • 在边框的内部颜色中填充地图
  • 填写完所有内部区域后,遍历边框像素列表,查看每个区域应该是哪种颜色

答案 3 :(得分:0)

  • 选择两种未使用的颜色作为标记“空”和“边框”
  • 用“空”颜色填充所有区域
  • 通过“border”颜色绘制所有区域边框
  • 迭代点以找到第一个具有“空”颜色的
  • 确定它所属的区域(谷歌“点在多边形内”,可能你需要按照Martin DeMello的建议让你的边框关闭)
  • 使用区域颜色
  • 从此处执行填充算法
  • 转到下一个“空”点(无需重新启动搜索 - 只需继续)
  • 等等,直到没有“空”点

答案 4 :(得分:0)

我解决这个问题的方法如下:

  1. 每个部门3月;定期停车 L
  2. 在每个停靠点处,将跟踪点立即放置在段的左侧和右侧(距段的某个小距离 d )。示踪点分别归因于左右S值。
  3. 进行最近邻插值。栅格网格上的每个点都归因于最近的跟踪点的S.
  4. 即使存在非闭合线,例如在地图的边缘。

    这不是一个“完美”的分析算法。有两个参数: L d 。只要 d <<<<<<<<< 的。否则,您可能会在分段结点附近出现不准确(通常为单像素),尤其是那些具有锐角的结点。