Example #1
0
        /// <summary>
        /// Performs IDW with NN surface interpolation
        /// </summary>
        /// <param name="InputVector"></param>
        /// <param name="OutputTIFF"></param>
        public static void IDWwithNearestNeighbour(string InputVector, string OutputTIFF)
        {
            // No se realiza ningún tipo de reproyección, el TIFF se genera con el mismo sistema de coordenadas que el vectorial de entrada

            // Dimensiones del raster de salida (todas las coordenadas se establecel en unidades del sistema de coordinadas del vectorial de entrada)
            double CellSize = 10000;
            double xMin     = 360000;
            double yMax     = 4830000;
            int    NumCols  = 59;
            int    NumRows  = 39;
            double yMin     = yMax - (NumRows * CellSize);
            double xMax     = xMin + (NumCols * CellSize);

            //-----------------------------
            // Parámetros de interpolación
            //-----------------------------
            var cul        = System.Globalization.CultureInfo.InvariantCulture;
            var parameters = new List <string>();

            parameters.AddRange(new string[] { "-zfield", "rainfall" }); // Campo con datos para interpolar
            parameters.AddRange(new string[] { "-txe", xMin.ToString(cul), xMax.ToString(cul) });
            parameters.AddRange(new string[] { "-tye", yMin.ToString(cul), yMax.ToString(cul) });
            parameters.AddRange(new string[] { "-outsize", NumCols.ToString(cul), NumRows.ToString(cul) });
            // algoritmo a utilizar (https://gdal.org/programs/gdal_grid.html#interpolation-algorithms)
            double radious = Math.Max((xMax - xMin) / 2, (yMax - yMin) / 2);

            parameters.AddRange(new string[] { "-a", $"invdistnn:power=2.0:smothing=0.0:radius={radious.ToString(cul)}:max_points=12:min_points=5:nodata=0.0" });
            parameters.AddRange(new string[] { "-of", "gtiff" });                          // formato de salida
            parameters.AddRange(new string[] { "-ot", "Float32" });                        // tipo de datos de salida
            parameters.AddRange(new string[] { "--config", "GDAL_NUM_THREADS ALL_CPUS" }); // una u otra, no se sabe
            parameters.AddRange(new string[] { "--config", "GDAL_NUM_THREADS=ALL_CPUS" }); // una u otra, no se sabe

            logger.Trace("Parámetros: " + string.Join(" ", parameters));

            //-----------------------------
            // Vectorial de entrada
            // Si el vectorial tiene algún valor no válido deben ser limpiados aquí
            // Ejecución del algoritmo
            //-----------------------------
            using (var ds = Gdal.OpenEx(InputVector, 0, null, null, null)) {
                var gridDS = Gdal.wrapper_GDALGrid(OutputTIFF, ds, new GDALGridOptions(parameters.ToArray()), (Gdal.GDALProgressFuncDelegate)GdalUtils.GDalProgress, string.Empty);
                gridDS.SetDescription("SUAT.IDW from pluviometers");
                //gridDS.SetMetadata( {"": '1', 'key2': 'yada'} );
            }
        }