/// <summary> /// 实现接口类:负责参数传递到实际处理过程 /// </summary> /// <returns></returns> public object GetArgumentValue() { AngleParModel model = PackageModel(); if (model != null) { return(model); } else { return(null); } }
public AngleParModel PackageModel() { try { AngleParModel model = new AngleParModel(); model.ApplyN = ckNCalc.Checked; model.FileLandConvery = txtLandConvery.Text.Trim(); model.FileAsunZ = this.txtasunz.Text.Trim(); model.FileAsatZ = this.txtasuna.Text.Trim(); model.FileAsunA = this.txtasatz.Text.Trim(); model.FileAsatA = this.txtasata.Text.Trim(); return(model); } catch (Exception ex) { return(null); } }
private IExtractResult ComputeByCurrentRaster(IRasterDataProvider currPrd, Action <int, string> progressTracker) { float curNDVI = 0f; currPrd = currPrd != null ? currPrd : _argumentProvider.DataProvider; if (currPrd == null) { return(null); } IBandNameRaster bandNameRaster = _argumentProvider.DataProvider as IBandNameRaster;// int VisibleCH = TryGetBandNo(bandNameRaster, "RedBand"); int NearInfraredCH = TryGetBandNo(bandNameRaster, "NirBand"); int FarInfrared11CH = TryGetBandNo(bandNameRaster, "FarBand"); double VisibleZoom = (double)_argumentProvider.GetArg("RedBand_Zoom"); double NearInfraredZoom = (double)_argumentProvider.GetArg("NirBand_Zoom"); double FarInfrared11Zoom = (double)_argumentProvider.GetArg("FarBand_Zoom"); bool isAutoCloud = (bool)_argumentProvider.GetArg("isAutoCloud"); bool isAppCloud = (bool)_argumentProvider.GetArg("isAppCloud"); if (VisibleCH == -1 || NearInfraredCH == -1 || (isAutoCloud && FarInfrared11CH == -1)) { PrintInfo("获取波段序号失败,可能是波段映射表配置错误或判识算法波段参数配置错误。"); return(null); } string normalizationFile = string.Empty; AngleParModel angleArg = _argumentProvider.GetArg("Angle") as AngleParModel; if (angleArg != null && angleArg.ApplyN) { if (string.IsNullOrEmpty(angleArg.FileAsatA) || !File.Exists(angleArg.FileAsatA) || string.IsNullOrEmpty(angleArg.FileAsatZ) || !File.Exists(angleArg.FileAsatZ) || string.IsNullOrEmpty(angleArg.FileAsunA) || !File.Exists(angleArg.FileAsunA) || string.IsNullOrEmpty(angleArg.FileAsunZ) || !File.Exists(angleArg.FileAsunZ) || string.IsNullOrEmpty(angleArg.FileLandConvery) || !File.Exists(angleArg.FileLandConvery)) { PrintInfo("归一化处理所需的角度信息、土地覆盖信息填写不正确或不存在,请检查..."); return(null); } normalizationFile = NormalizationProcess(currPrd, progressTracker); if (string.IsNullOrEmpty(normalizationFile) || !File.Exists(normalizationFile)) { PrintInfo("归一化处理失败"); return(null); } } bool normalizationSuccess = angleArg != null && angleArg.ApplyN && !string.IsNullOrEmpty(normalizationFile) && File.Exists(normalizationFile) ? true : false; float NearInfraredCLMMin = float.Parse(_argumentProvider.GetArg("NearInfraredCLMMin").ToString()); float FarInfrared11CLMMax = float.Parse(_argumentProvider.GetArg("FarInfrared11CLMMax").ToString()); float FarInfrared11WaterMin = float.Parse(_argumentProvider.GetArg("FarInfrared11WaterMin").ToString()); float NDVIWaterMax = float.Parse(_argumentProvider.GetArg("NDVIWaterMax").ToString()); Int16 defCloudy = (Int16)_argumentProvider.GetArg("defCloudy"); Int16 defWater = (Int16)_argumentProvider.GetArg("defWater"); Int16 InvaildValue = (Int16)_argumentProvider.GetArg("InvaildValue"); int cloudCH = (int)_argumentProvider.GetArg("CLMBand"); string clmFile = GetClmFile(currPrd); bool isSetMinMax = (bool)_argumentProvider.GetArg("isSetMinMax"); float ndviMax = (float)_argumentProvider.GetArg("NDVIMax"); float ndviMin = (float)_argumentProvider.GetArg("NDVIMin"); float ndviCalcMax = float.MinValue; float ndviCalcMin = float.MaxValue; float PNVIZoom = (float)_argumentProvider.GetArg("PNVIZoom"); //输入文件准备 List <RasterMaper> rms = new List <RasterMaper>(); IRasterDataProvider currRaster = null; IRasterDataProvider clmPrd = null; IRasterDataProvider ndviPrd = null; IFileExtractResult pviFile = null; IExtractResultArray array = new ExtractResultArray("DRT"); if (progressTracker != null) { progressTracker.Invoke(normalizationSuccess ? 77 : 0, "计算改进型垂直干旱指数"); } try { currRaster = normalizationSuccess ? GeoDataDriver.Open(normalizationFile) as IRasterDataProvider : currPrd; if (!normalizationSuccess && (currRaster.BandCount < VisibleCH || currRaster.BandCount < NearInfraredCH || (isAutoCloud && currRaster.BandCount < FarInfrared11CH))) { PrintInfo("请选择正确的数据进行垂直干旱指数计算。"); return(null); } RasterMaper rmCurr = normalizationSuccess ? new RasterMaper(currRaster, new int[] { 1, 2, 3 }) : new RasterMaper(currRaster, new int[] { VisibleCH, NearInfraredCH, FarInfrared11CH }); rms.Add(rmCurr); bool isContainClm = false; if (isAppCloud && !string.IsNullOrEmpty(clmFile) && File.Exists(clmFile)) { clmPrd = GeoDataDriver.Open(clmFile) as IRasterDataProvider; if (clmPrd.BandCount < cloudCH) { PrintInfo("请选择正确的云数据通道进行计算。"); return(null); } RasterMaper clmRm = new RasterMaper(clmPrd, new int[] { cloudCH }); rms.Add(clmRm); isContainClm = true; } bool isContainNDVI = false; string ndviFile = string.Empty; string[] ndviFiles = GetStringArray("SelectedPrimaryFiles"); if (ndviFiles == null || ndviFiles.Length == 0 || string.IsNullOrEmpty(ndviFiles[0]) || !File.Exists(ndviFiles[0])) { isContainNDVI = false; } else { isContainNDVI = true; ndviFile = ndviFiles[0]; } int ndviCH = (int)_argumentProvider.GetArg("NDVIBand"); double ndviZoom = (double)_argumentProvider.GetArg("NDVIBand_Zoom"); if (isContainNDVI && !string.IsNullOrEmpty(ndviFile)) { ndviPrd = GeoDataDriver.Open(ndviFile) as IRasterDataProvider; if (ndviPrd.BandCount < ndviCH) { PrintInfo("请选择正确的植被指数数据通道进行计算。"); return(null); } RasterMaper ndviRm = new RasterMaper(ndviPrd, new int[] { ndviCH }); rms.Add(ndviRm); isContainNDVI = true; } //输出文件准备(作为输入栅格并集处理) string outFileName = GetFileName(new string[] { currRaster.fileName }, _subProductDef.ProductDef.Identify, "PNVI", ".dat", null); using (IRasterDataProvider outRaster = CreateOutRaster(outFileName, rms.ToArray())) { //栅格数据映射 RasterMaper[] fileIns = rms.ToArray(); RasterMaper[] fileOuts = new RasterMaper[] { new RasterMaper(outRaster, new int[] { 1 }) }; //创建处理模型 RasterProcessModel <Int16, Int16> rfr = null; rfr = new RasterProcessModel <Int16, Int16>(progressTracker); rfr.SetRaster(fileIns, fileOuts); rfr.RegisterCalcModel(new RasterCalcHandler <Int16, Int16>((rvInVistor, rvOutVistor, aoi) => { int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX; for (int index = 0; index < dataLength; index++) { Int16 visiableValue = rvInVistor[0].RasterBandsData[0][index]; Int16 nearInfraredValue = rvInVistor[0].RasterBandsData[1][index]; Int16 farInfraredVale = rvInVistor[0].RasterBandsData[2][index]; curNDVI = isContainNDVI ? (float)(rvInVistor[2 - (isContainClm ? 0 : 1)].RasterBandsData[0][index] / ndviZoom) : GetNDVI(nearInfraredValue, visiableValue); if (visiableValue == 0 && nearInfraredValue == 0) { rvOutVistor[0].RasterBandsData[0][index] = InvaildValue; } else if (isContainClm && rvInVistor[1].RasterBandsData[0][index] != 0) { rvOutVistor[0].RasterBandsData[0][index] = defCloudy; } else if (isAutoCloud && (nearInfraredValue / NearInfraredZoom > NearInfraredCLMMin && farInfraredVale / FarInfrared11Zoom < FarInfrared11CLMMax)) { rvOutVistor[0].RasterBandsData[0][index] = defCloudy; } else { if (farInfraredVale / FarInfrared11Zoom > FarInfrared11WaterMin && curNDVI < NDVIWaterMax) { rvOutVistor[0].RasterBandsData[0][index] = defWater; } else { rvOutVistor[0].RasterBandsData[0][index] = (Int16)(curNDVI * PNVIZoom); if (curNDVI > ndviCalcMax) { ndviCalcMax = curNDVI; } else if (curNDVI < ndviCalcMin) { ndviCalcMin = curNDVI; } } } } })); //执行 rfr.Excute(); pviFile = new FileExtractResult(_subProductDef.Identify, outFileName, true); pviFile.SetDispaly(false); if (normalizationSuccess) { FileExtractResult nrsb = new FileExtractResult(_subProductDef.Identify, normalizationFile, true); nrsb.SetDispaly(false); array.Add(nrsb); } _argumentProvider.SetArg("CursorInfo:Image-NDVIMax", ndviCalcMax); _argumentProvider.SetArg("CursorInfo:Image-NDVIMin", ndviCalcMin); array.Add(pviFile); } } finally { if (clmPrd != null) { clmPrd.Dispose(); } if (ndviPrd != null) { ndviPrd.Dispose(); } } FileExtractResult mpdiFile = null; if (File.Exists(pviFile.FileName)) { mpdiFile = CalcMPDI(pviFile.FileName, ndviCalcMin, ndviCalcMax, currRaster, normalizationSuccess, progressTracker); if (mpdiFile != null) { array.Add(mpdiFile); } } return(array); }
private string NormalizationProcess(IRasterDataProvider currPrd, Action <int, string> progressTracker) { IBandNameRaster bandNameRaster = _argumentProvider.DataProvider as IBandNameRaster;// int VisibleCH = TryGetBandNo(bandNameRaster, "RedBand"); int NearInfraredCH = TryGetBandNo(bandNameRaster, "NirBand"); int FarInfrared11CH = TryGetBandNo(bandNameRaster, "FarBand"); double VisibleZoom = (double)_argumentProvider.GetArg("RedBand_Zoom"); double NearInfraredZoom = (double)_argumentProvider.GetArg("NirBand_Zoom"); double FarInfrared11Zoom = (double)_argumentProvider.GetArg("FarBand_Zoom"); int SunZCH = TryGetBandNo(bandNameRaster, "SunZBand"); int SatZCH = TryGetBandNo(bandNameRaster, "SatZBand"); int SunACH = TryGetBandNo(bandNameRaster, "SunABand"); int SatACH = TryGetBandNo(bandNameRaster, "SatABand"); int LandConveryCH = TryGetBandNo(bandNameRaster, "LandCoveryBand"); double SunZZoom = (double)_argumentProvider.GetArg("SunZBand_Zoom"); double SatZZoom = (double)_argumentProvider.GetArg("SatZBand_Zoom"); double SunAZoom = (double)_argumentProvider.GetArg("SunABand_Zoom"); double SatAZoom = (double)_argumentProvider.GetArg("SatABand_Zoom"); double LandCoveryZoom = (double)_argumentProvider.GetArg("LandCoveryBand_Zoom"); AngleParModel angleArg = _argumentProvider.GetArg("Angle") as AngleParModel; _zooms = new float[] { (float)VisibleZoom, (float)NearInfraredZoom, (float)FarInfrared11Zoom, (float)SunZZoom, (float)SunAZoom, (float)SatZZoom, (float)SatAZoom, (float)LandCoveryZoom }; if (_progressTracker != null) { _progressTracker(5, "开始读取数据文件..."); } IRasterDataProvider angleRaster = null; IRasterDataProvider landcoverRaster = null; int outwidth, outheight; try { #region 波段数据读取 if (_progressTracker != null) { _progressTracker(7, "正在读取当前影像文件..."); } float prjReslX = currPrd.ResolutionX; float prjReslY = currPrd.ResolutionY; double prjMinLon = currPrd.CoordEnvelope.MinX; double prjMaxLat = currPrd.CoordEnvelope.MaxY; outwidth = currPrd.Width; outheight = currPrd.Height; UInt16[] reddata = GetDataValue <UInt16>(currPrd.GetRasterBand(VisibleCH), 0, 0, outwidth, outheight); UInt16[] IRdata = GetDataValue <UInt16>(currPrd.GetRasterBand(NearInfraredCH), 0, 0, outwidth, outheight); UInt16[] Firdata = GetDataValue <UInt16>(currPrd.GetRasterBand(FarInfrared11CH), 0, 0, outwidth, outheight); if (_progressTracker != null) { _progressTracker(9, "正在读取角度数据文件..."); } Int16[] sza, saa, vza, vaa; angleRaster = GeoDataDriver.Open(angleArg.FileAsunZ) as IRasterDataProvider; if (angleRaster == null || angleRaster.BandCount < 1) { return(null); } sza = GetDataValue <Int16>(angleRaster.GetRasterBand(1), 0, 0, outwidth, outheight); angleRaster = GeoDataDriver.Open(angleArg.FileAsunA) as IRasterDataProvider; if (angleRaster == null || angleRaster.BandCount < 1) { return(null); } saa = GetDataValue <Int16>(angleRaster.GetRasterBand(1), 0, 0, outwidth, outheight); angleRaster = GeoDataDriver.Open(angleArg.FileAsatZ) as IRasterDataProvider; if (angleRaster == null || angleRaster.BandCount < 1) { return(null); } vza = GetDataValue <Int16>(angleRaster.GetRasterBand(1), 0, 0, outwidth, outheight); angleRaster = GeoDataDriver.Open(angleArg.FileAsatA) as IRasterDataProvider; if (angleRaster == null || angleRaster.BandCount < 1) { return(null); } vaa = GetDataValue <Int16>(angleRaster.GetRasterBand(1), 0, 0, outwidth, outheight); if (_progressTracker != null) { _progressTracker(11, "正在读取LandCover数据文件..."); } landcoverRaster = GeoDataDriver.Open(angleArg.FileLandConvery) as IRasterDataProvider; if (landcoverRaster == null || landcoverRaster.BandCount < 1) { return(null); } #endregion output = new ushort[3][]; output[0] = new ushort[reddata.Length]; output[1] = new ushort[reddata.Length]; output[2] = new ushort[reddata.Length]; #region 分块并行处理 int parts = 7; int step = reddata.Length / parts; int[] istart = new int[parts]; int[] iend = new int[parts]; istart[0] = 0; iend[0] = 0 + step; for (int p = 1; p < parts; p++) { istart[p] = istart[p - 1] + step; iend[p] = iend[p - 1] + step; } iend[parts - 1] = reddata.Length; var tasks = new Action[] { () => CalNormalizationParts(istart[0], iend[0], outwidth, reddata, IRdata, Firdata, landcoverRaster, sza, saa, vza, vza, prjReslX, prjMinLon, prjMaxLat), () => CalNormalizationParts(istart[1], iend[1], outwidth, reddata, IRdata, Firdata, landcoverRaster, sza, saa, vza, vza, prjReslX, prjMinLon, prjMaxLat), () => CalNormalizationParts(istart[2], iend[2], outwidth, reddata, IRdata, Firdata, landcoverRaster, sza, saa, vza, vza, prjReslX, prjMinLon, prjMaxLat), () => CalNormalizationParts(istart[3], iend[3], outwidth, reddata, IRdata, Firdata, landcoverRaster, sza, saa, vza, vza, prjReslX, prjMinLon, prjMaxLat), () => CalNormalizationParts(istart[4], iend[4], outwidth, reddata, IRdata, Firdata, landcoverRaster, sza, saa, vza, vza, prjReslX, prjMinLon, prjMaxLat), () => CalNormalizationParts(istart[5], iend[5], outwidth, reddata, IRdata, Firdata, landcoverRaster, sza, saa, vza, vza, prjReslX, prjMinLon, prjMaxLat), () => CalNormalizationParts(istart[6], iend[6], outwidth, reddata, IRdata, Firdata, landcoverRaster, sza, saa, vza, vza, prjReslX, prjMinLon, prjMaxLat), }; if (_progressTracker != null) { _progressTracker(13, "正在逐点归一化反射率,请稍候..."); } System.Threading.Tasks.Parallel.Invoke(tasks); #endregion #region 建立输出文件 if (_progressTracker != null) { _progressTracker(75, "正在输出归一化反射率结果,请稍候..."); } return(OutputNormalization(currPrd)); #endregion } finally { } }