Mehr

Wie kann ich einer Raster-Attributtabelle ein neues Feld hinzufügen und es durchlaufen?

Wie kann ich einer Raster-Attributtabelle ein neues Feld hinzufügen und es durchlaufen?


Ich arbeite mit einer vorhandenen Raster-Attributtabelle. Ich frage mich, wie ich ein neues Feld hinzufügen und dann die vorhandenen Datensätze durchlaufen kann, um dieses neue Feld zu füllen? Natürlich habe ich dies schon oft für eine Feature-Class und eine Datenbanktabelle gemacht, aber ich weiß nicht, wie man das mit einer Raster-Tabelle macht. Ich arbeite mit VBA. Irgendein Code bitte? Vielen Dank.


VBA-Beispielcode ist hier:

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 (AddVatField(raster, areaField, esriFieldTypeDouble, 38) = True) Then ' Zellengröße berechnen Dim rstProps As IRasterProps Set rstProps = raster Dim pnt As IPnt Set pnt = rstProps.MeanCellSize Dim cellSize As Double cellSizeize = ( + pnt.Y) / 2# ' Feldindex abrufen 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() Tun Bis updateRow nichts ist 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 Funktion 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 Setze 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 End If AddVatField = False End Function

Sie könnten die IGridTableOp-Schnittstelle verwenden. Referenz: http://www.onspatial.com/2011/11/arcobjectsgrid-vatvalue-attribute-table.html

bool AddVatField(IRaster raster, string 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 = true; fieldEdit.Length_2 = fieldLength; IGridTableOp gridTableOp = new GridTableOpClass(); gridTableOp.AddField(band.RasterDataset, newField); System.Runtime.InteropServices.Marshal.ReleaseComObject(gridTableOp); true zurückgeben; } falsch zurückgeben; }
void CalculateArea(IRaster raster, string areaField) { IRasterBandCollection bandCol = (IRasterBandCollection)raster; IRasterBand-Band = bandCol.Item(0); bool hasTable = false; band.HasTable(out hasTable); if (!hasTable) return; // Feld hinzufügen if (AddVatField(raster, areaField, esriFieldType.esriFieldTypeDouble, 38)) { // Zellengröße berechnen IRasterProps rstProps = (IRasterProps)raster; IPnt pnt = rstProps.MeanCellSize(); double cellSize = (pnt.X + pnt.Y) / 2,0; // Feldindex abrufen ITable attTable = band.AttributeTable; int idxArea = attTable.FindField(areaField); int idxCount = attTable.FindField("COUNT"); // Update-Cursor verwenden IGridTableOp gridTableOp = new GridTableOpClass(); ICursor updateCursor = gridTableOp.Update(band.RasterDataset, null, false); 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); } }

Schau das Video: Sådan fjerner du linjeskift i EXCEL-celler