/// <summary> /// 计算总碳储量. /// </summary> /// <returns>Boolean.</returns> public Boolean CalStorage() { double sum = 0; foreach (double num in storage) { sum += num; } //TxtOP.WriteTxt(sumStorage, sum); DataTable dt = new DataTable(); dt.Columns.Add("植被碳储量"); DataRow newRow = dt.NewRow(); newRow[0] = sum; dt.Rows.Add(newRow); GFS.BLL.ExcelHelper exclHelper = new GFS.BLL.ExcelHelper(); exclHelper.DataTableToExcel(sumStorage, "Sheet", dt, true); exclHelper.Dispose(); return(true); }
/// <summary> /// 计算碳储量---分块读取 /// 效率可提高百倍以上 /// </summary> public Boolean Cal_carbonStorageBlock() { IRasterLayer rasLyr = null; IRasterDataset rasterdat = null; IPnt pBlockSize0 = null; IPnt pBlockSize1 = null; double sumDensity = 0; float[,] data = null; try { rasLyr = new RasterLayerClass(); pBlockSize0 = new PntClass(); pBlockSize1 = new PntClass(); rasLyr.CreateFromFilePath(carbonDensity); IRaster2 raster = rasLyr.Raster as IRaster2; rasterdat = raster.RasterDataset; int blockSize = 512; pBlockSize1.SetCoords(blockSize, blockSize); //影像x方向分块数 int colBlock = rasLyr.ColumnCount / blockSize; //影像y方向分块数 int rowBlock = rasLyr.RowCount / blockSize; //影像分块后x方向剩余像元数 int colMod = rasLyr.ColumnCount % blockSize; //影像分块后y方向剩余像元数 int rowMod = rasLyr.RowCount % blockSize; //分块读取像元并处理 for (int col = 0; col < colBlock; col++) { for (int row = 0; row < rowBlock; row++) { pBlockSize0.SetCoords(blockSize * col, blockSize * row); data = RasterOP.ReadFloat(rasterdat as IRasterDataset2, pBlockSize0, pBlockSize1); if (data == null) { return(false); } sumDensity += ArraySum(data); } } //读取剩余列像元并处理 if (colMod > 0) { pBlockSize0.SetCoords(blockSize * colBlock, 0); pBlockSize1.SetCoords(colMod, rasLyr.RowCount); data = RasterOP.ReadFloat(rasterdat as IRasterDataset2, pBlockSize0, pBlockSize1); if (data == null) { return(false); } sumDensity += ArraySum(data); } //读取剩余行像元并处理 if (rowMod > 0) { pBlockSize0.SetCoords(0, blockSize * rowBlock); pBlockSize1.SetCoords(colBlock, rowMod); data = RasterOP.ReadFloat(rasterdat as IRasterDataset2, pBlockSize0, pBlockSize1); if (data == null) { return(false); } sumDensity += ArraySum(data); } //计算碳储量 double Storage = sumDensity * forestArea; //写出结果到xls //TxtOP.WriteTxt(carbonStorage, Storage); DataTable dt = new DataTable(); dt.Columns.Add("碳储量-" + classID); DataRow newRow = dt.NewRow(); newRow[0] = Storage; dt.Rows.Add(newRow); GFS.BLL.ExcelHelper exclHelper = new GFS.BLL.ExcelHelper(); exclHelper.DataTableToExcel(carbonStorage, "Sheet", dt, true); exclHelper.Dispose(); data = null; if (rasterdat != null) { Marshal.ReleaseComObject(rasterdat); } return(true); } catch (Exception ex) { XtraMessageBox.Show("计算森林碳储量失败!\r\n" + ex.Message); return(false); } finally { data = null; if (rasLyr != null) { Marshal.ReleaseComObject(rasLyr); } if (rasterdat != null) { Marshal.ReleaseComObject(rasterdat); } if (pBlockSize0 != null) { Marshal.ReleaseComObject(pBlockSize0); } if (pBlockSize1 != null) { Marshal.ReleaseComObject(pBlockSize1); } } }