Пример #1
0
        /// <summary>
        /// Gdal to DotSpatial at Raster Level
        /// </summary>
        /// <param name="dataset">Gdal Dataset</param>
        /// <param name="bandIndex">Index of Band</param>
        /// <returns>Dotspatial Raster</returns>
        public static DotSpatial.Data.IRaster Gdal2DSRaster(OSGeo.GDAL.Dataset dataset, int bandIndex)
        {
            DotSpatial.Data.IRaster result = null;
            OSGeo.GDAL.Band         band   = dataset.GetRasterBand(bandIndex);
            if (dataset != null)
            {
                switch (band.DataType)
                {
                case OSGeo.GDAL.DataType.GDT_Byte:
                    result = new GdalRaster <byte>(dataset, band);
                    break;

                case OSGeo.GDAL.DataType.GDT_CFloat32:
                case OSGeo.GDAL.DataType.GDT_CFloat64:
                case OSGeo.GDAL.DataType.GDT_CInt16:
                case OSGeo.GDAL.DataType.GDT_CInt32:
                    break;

                case OSGeo.GDAL.DataType.GDT_Float32:
                    result = new GdalRaster <float>(dataset, band);
                    break;

                case OSGeo.GDAL.DataType.GDT_Float64:
                    result = new GdalRaster <double>(dataset, band);
                    break;

                case OSGeo.GDAL.DataType.GDT_Int16:
                    result = new GdalRaster <short>(dataset, band);
                    break;

                case OSGeo.GDAL.DataType.GDT_UInt16:
                case OSGeo.GDAL.DataType.GDT_Int32:
                    result = new GdalRaster <int>(dataset, band);
                    break;

                case OSGeo.GDAL.DataType.GDT_TypeCount:
                    break;

                case OSGeo.GDAL.DataType.GDT_UInt32:
                    result = new GdalRaster <long>(dataset, band);
                    break;

                case OSGeo.GDAL.DataType.GDT_Unknown:
                    break;

                default:
                    break;
                }
            }

            if (result != null)
            {
                (result as DotSpatial.Data.Raster).Open();
            }

            return(result);
        }
Пример #2
0
        public override void Run()
        {
            OpenFileDialog openTiffDialog = new OpenFileDialog();

            if (openTiffDialog.ShowDialog() == DialogResult.OK)
            {
                var tiffName = openTiffDialog.FileName;
                OSGeo.GDAL.Dataset      tiffDataset = OSGeo.GDAL.Gdal.Open(tiffName, OSGeo.GDAL.Access.GA_ReadOnly);
                OSGeo.GDAL.Band         band        = tiffDataset.GetRasterBand(1);
                DotSpatial.Data.IRaster raster      = GIS.GDAL.RasterConverter.Gdal2DSRaster(tiffDataset, 1);
                FileInfo fileInfo = new FileInfo(tiffName);
                raster.Name = fileInfo.Name;
                GIS.FrameWork.Application.App.Map.Layers.Add(raster);
            }
        }
