private const int MAX_BLOCK_SIZE = 1024 * 1024 * 10;//10MB public void Compute(IRasterBand[] srcRasters, int[] aoi, RasterQuickStatResult[] results, Action <int, string> progressTracker) { int width = srcRasters[0].Width; int height = srcRasters[0].Height; Rectangle aoiRect = AOIHelper.ComputeAOIRect(aoi, new Size(width, height)); SortedList <int, AOIHelper.ColRangeOfRow> aoiRowRanges = AOIHelper.ComputeColRanges(aoi, new Size(width, height)); T[] buffer = GetRowBuffer(aoiRowRanges); GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); IntPtr bufferPtr = handle.AddrOfPinnedObject(); try { int cols = 0; for (int i = 0; i < srcRasters.Length; i++) { foreach (int r in aoiRowRanges.Keys) { AOIHelper.ColRangeOfRow range = aoiRowRanges[r]; cols = range.EndCol - range.BeginCol + 1; srcRasters[i].Read(range.BeginCol, range.Row, cols, 1, bufferPtr, srcRasters[i].DataType, cols, 1); HandleHistogram(buffer, results[i], cols); } } HandleMeanValues(srcRasters.Length, results, aoi.Length); } finally { handle.Free(); } }
private void VisitByAOI(int[] aoi, Action <float, float> action, Action <int, string> progressTracker) { IRasterBand[] srcRasters = new IRasterBand[] { _xBand, _yBand }; int width = _xBand.Width; int height = _xBand.Height; int bandCount = 2; Rectangle aoiRect = AOIHelper.ComputeAOIRect(aoi, new Size(width, height)); //Dictionary<int, AOIHelper.AOIRowRange> aoiRowRanges = AOIHelper.ComputeRowIndexRange(aoi, new Size(width, height)); SortedList <int, AOIHelper.ColRangeOfRow> aoiRowRanges = AOIHelper.ComputeColRanges(aoi, new Size(width, height)); int rowCount = aoiRect.Height; int bRow = aoiRect.Top; int eRow = aoiRect.Bottom; int bCol = 0, eCol = 0; T[][] srcBuffers = new T[bandCount][]; GCHandle[] srcHandles = new GCHandle[bandCount]; for (int i = 0; i < bandCount; i++) { srcBuffers[i] = new T[width]; srcHandles[i] = GCHandle.Alloc(srcBuffers[i], GCHandleType.Pinned); } // try { AOIHelper.ColRangeOfRow range = null; for (int r = bRow; r < eRow; r++) { //读取一行数据 for (int b = 0; b < bandCount; b++) { srcRasters[b].Read(0, r, width, 1, srcHandles[b].AddrOfPinnedObject(), _xBand.DataType, width, 1); } //获取该行AOI的起始列 if (aoiRowRanges.ContainsKey(r)) { range = aoiRowRanges[r]; } else { continue; } //调用计算委托 bCol = range.BeginCol; eCol = range.EndCol; for (int c = bCol; c < eCol; c++) { action(ToFloat(srcBuffers[0][c]), ToFloat(srcBuffers[1][c])); } // if (progressTracker != null) { progressTracker(100 * (r - bRow + 1) / rowCount, string.Empty); } } } finally { for (int i = 0; i < bandCount; i++) { srcHandles[i].Free(); } } }
private void ComputeByAOI(IRasterBand[] srcRasters, int[] aoi, out double[] minValues, out double[] maxValues, out double[] meanValues, Action <int, string> progressTracker) { enumDataType dataType = srcRasters[0].DataType; int width = srcRasters[0].Width; int height = srcRasters[0].Height; // int bandCount = srcRasters.Length; minValues = new double[bandCount]; maxValues = new double[bandCount]; meanValues = new double[bandCount]; for (int i = 0; i < bandCount; i++) { minValues[i] = double.MaxValue; maxValues[i] = double.MinValue; } // Rectangle aoiRect = AOIHelper.ComputeAOIRect(aoi, new Size(width, height)); SortedList <int, AOIHelper.ColRangeOfRow> aoiRowRanges = AOIHelper.ComputeColRanges(aoi, new Size(width, height)); int rowCount = aoiRect.Height; int bRow = aoiRect.Top; int eRow = aoiRect.Bottom; int bCol = 0, eCol = 0; T[][] srcBuffers = new T[bandCount][]; GCHandle[] srcHandles = new GCHandle[bandCount]; for (int i = 0; i < bandCount; i++) { srcBuffers[i] = new T[width]; srcHandles[i] = GCHandle.Alloc(srcBuffers[i], GCHandleType.Pinned); } // try { int aoiPixelCount = 0; AOIHelper.ColRangeOfRow range = null; for (int r = bRow; r < eRow; r++) { try { //读取一行数据 for (int b = 0; b < bandCount; b++) { srcRasters[b].Read(0, r, width, 1, srcHandles[b].AddrOfPinnedObject(), dataType, width, 1); } //获取该行AOI的起始列 if (aoiRowRanges.ContainsKey(r)) { range = aoiRowRanges[r]; //调用计算委托 bCol = range.BeginCol; eCol = range.EndCol + 1; HandleBlock(bandCount, srcBuffers, bCol, eCol, minValues, maxValues, meanValues); aoiPixelCount += (eCol - bCol); if (progressTracker != null) { progressTracker(100 * (r - bRow + 1) / rowCount, string.Empty); } } } catch (System.Exception ex) { throw ex; } } HandleMeanValues(bandCount, meanValues, aoiPixelCount); } finally { for (int i = 0; i < bandCount; i++) { srcHandles[i].Free(); } } }