private void ApplyAOI(IRasterDataProvider prd, IMonitoringSubProduct subprd) { if (!subprd.Definition.IsUseAoiTemplate || prd == null) { return; } string aoistring = subprd.Definition.AoiTemplates; if (string.IsNullOrEmpty(aoistring)) { return; } string[] aoiNames = aoistring.Split(','); CoordEnvelope evp = prd.CoordEnvelope; Size size = new Size(prd.Width, prd.Height); int[] retAOI = null; foreach (string aoiName in aoiNames) { int[] aoi = AOITemplateFactory.MakeAOI(aoiName, evp.MinX, evp.MaxX, evp.MinY, evp.MaxY, size); if (retAOI == null) { retAOI = aoi; } else { retAOI = AOIHelper.Merge(new int[][] { retAOI, aoi }); } } subprd.ArgumentProvider.AOI = retAOI; }
public void VisitPixelWnd(int[] bandNos, int[] wndBandNos, int minWndSize, int maxWndSize, Func <int, int, T[], T[][], bool> isNeedIncWndSize, Action <int, int, T[], T[][]> extractAction) { if (extractAction == null || wndBandNos == null || wndBandNos.Length == 0) { return; } Rectangle rect = AOIHelper.ComputeAOIRect(_argProvider.AOI, new Size(_argProvider.DataProvider.Width, _argProvider.DataProvider.Height)); int[] aoi = _argProvider.AOI; VisitPixelWnd(rect, aoi, bandNos, wndBandNos, minWndSize, maxWndSize, isNeedIncWndSize, extractAction); }
public void VisitPixel(int[] bandNos, Action <int, T[]> extractAction) { if (extractAction == null) { return; } if (bandNos == null || bandNos.Length == 0) { bandNos = GetAllBandNo(); } Rectangle rect = AOIHelper.ComputeAOIRect(_argProvider.AOI, new Size(_argProvider.DataProvider.Width, _argProvider.DataProvider.Height)); int[] aoi = _argProvider.AOI; VisitPixel(rect, aoi, bandNos, extractAction); }
public int[] GetAOI(Envelope dstEnvelope, Size size) { ShapePolygon[] geometrys = GetGeometry(null, null); if (geometrys == null || geometrys.Length == 0) { return(null); } using (IVectorAOIGenerator gen = new VectorAOIGenerator()) { int[] aoi = gen.GetAOI(geometrys, dstEnvelope, size); if (_isReverse) { return(AOIHelper.Reverse(aoi, size)); } return(aoi); } }
private void StatAreaUseAOI(byte[] adminRaster, byte[] landuseRaster, IRasterDataProvider dataProvider, double[,] result, int[] aoi, Func <T, int, int> weight) { ArgumentProvider arg = new ArgumentProvider(dataProvider, null) { AOI = aoi }; using (IRasterPixelsVisitor <T> v = new RasterPixelsVisitor <T>(arg)) { Rectangle aoiRect = AOIHelper.ComputeAOIRect(aoi, new Size(dataProvider.Width, dataProvider.Height)); v.VisitPixel(aoiRect, aoi, new int[] { 1 }, (idx, bandValues) => { result[adminRaster[idx], landuseRaster[idx]] += weight(bandValues[0], idx); } ); } }
public int[] Filter(IRasterDataProvider dataProvider, int[] aoi, Action <string> contextMessage) { if (_filters == null || _filters.Count == 0) { return(null); } Size size = new Size(dataProvider.Width, dataProvider.Height); Rectangle rect = AOIHelper.ComputeAOIRect(aoi, size); int[] rolledAOI = aoi; foreach (ICandidatePixelFilter filter in _filters) { if (filter != null && filter.IsEnabled && !filter.IsFiltered) { if (contextMessage != null) { contextMessage("正在执行\"" + (filter.Name ?? filter.ToString()) + "\"..."); } rolledAOI = filter.Filter(dataProvider, rect, rolledAOI); rect = AOIHelper.ComputeAOIRect(rolledAOI, size); } } return(rolledAOI); }
public void VisitPixel(Rectangle aoiRect, int[] aoi, int[] bandNos, Action <int, T[]> extractAction) { IRasterBand[] bands = GetRasterBands(bandNos); T[][] buffers = BuildBuffers(aoiRect, bandNos.Length); enumDataType dataType = _argProvider.DataProvider.DataType; int width = _argProvider.DataProvider.Width; T[] pixelBuffer = new T[bandNos.Length]; int oIdx = 0, idx = 0; GCHandle[] handles = GetHandles(buffers); try { if (aoi == null || aoi.Length == 0) { for (int r = aoiRect.Top; r < aoiRect.Bottom; r++, oIdx = r * width, idx = 0) { for (int bIdx = 0; bIdx < bands.Length; bIdx++) { bands[bIdx].Read(aoiRect.Left, r, aoiRect.Width, 1, handles[bIdx].AddrOfPinnedObject(), dataType, aoiRect.Width, 1); } oIdx += aoiRect.Left; for (int c = aoiRect.Left; c < aoiRect.Width; c++, oIdx++, idx++) { for (int bIdx = 0; bIdx < bands.Length; bIdx++) { pixelBuffer[bIdx] = buffers[bIdx][idx]; } extractAction(oIdx, pixelBuffer); } } } else { Dictionary <int, AOIHelper.AOIRowRange> aoirows = AOIHelper.ComputeRowIndexRange(aoi, new Size(_argProvider.DataProvider.Width, _argProvider.DataProvider.Height)); foreach (int r in aoirows.Keys) { for (int bIdx = 0; bIdx < bands.Length; bIdx++) { bands[bIdx].Read(aoiRect.Left, r, aoiRect.Width, 1, handles[bIdx].AddrOfPinnedObject(), dataType, aoiRect.Width, 1); } idx = 0; AOIHelper.AOIRowRange range = aoirows[r]; for (int aoiidx = range.BeginIndex; aoiidx < range.EndIndex; aoiidx++) { oIdx = aoi[aoiidx]; int orow = oIdx / width; int ocol = oIdx - orow * width; for (int bIdx = 0; bIdx < bands.Length; bIdx++) { pixelBuffer[bIdx] = buffers[bIdx][ocol - aoiRect.Left]; } extractAction(oIdx, pixelBuffer); } } } } finally { FreeHandles(handles); } }
public void VisitPixelWnd(Rectangle aoiRect, int[] aoi, int[] bandNos, int[] wndBandNos, int minWndSize, int maxWndSize, Func <int, int, T[], T[][], bool> isNeedIncWndSize, Action <int, int, T[], T[][]> extractAction) { _wndAccessor.Reset(wndBandNos, aoiRect); int crtWndSize = minWndSize; IRasterBand[] bands = GetRasterBands(bandNos); T[][] buffers = BuildBuffers(aoiRect, bandNos.Length); enumDataType dataType = _argProvider.DataProvider.DataType; int width = _argProvider.DataProvider.Width; T[] pixelBuffer = new T[bandNos.Length]; T[][] wndBuffers = new T[wndBandNos.Length][]; BuildWndBuffers(crtWndSize, wndBuffers); int oIdx = 0, idx = 0; GCHandle[] handles = GetHandles(buffers); try { if (aoi == null || aoi.Length == 0) { for (int r = aoiRect.Top; r < aoiRect.Bottom; r++, oIdx = r * width, idx = 0) { for (int bandIdx = 0; bandIdx < bands.Length; bandIdx++) { bands[bandIdx].Read(aoiRect.Left, r, aoiRect.Width, 1, handles[bandIdx].AddrOfPinnedObject(), dataType, aoiRect.Width, 1); } oIdx += aoiRect.Left; for (int c = aoiRect.Left; c < aoiRect.Width; c++, oIdx++, idx++) { for (int bIdx = 0; bIdx < bands.Length; bIdx++) { pixelBuffer[bIdx] = buffers[bIdx][idx]; } // if (!_wndAccessor.ReadWndPixels(oIdx, crtWndSize, wndBuffers)) { continue; } while (isNeedIncWndSize(oIdx, crtWndSize, pixelBuffer, wndBuffers) && crtWndSize < maxWndSize) { crtWndSize += 2;//1,3,5,7,9,... BuildWndBuffers(crtWndSize, wndBuffers); //目前这里有个bug,扩大窗口后,没有为wndBuffers赋值,但是直接在这里读取的话,程序速度会很慢。 } //by chennan 20121226修改火点判识与一期不一致问题 crtWndSize = minWndSize; BuildWndBuffers(crtWndSize, wndBuffers); _wndAccessor.ReadWndPixels(oIdx, crtWndSize, wndBuffers); // extractAction(oIdx, crtWndSize, pixelBuffer, wndBuffers); } } } else { Dictionary <int, AOIHelper.AOIRowRange> aoirows = AOIHelper.ComputeRowIndexRange(aoi, new Size(_argProvider.DataProvider.Width, _argProvider.DataProvider.Height)); foreach (int r in aoirows.Keys) { for (int bIdx = 0; bIdx < bands.Length; bIdx++) { bands[bIdx].Read(aoiRect.Left, r, aoiRect.Width, 1, handles[bIdx].AddrOfPinnedObject(), dataType, aoiRect.Width, 1); } idx = 0; AOIHelper.AOIRowRange range = aoirows[r]; for (int aoiidx = range.BeginIndex; aoiidx < range.EndIndex; aoiidx++) { oIdx = aoi[aoiidx]; int orow = oIdx / width; int ocol = oIdx - orow * width; for (int bIdx = 0; bIdx < bands.Length; bIdx++) { pixelBuffer[bIdx] = buffers[bIdx][ocol - aoiRect.Left]; } // if (!_wndAccessor.ReadWndPixels(oIdx, crtWndSize, wndBuffers)) { continue; } while (isNeedIncWndSize(oIdx, crtWndSize, pixelBuffer, wndBuffers) && crtWndSize < maxWndSize) { crtWndSize += 2; BuildWndBuffers(crtWndSize, wndBuffers); ////by chennan 高温火点窗口数据读取 //_wndAccessor.ReadWndPixels(oIdx, crtWndSize-2, wndBuffers); //目前这里有个bug,扩大窗口后,没有为wndBuffers赋值,但是直接在这里读取的话,程序速度会很慢。 } //by chennan 20121226修改火点判识与一期不一致问题 crtWndSize = minWndSize; BuildWndBuffers(crtWndSize, wndBuffers); _wndAccessor.ReadWndPixels(oIdx, crtWndSize, wndBuffers); // extractAction(oIdx, crtWndSize, pixelBuffer, wndBuffers); } } } } finally { FreeHandles(handles); } }