// Read / write a region of image data from multiple bands func (dataset Dataset) IO( rwFlag RWFlag, xOff, yOff, xSize, ySize int, buffer interface{}, bufXSize, bufYSize int, bandCount int, bandMap []int, pixelSpace, lineSpace, bandSpace int, ) error { var dataType DataType var dataPtr unsafe.Pointer switch data := buffer.(type) { case []uint8: dataType = Byte dataPtr = unsafe.Pointer(&data[0]) case []int16: dataType = Int16 dataPtr = unsafe.Pointer(&data[0]) case []uint16: dataType = UInt16 dataPtr = unsafe.Pointer(&data[0]) case []int32: dataType = Int32 dataPtr = unsafe.Pointer(&data[0]) case []uint32: dataType = UInt32 dataPtr = unsafe.Pointer(&data[0]) case []float32: dataType = Float32 dataPtr = unsafe.Pointer(&data[0]) case []float64: dataType = Float64 dataPtr = unsafe.Pointer(&data[0]) case []complex64: dataType = CFloat32 dataPtr = unsafe.Pointer(&data[0]) case []complex128: dataType = CFloat64 dataPtr = unsafe.Pointer(&data[0]) default: return fmt.Errorf("Error: buffer is not a valid data type (must be a valid numeric slice)") } err := C.GDALDatasetRasterIO( dataset.cval, C.GDALRWFlag(rwFlag), C.int(xOff), C.int(yOff), C.int(xSize), C.int(ySize), dataPtr, C.int(bufXSize), C.int(bufYSize), C.GDALDataType(dataType), C.int(bandCount), (*C.int)(unsafe.Pointer(&bandMap[0])), C.int(pixelSpace), C.int(lineSpace), C.int(bandSpace)) if err != 0 { return error(err) } return nil }
// Read / Write a region of image data for this band func (rasterBand RasterBand) IO( rwFlag RWFlag, xOff, yOff, xSize, ySize int, buffer interface{}, bufXSize, bufYSize int, pixelSpace, lineSpace int, ) error { var dataType DataType var dataPtr unsafe.Pointer switch data := buffer.(type) { case []int8: dataType = Byte dataPtr = unsafe.Pointer(&data[0]) case []uint8: dataType = Byte dataPtr = unsafe.Pointer(&data[0]) case []int16: dataType = Int16 dataPtr = unsafe.Pointer(&data[0]) case []uint16: dataType = UInt16 dataPtr = unsafe.Pointer(&data[0]) case []int32: dataType = Int32 dataPtr = unsafe.Pointer(&data[0]) case []uint32: dataType = UInt32 dataPtr = unsafe.Pointer(&data[0]) case []float32: dataType = Float32 dataPtr = unsafe.Pointer(&data[0]) case []float64: dataType = Float64 dataPtr = unsafe.Pointer(&data[0]) default: return fmt.Errorf("Error: buffer is not a valid data type (must be a valid numeric slice)") } return C.GDALRasterIO( rasterBand.cval, C.GDALRWFlag(rwFlag), C.int(xOff), C.int(yOff), C.int(xSize), C.int(ySize), dataPtr, C.int(bufXSize), C.int(bufYSize), C.GDALDataType(dataType), C.int(pixelSpace), C.int(lineSpace), ).Err() }