Пример #3
0
        private void regression(List <Cell> samplePoints)
        {
            // 构造输入输出数据集

            // 样本数目
            int COUNT = samplePoints.Count;

            // 构造输入和输出数据集
            double[][] inputs  = new double[COUNT][];
            bool[]     outputs = new bool[COUNT];
            for (int i = 0; i < COUNT; i++)
            {
                Cell cell = samplePoints[i];
                int  pos  = cell.row * width + cell.col;
                inputs[i] = (from buffer in driveBuffers
                             select buffer[pos]).ToArray <double>();
                outputs[i] = cell.type;
            }



            var learner = new IterativeReweightedLeastSquares <Accord.Statistics.Models.Regression.LogisticRegression>()
            {
                Tolerance             = 1e-8, // 收敛参数
                Iterations            = 20,   // 最大循环数目
                Regularization        = 0,
                ComputeStandardErrors = true
            };


            Accord.Statistics.Models.Regression.LogisticRegression regression = learner.Learn(inputs, outputs);


            // 输出 odds
            StringBuilder strb = new StringBuilder();

            for (int i = 0; i <= inputs[0].Length; i++)
            {
                strb.AppendLine(" " + i + " : " + regression.GetOddsRatio(i));
            }
            updateConsoleEvent(strb.ToString());

            // 输出 weights
            StringBuilder strw = new StringBuilder();

            strw.AppendLine("权重系数:");
            strw.AppendLine("截距: " + regression.Intercept.ToString());
            var weights = regression.Weights;

            for (int i = 0; i < weights.Length; i++)
            {
                strw.AppendLine("权重" + (i + 1) + ":" + weights[i]);
            }
            updateConsoleEvent(strw.ToString());

            double[] result  = new double[width * height];
            double   minProp = double.MaxValue;

            double[] minInput = null;
            for (int row = 0; row < height; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    int pos = row * width + col;
                    if (beginBuffer[pos] < 0 || !IsValid(pos))
                    {
                        result[pos] = -9999;
                        continue;
                    }
                    double[] input = (from buffer in driveBuffers
                                      select buffer[pos]).ToArray <double>();
                    double prop = regression.Probability(input);
                    if (prop < minProp)
                    {
                        minProp  = prop;
                        minInput = input;
                    }
                    result[pos] = prop;
                }
            }


            // 新建 GDAL dataset
            OSGeo.GDAL.Driver  driver  = OSGeo.GDAL.Gdal.GetDriverByName("GTIFF");
            OSGeo.GDAL.Dataset dataset = driver.Create(this.ResultLayerName, width, height, 1, OSGeo.GDAL.DataType.GDT_Float64, null);
            dataset.WriteRaster(0, 0, width, height, result, width, height, 1, new int[1] {
                1
            }, 0, 0, 0);
            dataset.FlushCache();

            // 将GDAL dataset转化为IRaster数据集
            DotSpatial.Data.IRaster raster = GIS.GDAL.RasterConverter.Gdal2DSRaster(dataset, 1);
            raster.Name = "Result";
            GIS.FrameWork.Application.App.Map.Layers.Add(raster);
        }
Пример #4
0
        /// <summary>
        /// DotSpatial to Gdal at Raster Level
        /// </summary>
        /// <param name="raster">Dotspatial Raster</param>
        /// <param name="options">Set Options When Gdal Create Dataset. Default is null.</param>
        /// <param name="bandMap">Gdal WriteRaster Method Need to Set BandMap</param>
        /// <returns>Gdal Dataset</returns>
        public static OSGeo.GDAL.Dataset Ds2GdalRaster(DotSpatial.Data.IRaster raster, string[] options, int[] bandMap)
        {
            OSGeo.GDAL.Dataset result = null;
            OSGeo.GDAL.Driver  driver = OSGeo.GDAL.Gdal.GetDriverByName("MEM");

            OSGeo.GDAL.DataType dataType;
            string rasterDataType = raster.DataType.ToString().ToUpper();

            switch (rasterDataType)
            {
            case "SYSTEM.INT32":
            case "SYSTEM.LONG":
                dataType = OSGeo.GDAL.DataType.GDT_Int32;
                break;

            case "SYSTEM.SHORT":
                dataType = OSGeo.GDAL.DataType.GDT_Int16;
                break;

            case "SYSTEM.DOUBLE":
            case "SYSTEM.SINGLE":
                dataType = OSGeo.GDAL.DataType.GDT_Float64;
                break;

            case "SYSTEM.FLOAT":
                dataType = OSGeo.GDAL.DataType.GDT_Float32;
                break;

            case "SYSTEM.BYTE":
                dataType = OSGeo.GDAL.DataType.GDT_Byte;
                break;

            default:
                dataType = OSGeo.GDAL.DataType.GDT_Int16;
                break;
            }

            result = driver.Create("", raster.NumColumnsInFile, raster.NumRowsInFile, 1, dataType, options);

            ///地理坐标信息
            result.SetGeoTransform(raster.Bounds.AffineCoefficients);
            ///投影设置 Set Projection
            result.SetProjection(raster.Projection.ToProj4String());
            ///波段个数
            int bandNum = raster.NumBands;

            if (bandNum < 1)
            {
                bandNum = 1;
            }

            ///赋值
            switch (rasterDataType)
            {
            case "SYSTEM.INT32":
            case "SYSTEM.LONG":
                result.WriteRaster(0, 0, raster.NumColumns, raster.NumRows, DS2GdalValue <int>(raster), raster.NumColumns, raster.NumRows, bandNum, bandMap, 0, 0, 0);
                break;

            case "SYSTEM.SHORT":
                result.WriteRaster(0, 0, raster.NumColumns, raster.NumRows, DS2GdalValue <short>(raster), raster.NumColumns, raster.NumRows, bandNum, bandMap, 0, 0, 0);
                break;

            case "SYSTEM.DOUBLE":
            case "SYSTEM.SINGLE":
                result.WriteRaster(0, 0, raster.NumColumns, raster.NumRows, DS2GdalValue <double>(raster), raster.NumColumns, raster.NumRows, bandNum, bandMap, 0, 0, 0);
                break;

            case "SYSTEM.FLOAT":
                result.WriteRaster(0, 0, raster.NumColumns, raster.NumRows, DS2GdalValue <float>(raster), raster.NumColumns, raster.NumRows, bandNum, bandMap, 0, 0, 0);
                break;

            case "SYSTEM.BYTE":
                result.WriteRaster(0, 0, raster.NumColumns, raster.NumRows, DS2GdalValue <byte>(raster), raster.NumColumns, raster.NumRows, bandNum, bandMap, 0, 0, 0);
                break;

            default:
                result.WriteRaster(0, 0, raster.NumColumns, raster.NumRows, DS2GdalValue <int>(raster), raster.NumColumns, raster.NumRows, bandNum, bandMap, 0, 0, 0);
                break;
            }

            return(result);
        }
