/// <summary> /// 创建slopeMap,设置无效值 /// </summary> /// <param name="DemPath"></param> /// <param name="OutSlpPath"></param> static void CreateSlopeMap() { double dsm_NoDataValue; int dsm_HasNoDataValue; OSGeo.GDAL.Band dsmBand = dsmDataset.GetRasterBand(1); dsmBand.GetNoDataValue(out dsm_NoDataValue, out dsm_HasNoDataValue); //调用GDal创建slope影像 if (File.Exists(slopePath)) { gdalDriver.Delete(slopePath); } slopeDataSet = gdalDriver.Create(slopePath, dsm_Xsize, dsm_Ysize, 1, OSGeo.GDAL.DataType.GDT_Float32, null); slopeDataSet.SetProjection(dsmDataset.GetProjection()); slopeDataSet.SetGeoTransform(dsm_Transform); OSGeo.GDAL.Band slopeBand = slopeDataSet.GetRasterBand(1); //设置无效值 if (dsm_HasNoDataValue == 0) //dsm没有无效值 { //把DSM和SLOPE全设置成用户指定的值 dsmBand.SetNoDataValue(imgNodata); slopeBand.SetNoDataValue(imgNodata); } else //DSM有无效值时 { //把SLOPE和全局变量设置成DSM的无效值 imgNodata = dsm_NoDataValue; slopeBand.SetNoDataValue(dsm_NoDataValue); } // BufferOnePixel(slopeBand); }
/// <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); }
/// <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); }