2008-09-12 55 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