I am working with an existing raster attribute table. I wonder how can I add a new field to it and then loop through the existing records to populate this new field? Of course I have done this many times for a feature class and a database table but I do not know how to do it with a raster table. I work with VBA. Any code please? Thanks.
Answer
VBA sample code is here:
Public Sub CalculateArea(raster As IRaster, areaField As String)
Dim bandCol As IRasterBandCollection
Dim band As IRasterBand
Set bandCol = raster
Set band = bandCol.Item(0)
Dim hasTable As Boolean
band.hasTable hasTable
If (hasTable = False) Then
Exit Sub
End If
If (AddVatField(raster, areaField, esriFieldTypeDouble, 38) = True) Then
' calculate cell size
Dim rstProps As IRasterProps
Set rstProps = raster
Dim pnt As IPnt
Set pnt = rstProps.MeanCellSize
Dim cellSize As Double
cellSize = (pnt.X + pnt.Y) / 2#
' get fields index
Dim attTable As ITable
Set attTable = band.AttributeTable
Dim idxArea As Long, idxCount As Long
idxArea = attTable.FindField(areaField)
idxCount = attTable.FindField("COUNT")
' using update cursor
Dim gridTableOp As IGridTableOp
Set gridTableOp = New gridTableOp
Dim cellCount As Long, cellArea As Double
Dim updateCursor As ICursor, updateRow As IRow
Set updateCursor = gridTableOp.Update(band.RasterDataset, Nothing, False)
Set updateRow = updateCursor.NextRow()
Do Until updateRow Is Nothing
cellCount = CLng(updateRow.Value(idxCount))
cellArea = cellCount * (cellSize * cellSize)
updateRow.Value(idxArea) = cellArea
updateCursor.updateRow updateRow
Set updateRow = updateCursor.NextRow()
Loop
End If
End Sub
Private Function AddVatField(raster As IRaster, fieldName As String, fieldType As esriFieldType, fieldLength As Long) As Boolean
Dim bandCol As IRasterBandCollection
Dim band As IRasterBand
Set bandCol = raster
Set band = bandCol.Item(0)
Dim hasTable As Boolean
band.hasTable hasTable
If (hasTable = True) Then
Dim attTable As ITable
Set attTable = band.AttributeTable
If (attTable.FindField(fieldName) -1) Then
AddVatField = True
Exit Function
End If
Dim newField As IField
Dim fieldEdit As IFieldEdit
Set newField = New Field
Set fieldEdit = newField
With fieldEdit
.Name = fieldName
.Type = fieldType
.Editable = True
.IsNullable = True
.Length = fieldLength
End With
Dim gridTableOp As IGridTableOp
Set gridTableOp = New gridTableOp
gridTableOp.AddField band.RasterDataset, newField
AddVatField = True
Exit Function
End If
AddVatField = False
End Function
No comments:
Post a Comment