private static Driver GetTargetDatasetDriver(string path) { var driverName = GdalHelper.GetDriverName(path); RegisterGdal(); return(Gdal.GetDriverByName(driverName)); }
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)); } } } }
/// <summary> /// Use store to copy values from function to datasource and connect store to function. /// </summary> /// <param name="function"></param> private void AddFunction(IFunction function) { if (!(function is IRegularGridCoverage)) { return; } if (state == GdalState.Initializing) { return; } var addedCoverage = (IRegularGridCoverage)function; xValues = addedCoverage.X.Values; yValues = addedCoverage.Y.Values; //Close(); //clean up resources used by current dataset if any. var driverName = GdalHelper.GetDriverName(path); using (Driver gdalDriver = Gdal.GetDriverByName(driverName)) { VerifyDriverIsValid(gdalDriver); if (addedCoverage.Store is GdalFunctionStore) { //CopyCurrentDatasetFromAddedCoverage((GdalFunctionStore)addedCoverage.Store, gdalDriver); var store = (GdalFunctionStore)addedCoverage.Store; CopyCurrentDatasetFromAddedCoverage(store, gdalDriver); return; } //verify if all components are of the same type VerifyComponentTypesAreSame(addedCoverage); //substitute driver by in-memory driver in case driver is read-only SubstituteDriverByInMemIfReadonly(addedCoverage, gdalDriver); if (gdalDataset == null) { throw new IOException(String.Format("Cannot open file: {0}", path)); } { var transform = new RegularGridGeoTransform(addedCoverage.Origin.X, addedCoverage.Origin.Y + addedCoverage.DeltaY * addedCoverage.SizeY, addedCoverage.DeltaX, addedCoverage.DeltaY); //todo check: lowerleft corner or upperleft corner. (currently using upperleft corner as reference point) gdalDataset.SetGeoTransform(transform.TransForm); // add agruments functions.Add(addedCoverage.X); functions.Add(addedCoverage.Y); //copy components to this store for (int i = 0; i < addedCoverage.Components.Count; i++) { IMultiDimensionalArray componentValues = addedCoverage.Components[i].Values; functions.Add(addedCoverage.Components[i]); addedCoverage.Components[i].SetValues(componentValues); } gdalDataset.FlushCache(); } if (gdalDataset == null) { log.ErrorFormat("No GdalDataset available to write/read {0}.", path); } } }