AO中栅格数据处理主要涉及的几个对象是:Raster、RasterBand和Pixelblock。从磁盘文件打开的话,通常是得到RasterDataset,然后是RasterbancCollection,再是Rasterband;当然也可以从RasterDataset得到Raster。从图层文件中一般可以很容易得到Raster。
Raster对象最多只能包含3个波段的数据,因此对于需要处理多个波段的数据时,从Raster来做不太方便,应该从RasterBand来逐波段处理数据。Raster可以读取拉伸和重采样后的值,而RasterBand得到RawPixel值。
读写pixel值需要使用PixelBlock。PixelBlock对象需要先设定大小,然后分别配空间,最后用于读取。如:
Dim pPB As IPixelBlock3
Dim pPnt As IPnt
Set pPnt = New Pnt
'设置pixelblock的大小
pPnt.SetCoords 1, nWidth
'分配pixelblock
Dim pRawPixel As IRawPixels
Set pRawPixel = pRSBandCol.Item(0)
Set pPB = pRawPixel.CreatePixelBlock(pPnt)
以Pnt对象设定大小,然后再分配的时候使用这个对象。这样就可以灵活的控制一次读入多少像素点。
Dim pOrigin As IPnt
Set pOrigin = New Pnt
pOrigin.SetCoords j, 0
'读取该波段的一行数据
pRawPixel.Read pOrigin, pPB
读取时以Pnt对象设定起始点,从而确定从何处开始读取像素点。
从PixelBlock中读取像素值时,例子中提到用SafeArray,但VB中好像有些问题,可以使用IPixelBlock3中的PixelData来读取,如果要改写,可以用PixelDataByRef。
此外,GDAL中也是以Band为基本处理单位的,思路上大致相似。
示例:
Public Sub ReadRaster()
On Error GoTo Ex
Dim pRSWSF As IWorkspaceFactory
Set pRSWSF = New RasterWorkspaceFactory
Dim pRSW As IRasterWorkspace2
Set pRSW = pRSWSF.OpenFromFile("f:\土壤适宜性分析", 0)
'土壤环境_2003.img
Dim pRSD As IRasterDataset
Set pRSD = pRSW.OpenRasterDataset("土壤环境_2003.img")
'使用CreateDefaultRaster创建的Raster对象只含有3个波段的信息
' Dim pRS As IRaster
' Set pRS = pRSD.CreateDefaultRaster
Dim pRSBandCol As IRasterBandCollection
Set pRSBandCol = pRSD
'MsgBox pRSBandCol.Count
Dim pRSProp As IRasterProps
Set pRSProp = pRSBandCol.Item(0)
Dim nWidth, nHeight, nPixelType As Integer
nWidth = pRSProp.Width
nHeight = pRSProp.Height
nPixelType = pRSProp.PixelType
' MsgBox pRSProp.Height
' MsgBox pRSProp.Width
' MsgBox pRSProp.PixelType
Dim pPB As IPixelBlock3
Dim pPnt As IPnt
Set pPnt = New Pnt
'设置pixelblock的大小
pPnt.SetCoords 1, nWidth
'创建pixelblock
Dim pRawPixel As IRawPixels
Set pRawPixel = pRSBandCol.Item(0)
Set pPB = pRawPixel.CreatePixelBlock(pPnt)
Dim i, j As Integer
Dim pOrigin As IPnt
Set pOrigin = New Pnt
Dim pSafe As Variant
Dim c As Integer
Open "c:\Rastervalue.txt" For Output As #1
Dim strTemp As String
Print #1, Now
'依次读出每个波段的一行,然后输出到文件中
' For i = 0 To pRSBandCol.Count - 1
' Set pRawPixel = pRSBandCol.Item(0)
' For j = 0 To nHeight
' pOrigin.SetCoords j, 0
'
' '读取该波段的一行数据
' pRawPixel.Read pOrigin, pPB
' pSafe = pPB.PixelData(0)
'
' strTemp = ""
' For c = 0 To nWidth - 1
' strTemp = strTemp & pSafe(0, c) & vbTab
' Next c
' Print #1, strTemp
'
' Next j
' 读入整个数据
' pOrigin.SetCoords 0, 0
'
' '读取该波段的一行数据
' pRawPixel.Read pOrigin, pPB
' pSafe = pPB.PixelData(0)
'
' For j = 0 To nHeight - 1
' strTemp = ""
' For c = 0 To nWidth - 1
' strTemp = strTemp & pSafe(j, c) & vbTab
' Next c
' Print #1, strTemp
' Next j
' Print #1, ""
' Print #1, ""
' Next i
'换一种读取方式,每波段读取一行
For j = 0 To nHeight
For i = 0 To pRSBandCol.Count - 1
Set pRawPixel = pRSBandCol.Item(0)
pOrigin.SetCoords j, 0
'读取该波段的一行数据
pRawPixel.Read pOrigin, pPB
pSafe = pPB.PixelData(0)
strTemp = ""
For c = 0 To nWidth - 1
strTemp = strTemp & pSafe(0, c) & vbTab
Next c
Print #1, strTemp
Next i
Next j
Print #1, Now
Close
MsgBox "OK"
Exit Sub
Ex:
MsgBox Err.Description
Close
End Sub