Example #1
0
        /// <summary>
        /// 实现接口类:负责参数传递到实际处理过程
        /// </summary>
        /// <returns></returns>
        public object GetArgumentValue()
        {
            AngleParModel model = PackageModel();

            if (model != null)
            {
                return(model);
            }
            else
            {
                return(null);
            }
        }
Example #2
0
 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);
     }
 }
Example #3
0
        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);
        }
Example #4
0
        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
            { }
        }