Пример #5
0
        /// <summary>
        /// DotSpatial to Gdal at Value Level
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="raster">Dotspatial Raster</param>
        /// <returns>Value of Raster</returns>
        private static T[] DS2GdalValue <T>(DotSpatial.Data.IRaster raster)
        {
            T[]      result         = new T[raster.NumRows * raster.NumColumns];
            Object[] objects        = new Object[raster.NumRows * raster.NumColumns];
            int      i              = 0;
            string   rasterDataType = raster.DataType.ToString().ToUpper();

            switch (rasterDataType)
            {
            case "SYSTEM.INT32":
            case "SYSTEM.LONG":
                for (int row = 0; row < raster.NumRows; row++)
                {
                    for (int column = 0; column < raster.NumColumns; column++)
                    {
                        result[i] = (T)((object)(int)raster.Value[row, column]);
                        i++;
                    }
                }
                break;

            case "SYSTEM.SHORT":
                for (int row = 0; row < raster.NumRows; row++)
                {
                    for (int column = 0; column < raster.NumColumns; column++)
                    {
                        result[i] = (T)((object)(short)raster.Value[row, column]);
                        i++;
                    }
                }
                break;

            case "SYSTEM.DOUBLE":
            case "SYSTEM.SINGLE":
                for (int row = 0; row < raster.NumRows; row++)
                {
                    for (int column = 0; column < raster.NumColumns; column++)
                    {
                        result[i] = (T)((object)(double)raster.Value[row, column]);
                        i++;
                    }
                }
                break;

            case "SYSTEM.FLOAT":
                for (int row = 0; row < raster.NumRows; row++)
                {
                    for (int column = 0; column < raster.NumColumns; column++)
                    {
                        result[i] = (T)((object)(float)raster.Value[row, column]);
                        i++;
                    }
                }
                break;

            case "SYSTEM.BYTE":
                for (int row = 0; row < raster.NumRows; row++)
                {
                    for (int column = 0; column < raster.NumColumns; column++)
                    {
                        result[i] = (T)((object)(byte)raster.Value[row, column]);
                        i++;
                    }
                }
                break;

            default:
                for (int row = 0; row < raster.NumRows; row++)
                {
                    for (int column = 0; column < raster.NumColumns; column++)
                    {
                        result[i] = (T)((object)(int)raster.Value[row, column]);
                        i++;
                    }
                }
                break;
            }

            return(result);
        }