예제 #1
0
        private StatResultItem[] AreaStat(object aoiObj, Func <Int16, bool> filter, string[] files)
        {
            if (files == null || files.Length == 0)
            {
                return(null);
            }
            IStatAnalysisEngine <Int16> exe = new StatAnalysisEngine <Int16>();

            if (aoiObj as Dictionary <string, int[]> != null)
            {
                Dictionary <string, int[]> aoi   = aoiObj as Dictionary <string, int[]>;
                List <StatResultItem>      items = new List <StatResultItem>();
                IRasterDataProvider        prd   = null;
                try
                {
                    prd = GeoDataDriver.Open(files[0]) as IRasterDataProvider;
                    if (aoi == null || aoi.Count == 0)
                    {
                        return(null);
                    }
                    StatResultItem[] item = exe.StatAreaCustom(prd, aoi, filter);
                    if (item != null && item.Length > 0)
                    {
                        items.AddRange(item);
                    }
                    //
                    RasterOperator <Int16> oper = new RasterOperator <Int16>();
                    int            count        = oper.Count(prd, null, filter);
                    StatResultItem sri          = new StatResultItem();
                    sri.Name  = "整个湖区";
                    sri.Value = Math.Round(count * BAGStatisticHelper.CalPixelArea(prd.ResolutionX), 3);
                    items.Add(sri);
                    return(items.ToArray());
                }
                catch
                {
                    throw new ArgumentException("选择的文件:“" + Path.GetFileName(files[0]) + "”无法进行自定义面积统计。");
                }
                finally
                {
                    if (prd != null)
                    {
                        prd.Dispose();
                        prd = null;
                    }
                }
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// 计算指定等级的总覆盖面积
        /// 例如:重度(60%-100%)
        /// 比较条件为:minConvertDegree< x && x<=  maxConvertDegree
        /// </summary>
        /// <param name="minConvertDegree"></param>
        /// <param name="maxConvertDegree"></param>
        /// <returns></returns>
        public double CalcTotalConvertArea(IRasterDataProvider dataProvider, int[] aoi, float minCovertDegree, float maxCovertDegree)
        {
            double convertArea = 0;
            IRasterOperator <float> rasterOper = new RasterOperator <float>();
            int count = rasterOper.Count(dataProvider, aoi, (value) =>
            {
                if (minCovertDegree < value && value <= maxCovertDegree)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            });
            double pixelArea = BAGStatisticHelper.CalPixelArea(dataProvider.ResolutionX);

            convertArea = count * pixelArea;
            return(convertArea);
        }
예제 #3
0
        /// <summary>
        /// 计算云覆盖面积
        /// </summary>
        /// <returns></returns>
        public double CalcCloudConvertArea(IRasterDataProvider dataProvider, int[] aoi)
        {
            double cloudArea = 0;
            IRasterOperator <Int16> rasterOper = new RasterOperator <Int16>();
            int count = rasterOper.Count(dataProvider, aoi, (value) =>
            {
                if (value == 1)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            });
            double pixelArea = BAGStatisticHelper.CalPixelArea(dataProvider.ResolutionX);

            cloudArea = count * pixelArea;
            return(cloudArea);
        }
        /// <summary>
        /// 计算指定等级的总实际覆盖面积
        /// 比较条件为:minConvertDegree< x && x<=  maxConvertDegree
        /// </summary>
        /// <param name="dataProvider">像元覆盖度文件DataProvider</param>
        /// <param name="minConvertDegree"></param>
        /// <param name="maxConvertDegree"></param>
        /// <returns></returns>
        public double CalcActualConvertArea(IRasterDataProvider dataProvider, int[] aoi, float minConvertDegree, float maxConvertDegree)
        {
            if (dataProvider == null || minConvertDegree > maxConvertDegree)
            {
                return(0);
            }
            double                      convertArea = 0;
            double                      pixelArea   = BAGStatisticHelper.CalPixelArea(dataProvider.ResolutionX);
            ArgumentProvider            ap          = new ArgumentProvider(dataProvider, null);
            Size                        size        = new Size(dataProvider.Width, dataProvider.Height);
            Rectangle                   rect        = AOIHelper.ComputeAOIRect(aoi, size);
            RasterPixelsVisitor <float> visitor     = new RasterPixelsVisitor <float>(ap);

            visitor.VisitPixel(rect, aoi, new int[] { 1 },
                               (index, values) =>
            {
                if (values[0] <= maxConvertDegree && values[0] > minConvertDegree)
                {
                    convertArea += (pixelArea * values[0]);
                }
            });
            return(convertArea);
        }
        public override IExtractResult Make(Action <int, string> progressTracker)
        {
            if (_argumentProvider == null)
            {
                return(null);
            }
            if (_argumentProvider.GetArg("AlgorithmName") == null)
            {
                return(null);
            }
            string[] covertAreaRegions = _argumentProvider.GetArg("CovertAreaRegion") as string[];
            string[] files             = _argumentProvider.GetArg("SelectedPrimaryFiles") as string[];
            string   extinfo           = GetStringArgument("extinfo");

            if (covertAreaRegions == null || covertAreaRegions.Length == 0 || files == null)
            {
                return(null);
            }
            IRasterDataProvider[] statRasters = null;
            if (_argumentProvider.GetArg("AlgorithmName").ToString() == "BCAF")
            {
                int             count   = covertAreaRegions.Count();
                List <string[]> results = new List <string[]>();
                try
                {
                    statRasters = new IRasterDataProvider[files.Length];
                    for (int i = 0; i < statRasters.Length; i++)
                    {
                        statRasters[i] = GeoDataDriver.Open(files[i]) as IRasterDataProvider;
                    }
                    double pixelArea = BAGStatisticHelper.CalPixelArea(statRasters[0].ResolutionX);
                    for (int i = 0; i < count; i++)
                    {
                        float[]         minmax = BAGStatisticHelper.GetCovertAreaValue(covertAreaRegions[i]);
                        List <string[]> result = FREQAlgorithm(minmax[0], minmax[1], statRasters, pixelArea);
                        if (result != null && result.Count >= 1)
                        {
                            results.AddRange(result);
                        }
                    }
                    FileExtractResult fileResult = null;
                    if (results != null && results.Count() > 0)
                    {
                        string         title = "统计日期:" + DateTime.Now.ToShortDateString();
                        RasterIdentify id    = new RasterIdentify(files);
                        if (id.OrbitDateTime != null)
                        {
                            title += "    轨道日期:" + id.OrbitDateTime.ToShortDateString();
                        }
                        string[]    columns  = new string[] { "统计范围", "发生频数(次)" };
                        IStatResult result   = new StatResult(title, columns, results.ToArray());
                        string      filename = StatResultToFile(files, result, "BAG", "BCAF", "蓝藻按覆盖面积统计频次", extinfo, 1, false);
                        fileResult = new FileExtractResult("BCAF", filename);
                    }
                    return(fileResult);
                }
                finally
                {
                    if (statRasters != null)
                    {
                        foreach (IRasterDataProvider prd in statRasters)
                        {
                            prd.Dispose();
                        }
                    }
                }
            }
            return(null);
        }