/// <summary> /// 模拟结束事件监听辅助函数 /// </summary> protected void SimulateEndHelper(BaseCa ca) { // 将模拟结果添加到系统中 double[] buffer = ca.BeginBuffer; int width = ca.Width; int height = ca.Height; //var map = GIS.FrameWork.Application.App.Map; // 保存输出结果 var path = Application.StartupPath + @"\log"; if (!Directory.Exists(path)) //如果不存在就创建file文件夹 { Directory.CreateDirectory(path); //创建该文件夹 } var outputPath = path + @"\" + (dateNow.ToString("MMddyyhhmmss")) + (this.uuid++) + ".tif"; OSGeo.GDAL.Driver driverSave = OSGeo.GDAL.Gdal.GetDriverByName("GTiff"); OSGeo.GDAL.Dataset datasetSave = driverSave.Create(outputPath, width, height, 1, OSGeo.GDAL.DataType.GDT_Byte, null); datasetSave.WriteRaster(0, 0, width, height, buffer, width, height, 1, new int[1] { 1 }, 0, 0, 0); datasetSave.SetProjection(ca.projStr); datasetSave.SetGeoTransform(ca.geoTransform); datasetSave.GetRasterBand(1).SetNoDataValue(ca.noDataVal); datasetSave.FlushCache(); datasetSave.Dispose(); driverSave.Dispose(); //// 翻转图像 ? //buffer = InvertImage(buffer, width, height); MessageBox.Show("模拟结束, 输出文件:" + outputPath); //// 新建 GDAL dataset //OSGeo.GDAL.Driver driver = OSGeo.GDAL.Gdal.GetDriverByName("MEM"); //OSGeo.GDAL.Dataset dataset = driver.Create("", width, height, 1, OSGeo.GDAL.DataType.GDT_Float64, null); //dataset.WriteRaster(0, 0, width, height, buffer, width, height, 1, new int[1] { 1 }, 0, 0, 0); //// 将GDAL dataset转化为IRaster数据集 //DotSpatial.Data.IRaster raster = GIS.GDAL.RasterConverter.Gdal2DSRaster(dataset, 1); //raster.Name = "Result"; //map.Layers.Add(raster); }
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] = this.landUse.NullInfo.LandUseTypeValue; 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(); }
/// <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); }