Exemplo n.º 1
0
        private static Driver GetTargetDatasetDriver(string path)
        {
            var driverName = GdalHelper.GetDriverName(path);

            RegisterGdal();
            return(Gdal.GetDriverByName(driverName));
        }
Exemplo n.º 2
0
        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));
                    }
                }
            }
        }
Exemplo n.º 3
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);
                }
            }
        }