/// <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'} ); } }