/// <summary> /// Processes a raster file stored as an ESRI Grid into an 8-bit RGB .tif file based on a value-color map. Pass the function the hdr.adf file. /// </summary> /// <param name="args"></param> /// <param name="colorRepo"></param> /// <param name="resultDir"></param> /// <param name="srcDrv"></param> /// <param name="fi">FileInfo of the hdr.adf file of the grid.</param> /// <param name="resultName"></param> private static void ProcessRasterGrid(string[] args, IColorRepository colorRepo, DirectoryInfo resultDir, OSGeo.GDAL.Driver srcDrv, FileInfo fi, string resultName) { Console.WriteLine(string.Format("Processing {0}.adf into {1}...", fi.Directory.Name, resultName)); StringBuilder bldr = new StringBuilder(); //read data from source raster Dataset src = Gdal.Open(fi.FullName, Access.GA_ReadOnly); Band band = src.GetRasterBand(1); double[] r = new double[band.XSize * band.YSize]; byte[] red = new byte[band.XSize * band.YSize]; byte[] green = new byte[band.XSize * band.YSize]; byte[] blue = new byte[band.XSize * band.YSize]; band.ReadRaster(0, 0, band.XSize, band.YSize, r, band.XSize, band.YSize, 0, 0); //assign values to rgb rasters to produce new raster with rgb bands matching color pattern for (int cell = 0; cell < r.Length; cell++) { RGBColors colors = colorRepo.ColorsOfValueInFile(fi.Directory.Name, resultName, r[cell]); red[cell] = (byte)colors.Red; green[cell] = (byte)colors.Green; blue[cell] = (byte)colors.Blue; } //write new output using (Dataset output = srcDrv.Create(resultDir + resultName, band.XSize, band.YSize, 3, DataType.GDT_Byte, null)) { if (output == null) { Console.WriteLine("Can't create " + args[0]); System.Environment.Exit(-1); } //set metadata output.SetProjection(src.GetProjection()); double[] geotransform = new double[0]; src.GetGeoTransform(geotransform); output.SetGeoTransform(geotransform); //prepare data for write int[] colorData = new int[red.Length * 3]; red.CopyTo(colorData, 0); green.CopyTo(colorData, red.Length); blue.CopyTo(colorData, red.Length + green.Length); //write data to disk output.WriteRaster(0, 0, band.XSize, band.YSize, colorData, band.XSize, band.YSize, 3, null, 0, 0, 0); output.FlushCache(); } }