コード例 #1
0
        /// <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();
            }
        }