private double StatArea(int[] aoi) { IRasterDrawing drawing = _activeViewer.Canvas.PrimaryDrawObject as IRasterDrawing; if (drawing == null) { return(0); } IRasterDataProvider prd = drawing.DataProvider; if (prd == null) { return(0); } double retArea = 0; if (prd.CoordType == enumCoordType.GeoCoord) { Size size = new Size(prd.Width, prd.Height); int row = 0; double resX = prd.ResolutionX; double maxLat = prd.CoordEnvelope.MaxY; for (int i = 0; i < aoi.Length; i++) { row = aoi[i] / size.Width; retArea += RasterOperator <int> .ComputePixelArea(row, maxLat, resX); } } else if (prd.CoordType == enumCoordType.PrjCoord) { double pixelArea = prd.ResolutionX * prd.ResolutionY / 1000000;//平方公里 for (int i = 0; i < aoi.Length; i++) { retArea += pixelArea; } } else//raster pixelcount { retArea = aoi.Length; } return(retArea); }
//计算亚像元面积 private double ComputeSecondPixelArea(int pixelIdx, ushort[] bandValues, out float pixelArea) { int row = pixelIdx / _width; pixelArea = (float)RasterOperator <UInt16> .ComputePixelArea(row, _maxLat, _res); PixelFeature fet = _features[pixelIdx]; float pvMidIfr = bandValues[_midIfrBandIdx] / _bandZoom; float pvFarIfr = bandValues[_farIfrBandIdx] / _bandZoom; double factor = 0; if (pvMidIfr < _maxMidIfrValue) { factor = 1.438833f * _midIfrCenterWaveNum / pvMidIfr * 10f; double n3Mix = (1.1910659 * Math.Pow(10, -5) * Math.Pow(_midIfrCenterWaveNum, 3)) / (Math.Pow(Math.E, factor) - 1f); factor = 1.438833f * _midIfrCenterWaveNum / _firComputeFactor; double n3bf = (1.1910659 * Math.Pow(10, -5) * Math.Pow(_midIfrCenterWaveNum, 3)) / (Math.Pow(Math.E, factor) - 1f); factor = 1.438833f * _midIfrCenterWaveNum / fet.MidIfrAvgValue * 10; double n3bt = (1.1910659 * Math.Pow(10, -5) * Math.Pow(_midIfrCenterWaveNum, 3)) / (Math.Pow(Math.E, factor) - 1f); return(pixelArea * (n3Mix - n3bt) / (n3bf - n3bt) * 100f); } else { if (pvFarIfr < fet.FarIfrAvgValue) { factor = 1.438833f * _farIfrCenterWaveNum / (fet.FarIfrAvgValue + 3) * 10f; } else { factor = 1.438833f * _farIfrCenterWaveNum / pvFarIfr * 10f; } double n4Mix = (1.1910659 * Math.Pow(10, -5) * Math.Pow(_farIfrCenterWaveNum, 3)) / (Math.Pow(Math.E, factor) - 1f); factor = 1.438833f * _farIfrCenterWaveNum / _firComputeFactor; double n4bf = (1.1910659 * Math.Pow(10, -5) * Math.Pow(_farIfrCenterWaveNum, 3)) / (Math.Pow(Math.E, factor) - 1f); factor = 1.438833f * _farIfrCenterWaveNum / fet.FarIfrAvgValue * 10f; double n4bt = (1.1910659 * Math.Pow(10, -5) * Math.Pow(_farIfrCenterWaveNum, 3)) / (Math.Pow(Math.E, factor) - 1f); if (n4Mix - n4bt < 0) { n4Mix = n4bt + 2f; } return(pixelArea * (n4Mix - n4bt) / (n4bf - n4bt) * 100f); } }
private string GetSNWDegree(string[] files) { double pixelArea = 0; IInterestedRaster <Int16> timeResult = null; IRasterOperator <Int16> roper = new RasterOperator <Int16>(); DataIdentify di = GetDataIdentify(); string outFileIdentify = GetStringArgument("OutFileIdentify"); string extinfo = GetStringArgument("extinfo"); timeResult = roper.Times(files, CreatRasterIndetifyId(files, "SNW", outFileIdentify, di, null, extinfo), (dstValue, srcValue) => { if (srcValue == 0) { return(dstValue); } else { return(++dstValue); } }); IRasterDataProvider dataProvider = timeResult.HostDataProvider; if (dataProvider != null) { ArgumentProvider ap = new ArgumentProvider(dataProvider, null); RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap); IPixelFeatureMapper <double> memresult = new MemPixelFeatureMapper <double>("0SDC", 1000, new Size(dataProvider.Width, dataProvider.Height), dataProvider.CoordEnvelope, dataProvider.SpatialRef); IInterestedRaster <double> iir = null; try { visitor.VisitPixel(new int[] { 1 }, (index, values) => { if (values[0] == 0) { memresult.Put(index, 0); } else { pixelArea = RasterOperator <Int16> .ComputePixelArea(index / dataProvider.Width, dataProvider.CoordEnvelope.MaxY, dataProvider.ResolutionY); memresult.Put(index, pixelArea * values[0]); } }); RasterIdentify id = new RasterIdentify(); id.ThemeIdentify = "CMA"; id.ProductIdentify = "SNW"; id.SubProductIdentify = "0SDC"; id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <double>(id, new Size(dataProvider.Width, dataProvider.Height), dataProvider.CoordEnvelope.Clone()); iir.Put(memresult); return(iir.FileName); } finally { if (iir != null) { iir.Dispose(); } if (visitor != null) { visitor.Dispose(); } if (timeResult != null) { timeResult.Dispose(); } if (File.Exists(timeResult.FileName)) { File.Delete(timeResult.FileName); } } } return(null); }