Más

¿Cómo puedo agregar un nuevo campo en una tabla de atributos ráster y recorrerlo?

¿Cómo puedo agregar un nuevo campo en una tabla de atributos ráster y recorrerlo?


Estoy trabajando con una tabla de atributos ráster existente. Me pregunto cómo puedo agregarle un nuevo campo y luego recorrer los registros existentes para completar este nuevo campo. Por supuesto, he hecho esto muchas veces para una clase de entidad y una tabla de base de datos, pero no sé cómo hacerlo con una tabla ráster. Trabajo con VBA. ¿Algún código por favor? Gracias.


El código de muestra de VBA está aquí:

Public Sub CalculateArea (raster como IRaster, areaField como cadena) Dim bandCol como IRasterBandCollection Dim band como IRasterBand Establecer bandCol = ráster Establecer band = bandCol.Item (0) Dim hasTable Como booleano band.hasTable hasTable If (hasTable = False) Luego salir de Sub End If If (AddVatField (raster, areaField, esriFieldTypeDouble, 38) = True) Entonces 'calcula el tamaño de celda 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 Establecer attTable = band.AttributeTable Dim idxArea As Long, idxCount As Long idxArea = attTable.FindField (areaField) idxCount = attTable.FindField ("COUNT")' usando actualizar cursor Dim gridTableOp As IGridTableOp Establecer gridTableOp = New gridTableOp Dim cellCount As Long, cellArea As Double Dim updateCursor Como ICursor, updateRow As IRow Establecer updateCursor = gridTableOp.Update (band.RasterDataset, Nothing, False) Establecer updateRow = updateCursor.NextRow. Hacer Hasta que updateRow no sea nada 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
Función privada 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 = ráster 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 como IField Dim fieldEdit As IFieldEdit Set newField = New Field Establecer fieldEdit = newField With fieldEdit .Name = fieldName .Type = fieldType .Editable = True .IsNullable = True .Length = fieldLength Fin con Dim gridTableOp como IGridTableOp Establecer gridTableOp = New gridTableOp gridTableOp.AddField bandField AddVitat, nuevo End If AddVatField = Función de fin falso

podría usar la interfaz IGridTableOp. referencia: http://www.onspatial.com/2011/11/arcobjectsgrid-vatvalue-attribute-table.html

bool AddVatField (ráster IRaster, cadena fieldName, esriFieldType fieldType, int fieldLength) {IRasterBandCollection bandCol = (IRasterBandCollection) raster; IRasterBand band = bandCol.Item (0); bool hasTable = false; band.HasTable (out hasTable); if (hasTable) {ITable attTable = band.AttributeTable; if (attTable.FindField (fieldName)! = -1) {return true; } IField newField = new FieldClass (); IFieldEdit fieldEdit = (IFieldEdit) newField; fieldEdit.Name_2 = fieldName; fieldEdit.Type_2 = fieldType; fieldEdit.Editable_2 = true; fieldEdit.IsNullable_2 = verdadero; fieldEdit.Length_2 = fieldLength; IGridTableOp gridTableOp = new GridTableOpClass (); gridTableOp.AddField (band.RasterDataset, newField); System.Runtime.InteropServices.Marshal.ReleaseComObject (gridTableOp); devuelve verdadero; } falso retorno; }
void CalculateArea (ráster IRaster, cadena areaField) {IRasterBandCollection bandCol = (IRasterBandCollection) raster; IRasterBand band = bandCol.Item (0); bool hasTable = false; band.HasTable (out hasTable); if (! hasTable) return; // Agregar campo if (AddVatField (raster, areaField, esriFieldType.esriFieldTypeDouble, 38)) {// calcular el tamaño de celda IRasterProps rstProps = (IRasterProps) raster; IPnt pnt = rstProps.MeanCellSize (); tamaño de celda doble = (pnt.X + pnt.Y) / 2.0; // obtener el índice de campos ITable attTable = band.AttributeTable; int idxArea = attTable.FindField (areaField); int idxCount = attTable.FindField ("COUNT"); // usando el cursor de actualización IGridTableOp gridTableOp = new GridTableOpClass (); ICursor updateCursor = gridTableOp.Update (band.RasterDataset, nulo, falso); IRow updateRow = updateCursor.NextRow (); while (updateRow! = null) {int cellCount = Convert.ToInt32 (updateRow.get_Value (idxCount)); double cellArea = cellCount * (cellSize * cellSize); updateRow.set_Value (idxArea, cellArea); updateCursor.UpdateRow (updateRow); updateRow = updateCursor.NextRow (); } System.Runtime.InteropServices.Marshal.ReleaseComObject (gridTableOp); System.Runtime.InteropServices.Marshal.ReleaseComObject (updateCursor); }}

Ver el vídeo: QGIS dasturida raster data bilan ishlash