Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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));
            }
        }
Beispiel #4
0
        /// <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);
                }
            }
        }
Beispiel #5
0
        /// <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));
            }
        }