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); }
/// <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); }