private void OpenGdalDataset(string path) { if (IsOpen) { Close(); } CheckAndFixHeaders(path); gdalDataset = Gdal.Open(path.ToLower(), Access.GA_Update); SetDriver(path); var geoTrans = new double[6]; gdalDataset.GetGeoTransform(geoTrans); var transform = new RegularGridGeoTransform(geoTrans); int sizeX = gdalDataset.RasterXSize; int sizeY = gdalDataset.RasterYSize; // double deltaX = sizeX/gdalDataset.RasterCount; double deltaX = transform.HorizontalPixelResolution; double deltaY = transform.VerticalPixelResolution; var origin = new Coordinate(transform.Left, transform.Top - deltaY * sizeY); yValues = GetValuesArray(deltaY, sizeY, origin.Y); xValues = GetValuesArray(deltaX, sizeX, origin.X); }
public static IEnvelope GetExtents([NotNull] Dataset dataset) { if (dataset == null) { return(null); } var geoTrans = new double[6]; dataset.GetGeoTransform(geoTrans); var err = (CPLErr)Gdal.GetLastErrorType(); if (CPLErr.CE_None != err) { throw new ApplicationException("GetGeoTransform() failed."); } var regularGridGeoTransform = new RegularGridGeoTransform(geoTrans); return(GeometryFactory.CreateEnvelope(regularGridGeoTransform.Left, regularGridGeoTransform.Left + (regularGridGeoTransform.HorizontalPixelResolution * dataset.RasterXSize), regularGridGeoTransform.Top - (regularGridGeoTransform.VerticalPixelResolution * dataset.RasterYSize), regularGridGeoTransform.Top)); }
private void Draw(Dataset dataset, Size size, Graphics g, IEnvelope mapExtents, IEnvelope gridExtents) { var geoTrans = new double[6]; dataset.GetGeoTransform(geoTrans); var geoTransform = new RegularGridGeoTransform(geoTrans); double left = Math.Max(mapExtents.MinX, gridExtents.MinX); double top = Math.Min(mapExtents.MaxY, gridExtents.MaxY); double right = Math.Min(mapExtents.MaxX, gridExtents.MaxX); double bottom = Math.Max(mapExtents.MinY, gridExtents.MinY); int x1 = (int)geoTransform.PixelX(left); int y1 = (int)geoTransform.PixelY(top); int x1width = (int)geoTransform.PixelXwidth(right - left); int y1height = (int)geoTransform.PixelYwidth(top - bottom); int bitmapOffsetX = (int)Math.Max((gridExtents.MinX - mapExtents.MinX) / map.PixelWidth, 0); int bitmapOffsetY = (int)Math.Max((mapExtents.MaxY - gridExtents.MaxY) / map.PixelHeight, 0); int bitmapWidth = (int)Math.Max((right - left) / map.PixelWidth, 0); int bitmapHeight = (int)Math.Max((top - bottom) / map.PixelHeight, 0); if (bitmapWidth > 0 && bitmapHeight > 0 && x1width > 0 && y1height > 0) { Bitmap bitmap = GetBitmapDirect(dataset, x1, y1, x1width, y1height, bitmapWidth, bitmapHeight); g.DrawImage(bitmap, new Point(bitmapOffsetX, bitmapOffsetY)); } }
/// <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); } } }
/// <summary> /// Use netcdf driver to create datastore with the right dimensions /// </summary> public IMultiDimensionalArray GetVariableValues(IVariable variable, params IVariableFilter[] filters) { if (!AutoOpen()) { return(emptyGrid.Components[0].GetValues()); } log.DebugFormat("Getting values for variable {0}", variable.Name); //Non Gdal Values if (variable.Name.Equals("x")) { //return xValues ?? new MultiDimensionalArray<double>(); var geoTrans = new double[6]; gdalDataset.GetGeoTransform(geoTrans); var transform = new RegularGridGeoTransform(geoTrans); var sizeX = gdalDataset.RasterXSize; var sizeY = gdalDataset.RasterYSize; var deltaX = transform.HorizontalPixelResolution; var deltaY = transform.VerticalPixelResolution; var origin = new Coordinate(transform.Left, transform.Top - deltaY * sizeY); return(GetValuesArray(deltaX, sizeX, origin.X)); } if (variable.Name.Equals("y")) { //return yValues ?? new MultiDimensionalArray<double>(); var geoTrans = new double[6]; gdalDataset.GetGeoTransform(geoTrans); var transform = new RegularGridGeoTransform(geoTrans); var sizeY = gdalDataset.RasterYSize; var deltaY = transform.VerticalPixelResolution; var origin = new Coordinate(transform.Left, transform.Top - deltaY * sizeY); return(GetValuesArray(deltaY, sizeY, origin.Y)); } if (!Grid.Components.Contains(variable)) { throw new NotSupportedException("Variable not part of grid:" + variable.Name); } //TODO: switch GetVariableValues and GetVariableValues<T> so that the non-generic calls the generic version. switch (variable.ValueType.ToString()) { case "System.Byte": return(GetGdalValues <byte>(Grid.Components.IndexOf(variable), filters)); case "System.Integer": case "System.Int32": return(GetGdalValues <int>(Grid.Components.IndexOf(variable), filters)); case "System.Int16": return(GetGdalValues <Int16>(Grid.Components.IndexOf(variable), filters)); case "System.UInt32": return(GetGdalValues <UInt32>(Grid.Components.IndexOf(variable), filters)); case "System.UInt16": return(GetGdalValues <UInt16>(Grid.Components.IndexOf(variable), filters)); case "System.Float": case "System.Single": return(GetGdalValues <float>(Grid.Components.IndexOf(variable), filters)); default: return(GetGdalValues <double>(Grid.Components.IndexOf(variable), filters)); } }