public void TestMethod1() { Ogr.RegisterAll(); var shpDriver = Ogr.GetDriverByName("ESRI Shapefile"); var gdbDriver = Ogr.GetDriverByName("OpenFileGDB"); var gdbDatasource = gdbDriver.Open(@"C:\test\temp.gdb", 0); Trace.WriteLine(gdbDatasource.GetLayerCount()); var layerList = gdbDatasource.Layers().ToList(); layerList.ForEach((layer) => { Trace.WriteLine(String.Format( "{0:D3} {1} {2} {3}", layerList.IndexOf(layer), layer.GetName(), layer.GetGeomType(), layer.GetFeatureCount(20) )); }); GdalUtils.OgrDrivers().ToList().ForEach((driver) => { Trace.WriteLine(driver.name); }); }
public GdalUtilsTests() { // https://github.com/dwtkns/gdal-cheat-sheet _gdalUtils = new GdalUtils { GlobalCallback = this }; }
private bool RunGdalImport(string inputFilename, string newTableName = null, string tablename = null) { DBConnectionTool db = new DBConnectionTool(this.AxMap, this.MapControlTools); string outputFilename = db.GetGdalConnectionString(); var gdalUtils = new GdalUtils(); var options = new[] { "-append" }; if ((newTableName != null)) { options = new[] { "-nln", newTableName, "-overwrite", tablename } } ; ExportImportCallback callback = new ExportImportCallback(MapControlTools); callback.GdalFinished += Callback_GdalFinished; gdalUtils.GlobalCallback = callback; openTasks++; if (!gdalUtils.GdalVectorTranslate(inputFilename, outputFilename, options, true)) { Events.MapControl_Error export_error = new Events.MapControl_Error() { ErrorCode = Events.ErrorCodes.ImportExportError, InMethod = "ImportProject", AxMapError = gdalUtils.ErrorMsg[gdalUtils.LastErrorCode] + " Detailed error: " + gdalUtils.DetailedErrorMsg }; On_Error(export_error); return(false); } return(true); }
public GdalUtilsTests() { // https://github.com/dwtkns/gdal-cheat-sheet _gdalUtils = new GdalUtils { GlobalCallback = this }; Debug.WriteLine("Start of tests " + DateTime.Now); }
public void SaveMapAsJPEG(string filename) { var gdalUtils = new GdalUtils(); PrintCallback callback = new PrintCallback(MapControlTools); gdalUtils.GlobalCallback = callback; var image = AxMap.SnapShot(AxMap.Extents); image.Save(filename, true, ImageType.JPEG_FILE); }
public void LayerCsvTest() { Trace.WriteLine(Uri.HexEscape(',')); var urus = Uri.EscapeDataString("ad,asd"); Trace.WriteLine(urus); Ogr.RegisterAll(); var shpDriver = Ogr.GetDriverByName("ESRI Shapefile"); var shpDs = shpDriver.Open(@"C:\test\continents.shp", 0); var layer = shpDs.GetLayerByIndex(0); var csv = GdalUtils.LayerToCsvString(layer, true); Trace.WriteLine(csv); }
public void Run(string filename, string fileLocation, RasterLayer r) { string localData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var output = localData + "\\ResTBDesktop\\temp\\" + filename; var options = new[] { "-t_srs", "EPSG:3857", "-overwrite" }; var gdalUtils = new GdalUtils(); RasterReprojectCallback callback = new RasterReprojectCallback(r, MapControlTools); gdalUtils.GlobalCallback = callback; if (!gdalUtils.GdalRasterWarp(fileLocation, output, options)) { Events.MapControl_Error imghandle_error = new Events.MapControl_Error() { ErrorCode = Events.ErrorCodes.GdalWarpError, InMethod = "AddRasterLayer", AxMapError = "GdalWarp failed: " + gdalUtils.ErrorMsg[gdalUtils.LastErrorCode] + " Detailed error: " + gdalUtils.DetailedErrorMsg }; MapControlTools.On_Error(imghandle_error); } if (MapControl_RasterReprojected != null) { Events.MapControl_RasterReprojected eventArgs = new Events.MapControl_RasterReprojected(); eventArgs.rasterLayer = r; MapControl_RasterReprojected(this, eventArgs); } Events.MapControl_BusyStateChange bc = new Events.MapControl_BusyStateChange(); bc.BusyState = Events.BusyState.Idle; bc.KeyOfSender = "Rasterreprojected"; bc.Percent = 100; bc.Message = ""; MapControlTools.On_BusyStateChange(bc); }
private static void CrrPhNetCDFToGTiff(string input, string output, string raster_medatada, string band_metadata) { short[][] data = GdalUtils.GetBandDataInt16(input, 1); int NRows = data.Length; int NCols = data[0].Length; double dX = 3000.4033; double MinX = -2854883.8, MinY = 2278806.5; //GdalUtils.GDALInfoGetPosition() //a.File2Coods(ref MinX, ref MinY, a.getNumFilas,1); // Datos de la malla en formato "GDAL" var datos = new float[NRows * NCols]; var cont = 0; for (int i = NRows - 1; i >= 0; i--) { //Array.Copy(data[i], 0, datos, i*NCols, data[i].Length); for (int j = 0; j < NCols; j++) { datos[cont] = data[i][j]; cont++; } } // Sistema de coordenadas string EsriWkt = config["CRR-Ph:PROJ_ESRI_WKT_2"]; Console.WriteLine("============= " + EsriWkt); var YMax = 4979169.5; var GeoTrans = new[] { MinX, dX, 0, YMax, 0, -dX }; GdalUtils.CreateRaster("GTiff", output, NRows, NCols, MinX, MinY, dX, EsriWkt, GeoTrans, new List <float[]>() { datos }, raster_medatada, new List <string>() { band_metadata }); }
private bool RunGdalTranslate(string inputFilename, string outputFilename, string outputType, string sql, bool append = false, string newTableName = null) { var gdalUtils = new GdalUtils(); var options = new[] { "-f", outputType, "-sql", sql, "-overwrite" }; if (append) { List <string> newOptions = options.ToList(); newOptions.Add("-append"); options = newOptions.ToArray(); } if (newTableName != null) { List <string> newOptions = options.ToList(); newOptions.Add("-nln"); newOptions.Add(newTableName); options = newOptions.ToArray(); } ExportImportCallback callback = new ExportImportCallback(MapControlTools); callback.GdalFinished += Callback_GdalFinished; gdalUtils.GlobalCallback = callback; openTasks++; if (!gdalUtils.GdalVectorTranslate(inputFilename, outputFilename, options, true)) { Events.MapControl_Error export_error = new Events.MapControl_Error() { ErrorCode = Events.ErrorCodes.ImportExportError, InMethod = "ExportProject", AxMapError = gdalUtils.ErrorMsg[gdalUtils.LastErrorCode] + " Detailed error: " + gdalUtils.DetailedErrorMsg }; On_Error(export_error); return(false); } return(true); }
private static void AREAnnnToGTiff(string input, string output, string raster_medatada, string band_metadata) { var a = new AREAnnnnFile.AREAnnnn(input); int NRows = a.getNumFilas; int NCols = a.getNumCols; double dX = 1000d * a.getResCols * a.GetXSpace(); //double dY = 1000d * a.getResFilas * a.GetXSpace(); no es necesario, se asume malla cuadrada. double MinX = 0, MinY = 0; a.File2Coods(ref MinX, ref MinY, a.getNumFilas, 1); // Datos de la malla en formato "GDAL" var d = a.GetDatos(); var datos = new float[a.getNumFilas * a.getNumCols]; var cont = 0; for (int i = a.getNumFilas - 1; i >= 0; i--) { for (int j = 0; j < a.getNumCols; j++) { datos[cont] = d[i, j]; cont++; } } // Sistema de coordenadas string EsriWkt = config["RADAR_AEMET:PROJ_ESRI_WKT"]; var GeoTrans = new[] { MinX, dX, 0, MinY, 0, dX }; GdalUtils.CreateRaster("GTiff", output, NRows, NCols, MinX, MinY, dX, EsriWkt, GeoTrans, new List <float[]>() { datos }, raster_medatada, new List <string>() { band_metadata }); }
static void Main(string[] args) { var SO = "WIN"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { SO = "LINUX"; } if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { SO = "WIN"; } if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { Console.WriteLine("MAC not supported"); System.Environment.Exit(0); } /* -------------------------------------------------------------------- */ /* Read config file . */ /* -------------------------------------------------------------------- */ var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); var builder = new ConfigurationBuilder() .AddJsonFile("appsettings.json", true, true) .AddJsonFile($"appsettings.{SO}.json", true, true) .AddJsonFile($"appsettings.{env}.json", true, true) .AddEnvironmentVariables(); config = builder.Build(); logger.Debug($"Configuration: {config.GetDebugView()}"); // https://blog.bitscry.com/2017/11/14/reading-lists-from-appsettings-json/ //List<string> PolygonsLayers = config.GetSection("CATCHMENTS_LAYERS").Get<List<string>>(); var datapath = config["DATA_PATH"]; if (!Directory.Exists(datapath)) { logger.Error($"No se ha encontrado la ruta de datos {datapath}"); } /* -------------------------------------------------------------------- */ /* Configure GDal driver(s). */ /* -------------------------------------------------------------------- */ try { Gdal.PushErrorHandler(GdalUtils.GDalErrorHandler); GdalUtils.Configure(); Gdal.UseExceptions(); } catch (Exception ex) { logger.Error(ex, ex.StackTrace + " " + Gdal.GetLastErrorMsg()); } // Lectura de datos de AEMet de GNavarra (radares individuales) y traducción a TIFF if (false) { var TarsDir = @"C:\XXX\GeoTiffTests\data\GNavarra_AEMet.tar\Radar\RAD_ZAR.2021030.00.tar\"; foreach (var f in Directory.GetFiles(TarsDir, "*.tar")) { ReadAEMetRadarFile(f, datapath); } System.Environment.Exit(1); } // Lectura de datos de AEMet (composición radar) y traducción a GeoTIFF if (false) { var GZsDir = @"C:\Users\Administrador.000\Desktop\Nueva carpeta\"; foreach (var f in Directory.GetFiles(GZsDir, "ACUM-RAD-*.gz")) { Console.WriteLine(f); UncompressFiles(f, GZsDir); } foreach (var f in Directory.GetFiles(GZsDir, "AREA????")) { var output = Path.ChangeExtension(f, ".tiff"); if (File.Exists(output)) { File.Delete(output); } object raster_metedata = new { type = "AEMet_radar", ogirin = $"{f}", creation_time_utc = DateTime.Now.ToUniversalTime().ToString("yyyyMMddHHmmss") }; AREAnnnToGTiff(f, output, JsonConvert.SerializeObject(raster_metedata), JsonConvert.SerializeObject(new {})); logger.Info($"Creado {output} desde AREAnnnn ({f})"); } System.Environment.Exit(1); } // Lectura de ficheros CRR-Ph, obtención de la banda de acumulación de lluvia y traducción a GeoTIFF if (false) { var BAND_NAME = "crrph_accum"; foreach (var netcdf in Directory.GetFiles("C:/XXX/Navarra/smb-gnavarra-crr/", "*.nc")) { logger.Info($"CRR-Ph NetCDf to GeoTIFF {netcdf}"); object raster_metedata = new { type = "CRR-Ph", ogirin = $"{netcdf}", creation_time_utc = DateTime.Now.ToUniversalTime().ToString("yyyyMMddHHmmss") }; using (Dataset ds = Gdal.Open(netcdf, Access.GA_ReadOnly)) { var list = ds.GetMetadata("SUBDATASETS").Cast <string>().ToList(); //Console.WriteLine($" {string.Join(" \r\n", list)}"); foreach (var subdataset in list.Where(s => s.Contains("_NAME=") && s.Contains(BAND_NAME, StringComparison.OrdinalIgnoreCase))) { logger.Info($"Subdataset: {subdataset}"); Console.WriteLine($" {subdataset}"); var InputFileName = subdataset.Split("=")[1]; var OutputFileName = $"C:/XXX/Navarra/smb-gnavarra-crr/{Path.GetFileNameWithoutExtension(netcdf)}_{subdataset.Split("//")[1]}.tiff"; CrrPhNetCDFToGTiff(InputFileName, OutputFileName, JsonConvert.SerializeObject(raster_metedata), JsonConvert.SerializeObject(new {})); } } } ; //var netcdf = "C:/XXX/Navarra/smb-gnavarra-crr/S_NWC_CRR-Ph_MSG4_AEMET-VISIR_20210310T230000Z.nc"; //-2854883.8 3000.4033 0 4979169.5 0 -3000.4033 } // Equal rasters sum if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("===========================SUM rasters (--)=================================="); var InputRaster = Path.Combine(datapath, "2021036.120000.RAD_ZAR - copia.tiff"); GdalUtils.SumRasters(Directory.GetFiles(datapath, "2021036.??0000.RAD_ZAR.tiff"), Path.Combine(datapath, "sumaParalelo.tiff")); } // Coordinates reprojection if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("===========================REPROJECTION coordinate testing (OK)=================================="); try { var ret = GdalUtils.ReprojectCoordinates(23030, 4326, 85530d, 446100d, 0d); } catch (Exception ex) { logger.Error(ex, ex.StackTrace + " " + Gdal.GetLastErrorMsg()); } } // Gdal info: información sobre la carga de GDAL if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("===========================GDAL INFO=================================="); try { GdalUtils.GetGdalInfo(); } catch (Exception ex) { logger.Error(ex, Gdal.GetLastErrorMsg()); } } // Create TIFF and adding bands if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("========================Crear GTiff y añadir bandas ====================================="); try { var output = Path.Combine(datapath, "CreateRasterNew.tiff"); if (File.Exists(output)) { File.Delete(output); } int NRows = 200; int Ncols = 100; double MinX = 55; double MinY = 45; double CellSize = 0.1; string src_wkt = GdalUtils.EPSG2WKT(4326); var valores = new List <float[]>(); for (var band = 0; band < 5; band++) { var buffer = new float [NRows * Ncols]; for (int i = 0; i < Ncols; i++) { for (int j = 0; j < NRows; j++) { buffer[i * Ncols + j] = (float)(i * 256 / Ncols) * band; } } valores.Add(buffer); } var GeoTrans = new[] { MinX, CellSize, 0, MinY, 0, CellSize }; GdalUtils.CreateRaster("GTiff", output, NRows, Ncols, MinX, MinY, CellSize, src_wkt, GeoTrans, valores, null, null); } catch (System.Exception ex) { logger.Error(ex, Gdal.GetLastErrorMsg()); } } // Raster reprojection if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("========================Raster reprojection ====================================="); try { int OutEpsg = 23030; var input = Path.Combine(datapath, "CreateRaster.tiff"); var output = Path.Combine(datapath, $"CreateRasterNew{OutEpsg}.tiff"); if (File.Exists(output)) { File.Delete(output); } GdalUtils.RasterReprojection(input, output, OutEpsg); } catch (System.Exception ex) { logger.Error(ex, Gdal.GetLastErrorMsg()); } } // GDAL Translate GRIB2 => GTiff if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("========================Translate GRIB2 => GTiff (OK) ====================================="); try { // Funciona pero tarda mucho: var input = Path.Combine(datapath, "pluviometrosIDW.tiff"); var output = Path.Combine(datapath, "pluviometrosIDW.asc"); if (File.Exists(output)) { File.Delete(output); } GdalUtils.TranslateRasterFormat(input, output, "AAIGrid"); } catch (System.Exception ex) { logger.Error(ex, Gdal.GetLastErrorMsg()); } } // IDW with gradient correction if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("========================IDW con gradiente (OK)====================================="); try { 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); Random random = new Random(); double GetRandomNumber(double minimum, double maximum) { return(random.NextDouble() * (maximum - minimum) + minimum); } int NumTermometros = 350; var Points = new List <OSGeo.OGR.Geometry>(); // Add more points for (int w = 1; w < NumTermometros; w++) { var pnew = new Geometry(wkbGeometryType.wkbPoint); pnew.AddPointZM( GetRandomNumber(xMin, xMax), GetRandomNumber(yMin, yMax), GetRandomNumber(100, 300), GetRandomNumber(0, 10)); Points.Add(pnew); } SurfaceInterpolations.IdwTemperaturesWithElevationCorrection(Path.Combine(datapath, $"IdwTemperaturesWithElevationCorrection_{Points.Count}.tiff"), Points); } catch (System.Exception ex) { logger.Error(ex, Gdal.GetLastErrorMsg()); } } // IDW with NearestNeighbour if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("========================IDW NN (OK)====================================="); try { SurfaceInterpolations.IDWwithNearestNeighbour(Path.Combine(datapath, "pluviometros_23030.shp"), Path.Combine(datapath, "pluviometrosIDW.tiff")); } catch (System.Exception ex) { logger.Error(ex, Gdal.GetLastErrorMsg()); } } // Create contour if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("========================Contour (OK)====================================="); try { var input = Path.Combine(datapath, "pluviometrosIDW.tiff"); var output = Path.Combine(datapath, "contour.shp"); if (File.Exists(input)) { File.Delete(input); } if (File.Exists(output)) { File.Delete(output); } GdalUtils.Contour(input, output, 1d, 0d); } catch (System.Exception ex) { logger.Error(ex, Gdal.GetLastErrorMsg()); } } // Raster info: Geotiff multiband if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("=============================Info GEOTIFF Multiband======================================"); GDALInfo.Info(Path.Combine(datapath, "CHEBROe00.20201125.tif"), false); } // Raster info: GRIB2 multiband if (false) { Console.WriteLine("==================================================================="); Console.WriteLine("==============================Info GRIB2====================================="); GDALInfo.Info(Path.Combine(datapath, "CHEBROe00.20201125.grib2"), true); } }
public void AddProjectLayersThread(int Project) { var gdalUtils = new GdalUtils(); RasterReprojectCallback callback = new RasterReprojectCallback(null, MapControlTools); gdalUtils.GlobalCallback = callback; ds = new OgrDatasource(); if (!ds.Open(dBConnection.GetGdalConnectionString())) { Events.MapControl_Error error = new Events.MapControl_Error() { ErrorCode = Events.ErrorCodes.CouldNotConnectDatabase, InMethod = "AddPostGISLayer", AxMapError = ds.GdalLastErrorMsg }; On_Error(error); return; } else { Events.MapControl_BusyStateChange bc = new Events.MapControl_BusyStateChange(); bc.BusyState = Events.BusyState.Busy; bc.KeyOfSender = "AddProjectLayersThread"; bc.Percent = 10; bc.Message = Resources.MapControl_AddedPerimeter; MapControlTools.On_BusyStateChange(bc); // RiskMap if (!AddProjectLayer(Project, ResTBPostGISType.RiskMap)) { return; } if (!AddProjectLayer(Project, ResTBPostGISType.RiskMapAfter)) { return; } // Perimeter if (!AddProjectLayer(Project, ResTBPostGISType.Perimeter)) { return; } if (MapControlTools.ShapesCount(MapControlTools.GetLayerNamesFromPostGISType(ResTBPostGISType.Perimeter).First()) > 0) { MapControlTools.ZoomToLayer(MapControlTools.GetLayerNamesFromPostGISType(ResTBPostGISType.Perimeter).First()); } // Hazard Maps DB.ResTBContext db = new DB.ResTBContext(); List <HazardMap> hazardMaps = db.HazardMaps.Where(m => m.Project.Id == Project).Include(m => m.NatHazard).OrderBy(m => m.Index).ToList(); double percentadd = 50.0 / hazardMaps.Count; int currentpercent = 10; foreach (HazardMap hazardMap in hazardMaps.OrderByDescending(m => m.BeforeAction)) { ResTBHazardMapLayer hazardLayer; if (hazardMap.BeforeAction) { hazardLayer = new ResTBHazardMapLayer(Project, true, hazardMap.NatHazard, hazardMap.Index); } else { hazardLayer = new ResTBHazardMapLayer(Project, false, hazardMap.NatHazard, hazardMap.Index); } currentpercent += (int)percentadd; if (!MapControlTools.Layers.Where(m => m.Name == hazardLayer.Name).Any()) { AddProjectLayer(hazardLayer, false); bc = new Events.MapControl_BusyStateChange(); bc.BusyState = Events.BusyState.Busy; bc.KeyOfSender = "AddProjectLayersThread"; bc.Percent = currentpercent; bc.Message = Resources.MapControl_AddingHazardMaps; MapControlTools.On_BusyStateChange(bc); } } // Damage Potential if (!AddProjectLayer(Project, ResTBPostGISType.DamagePotential)) { return; } // Resiliences if (!AddProjectLayer(Project, ResTBPostGISType.ResilienceBefore)) { return; } if (!AddProjectLayer(Project, ResTBPostGISType.ResilienceAfter)) { return; } currentpercent += 30; bc = new Events.MapControl_BusyStateChange(); bc.BusyState = Events.BusyState.Busy; bc.KeyOfSender = "AddProjectLayersThread"; bc.Percent = currentpercent; bc.Message = Resources.MapControl_AddedDamagePotentials; MapControlTools.On_BusyStateChange(bc); // Mitigation Measure if (!AddProjectLayer(Project, ResTBPostGISType.MitigationMeasure)) { return; } currentpercent += 10; bc = new Events.MapControl_BusyStateChange(); bc.BusyState = Events.BusyState.Idle; bc.KeyOfSender = "Project"; bc.Percent = 100; bc.Message = Resources.MapControl_ProjectLoaded;// "Project loaded"; MapControlTools.On_BusyStateChange(bc); return; } }