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);
        }
Exemple #2
0
        //计算亚像元面积
        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);
        }