private void Functions_CollectionChanging(object sender, NotifyCollectionChangingEventArgs e) { if (!AutoOpen()) { return; } if ((e.Action == NotifyCollectionChangeAction.Add || e.Action == NotifyCollectionChangeAction.Replace) && e.Item is IRegularGridCoverage) { var grid = (IRegularGridCoverage)e.Item; var driverName = GdalHelper.GetDriverName(path); RegisterGdal(); using (var gdalDriver = Gdal.GetDriverByName(driverName)) { var gdalType = GdalHelper.GetGdalDataType(gdalDriver, grid.Components[0].ValueType); var gdalvariableValue = GdalHelper.GetVariableForDataType(gdalType);// TODO: strange logic, use supported GDAL types here (as .NET types) instead var type = gdalvariableValue.ValueType; if (type != grid.Components[0].ValueType) { throw new InvalidOperationException(string.Format("Value type {0} is not supported by GDAL driver", grid.Components[0].ValueType)); } } } }
private void SubstituteDriverByInMemIfReadonly(IRegularGridCoverage addedCoverage, Driver gdalDriver) { var canCreate = gdalDriver.GetMetadataItem("DCAP_CREATE", null) == "YES"; //cannot create use mem driver. if (!canCreate) { using (var inMemoryDriver = Gdal.GetDriverByName("MEM")) { DataType dataType = GdalHelper.GetGdalDataType(inMemoryDriver, addedCoverage.Components[0].ValueType); if (dataType.Equals(DataType.GDT_Unknown)) { throw new NotSupportedException( String.Format("The datatype {0} cannot be saved to this kind of file: {1}", addedCoverage.Components[0].ValueType, System.IO.Path.GetExtension(path))); } gdalDataset = inMemoryDriver.Create(path, addedCoverage.SizeX, addedCoverage.SizeY, addedCoverage.Components.Count, dataType, new string[] { }); } } else { DataType dataType = GdalHelper.GetGdalDataType(gdalDriver, addedCoverage.Components[0].ValueType); if (dataType.Equals(DataType.GDT_Unknown)) { throw new NotSupportedException( String.Format("The datatype {0} cannot be saved to this kind of file: {1}", addedCoverage.Components[0].ValueType, System.IO.Path.GetExtension(path))); } gdalDataset = gdalDriver.Create(path, addedCoverage.SizeX, addedCoverage.SizeY, addedCoverage.Components.Count, dataType, new string[] { }); } }
private static Dataset GetOutputDataset <T>(Dataset gdalDataset, Driver gdalDriver, Driver targetDatasetDriver, IRegularGridCoverage gridCoverage, int rasterBandIndex, RasterBoundaries rasterBoundaries, T[] values) { Dataset outputDataset = gdalDataset; if (targetDatasetDriver.ShortName == "PCRaster") { // Convert the in mem dataset to a pc rasterBoundaries compatible one... Type valueType = gridCoverage.Components[0].ValueType; DataType dataType = GdalHelper.GetGdalDataType(targetDatasetDriver, valueType); outputDataset = gdalDriver.Create(gridCoverage.Name, gdalDataset.RasterXSize, gdalDataset.RasterYSize, gridCoverage.Components.Count, dataType, new string[] { }); GdalHelper.SetValuesForBand(outputDataset, rasterBandIndex, rasterBoundaries.StartX, rasterBoundaries.StartY, rasterBoundaries.WidthX, rasterBoundaries.WidthY, values); } return(outputDataset); }