2008-09-12 103 views
3

如何取一组包含任意值的多边形并创建一个对应的位图,其中每个像素包含该位置的多边形值?如何将一组多边形转换为位图

为了说明问题,我的多边形包含有关多边形内每平方公里平均人数的信息。我需要创建一个光栅/位图,其中包含代表200米箱内人口的像素。

我在过去曾做过类似的事情,我使用多边形通过绘制位图并填充值来创建遮罩,然后将位图转换为可操作的数组。我相信这样做有更好的方法!

我按照要求澄清了这个问题。

  1. 有多个多边形,每个多边形是一组向量
  2. 每个多边形将有单个唯一的值
  3. 多边形不重叠

由于

尼克

+0

从这个问题的一些答案可能是有趣的:http://stackoverflow.com/questions/1341399 – ideasman42 2016-09-12 17:18:41

回答

1

@Nick [R

我本来使用ArcGIS 9.2,但是这并不能很好的C#和64位工作,所以现在我使用GDAL(http://www.gdal.org) 。

是不是gdal_rasterize做到了你想要的?

1

ImageMagick可以从svg转换为png,也许你可以看看代码,或者只需创建svg并使用IM进行转换? Scruffy这样做。

2

您使用的是什么GIS软件? ArcGIS在ArcGIS 9.2或更高版本中提供了“多边形转栅格”工具,它可以编写为PolygonToRaster_conversion函数。

PolygonToRaster_conversion (in_features, value_field, out_raster_dataset, cell_assignment, priority_field, cellsize) 
+0

我最初使用ArcGIS 9.2,但这不适用于C#和64位,所以我是现在使用GDAL(http://www.gdal.org)。虽然答案很好。 – 2008-09-12 12:28:49

2

这可能不是你所需要的,但如果你想画一个多边形(或相反多边形的基础上读出一个多边形图像的像素),那么一个解决方案是推出自己的polygon fill tool。坦率地说,这是一个有趣的乐趣,并且非常好学。

但你的问题对我来说不是很清楚。你能给出一个更好的描述吗?

  • 是你的一组任意多边形的实际图像,或矢量(即点的列表)点,或?
  • 每个多边形都有一个值,还是每个多边形都有一组您想要绘制的值?
  • 因此,每个多边形都有一个相关的总体值数组,您想要使用该多边形纹理多边形?

- 亚当

+0

我已经添加了一些澄清的问题 - 希望这可以更容易地回答! – 2008-09-12 12:31:29

2

这是一个有趣的项目。这里是我会做什么,假设多边形是凸:

have a NY * 2 array of x positions: int x[NY][2] 
foreach polygon 
    clear the array to -1 
    for each edge line 
    foreach horizontal raster line iy intersecting the line 
     generate ix, the x position where the raster intersects the line 
     if x[iy][0] == -1, set it to ix, else set x[iy][1] to ix 
    end foreach iy 
    end foreach edge 
    foreach iy 
    fill the pixels between x[iy][0] and x[iy][1] with the polygons label 
    end foreach iy 
end foreach polygon 

这是一个小更棘手比它的声音,因为你需要钢铁般的纪律认为光栅的坐标不如像素标记,但它们之间的无形线条。否则,你会因边界问题而感到困惑。

对此的一个很好的测试是,如果你有一个零面积的多边形,就像它由从点A到点B并返回到A的边所组成的,它应该点亮没有像素。另一个测试是如果你有一个2单位高的平行四边形,它的顶部和底部边缘是2个单位宽,它应该正好点亮4个像素。

如果多边形不是凸的,则有点不同。无论边线与光栅线相交,将所有像素从那里切换到任意选择的X坐标,例如“屏幕”的左边缘。当你完成所有的边界时,只有内部像素会被切换奇数次。

+0

实现类似这样的功能,支持自相交,并避免遍历每条栅格线的所有边 - http://stackoverflow.com/a/31768384/432509 – ideasman42 2016-09-12 17:17:58