Example #1
0
        public string[] FilesEOFStatAOI(string[] files, int bandNum, string bandname, string[] fillvalue, string outDir, Action <int, string> progressCallback, double leftRatio = 1)
        {
            string      regionName = "all";
            PrjEnvelope envelope = null;
            PrjEnvelope dstleftPrj = null;
            int         outaoiwidth, outaoiheight;

            int[] outaoiIndex;
            if (StatRegionSet.UseVectorAOIRegion)
            {
                if (leftRatio < 1)
                {
                    leftRatio = 1;
                }
                envelope      = StatRegionSet.AOIPrjEnvelope;
                _aoiContainer = StatRegionSet.AoiContainer;
                regionName    = StatRegionSet.AOIName;
                if (leftRatio >= 1)  //将原始文件降采样,然后再计算aoi,再取点;输出分辨率采用原始文件分辨率;
                {
                    int[] dataPosL;
                    float rawReslxL = 1, rawReslyL = 1;//,outReslx,outResly;
                    if (!CheckRegionIntersect(files[0], envelope, out dstleftPrj, out rawReslxL, out rawReslyL, out dataPosL))
                    {
                        throw new ArgumentException("重采样AOI区域为空!");
                    }
                    CoordEnvelope subFileEnv = new CoordEnvelope(dstleftPrj.MinX, dstleftPrj.MaxX, dstleftPrj.MinY, dstleftPrj.MaxY);
                    StatRegionSet.SubRegionEnv = subFileEnv;
                    Size subAOISize = new Size(dataPosL[2], dataPosL[3]);
                    outaoiwidth  = (int)(subAOISize.Width / leftRatio);
                    outaoiheight = (int)(subAOISize.Height / leftRatio);
                    //outReslx = rawReslxL * (float)leftRatio;
                    //outResly = rawReslyL * (float)leftRatio;
                    Size outAOISize = new Size(outaoiwidth, outaoiheight);
                    outaoiIndex = GetAOI(subFileEnv, _aoiContainer, outAOISize);
                    if (outaoiIndex == null || outaoiIndex.Length <= 0)
                    {
                        throw new ArgumentException("重采样AOI区域为空!");
                    }
                    StatRegionSet.SubRegionOutSize  = outAOISize;
                    StatRegionSet.SubRegionOutIndex = outaoiIndex;
                    double[,] marix = GetTimeSeriesResampledDataFromSubRegionOutIndex(files, bandNum, fillvalue, outaoiIndex, dataPosL, outAOISize);
                    //string[] result = SaveSVDAnaResult(marix, outDir,  subFileEnv,outAOISize, outaoiIndex, 1, false);
                    if (progressCallback != null)
                    {
                        progressCallback(15, "完成数据采样及标准化,开始EOF分解计算...");
                    }
                    CloudParaStat stat = new CloudParaStat();
                    return(stat.AlglibEOF(marix, outDir, bandname, progressCallback, false, null));
                }
                else    //采样率==1,不需要抽样,直接使用AOIindex获取数据进行分析
                {
                    return(null);
                }
            }
            return(null);
        }
Example #2
0
        public string[] FilesSVDStatAOI(string[] filesL, int bandNumL, string[] fillvalueL, string[] filesR, int bandNumR, string[] fillvalueR, double leftRatio, double rightRatio, string outDir, Action <int, string> progressCallback, bool LisMicaps = false, bool RisMicaps = false)
        {
            if (!Directory.Exists(outDir))
            {
                Directory.CreateDirectory(outDir);
            }
            if (StatRegionSet.UseVectorAOIRegion)//使用自定义区域
            {
                PrjEnvelope RegionEnv = null;
                string      regionName = "all";
                int         outaoiwidthL, outaoiheightL, outaoiwidthR, outaoiheightR;
                int[]       outaoiIndexL, outaoiIndexR;
                if (StatRegionSet.UseVectorAOIRegion)
                {
                    RegionEnv     = StatRegionSet.AOIPrjEnvelope;
                    _aoiContainer = StatRegionSet.AoiContainer;
                    regionName    = StatRegionSet.AOIName;
                }
                PrjEnvelope dstleftPrj, dstrightPrj, dstPrjEnv;
                float       reslxL, reslyL, reslxR, reslyR;
                int[]       dataPosL, dataPosR;
                if (!CheckRegionIntersect(filesL[0], RegionEnv, out dstleftPrj, out reslxL, out reslyL, out dataPosL))
                {
                    throw new ArgumentException("设置的区域没有可分析的左场数据!");
                }
                if (!CheckRegionIntersect(filesR[0], RegionEnv, out dstrightPrj, out reslxR, out reslyR, out dataPosR))
                {
                    throw new ArgumentException("设置的区域没有可分析的右场数据!");
                }
                dstPrjEnv = PrjEnvelope.Intersect(dstleftPrj, dstrightPrj);
                if (dstPrjEnv == null || dstPrjEnv.Height == 0 || dstPrjEnv.Width == 0)
                {
                    throw new ArgumentException("左右场的AOI区域无交集,无法进行统计分析!");
                }
                if (progressCallback != null)
                {
                    progressCallback(0, "开始读取左场数据...");
                }
                CoordEnvelope subFileEnv = new CoordEnvelope(dstleftPrj.MinX, dstleftPrj.MaxX, dstleftPrj.MinY, dstleftPrj.MaxY);
                StatRegionSet.SubRegionEnvLeft = subFileEnv;
                if (leftRatio < 1)
                {
                    leftRatio = 1;
                }
                Size subAOISize = new Size(dataPosL[2], dataPosL[3]);         //AOI外包矩形在file中的大小
                outaoiwidthL  = (int)(subAOISize.Width / leftRatio);          //AOI外包矩形的输出列数
                outaoiheightL = (int)(subAOISize.Height / leftRatio);         //AOI外包矩形的输出行数
                Size outAOISize = new Size(outaoiwidthL, outaoiheightL);      //输出文件的大小
                outaoiIndexL = GetAOI(subFileEnv, _aoiContainer, outAOISize); //AOI在输出文件中的Index
                if (outaoiIndexL == null || outaoiIndexL.Length <= 0)
                {
                    throw new ArgumentException("左场重采样AOI区域为空!");
                }
                StatRegionSet.SubRegionOutSizeLeft  = outAOISize;
                StatRegionSet.SubRegionOutIndexLeft = outaoiIndexL;
                double[,] marixL = GetTimeSeriesResampledDataFromSubRegionOutIndex(filesL, bandNumL, fillvalueL, outaoiIndexL, dataPosL, outAOISize);
                Size leftSize = new Size(marixL.GetLength(1), marixL.GetLength(0));  //左场数据大小
                if (progressCallback != null)
                {
                    progressCallback(5, "开始读取右场数据...");
                }
                subFileEnv = new CoordEnvelope(dstrightPrj.MinX, dstrightPrj.MaxX, dstrightPrj.MinY, dstrightPrj.MaxY);
                StatRegionSet.SubRegionEnvRight = subFileEnv;
                if (rightRatio < 1)
                {
                    rightRatio = 1;
                }
                subAOISize    = new Size(dataPosR[2], dataPosR[3]);            //AOI外包矩形在file中的大小
                outaoiwidthR  = (int)(subAOISize.Width / rightRatio);          //AOI外包矩形的输出列数
                outaoiheightR = (int)(subAOISize.Height / rightRatio);         //AOI外包矩形的输出行数
                outAOISize    = new Size(outaoiwidthR, outaoiheightR);         //输出文件的大小
                outaoiIndexR  = GetAOI(subFileEnv, _aoiContainer, outAOISize); //AOI在输出文件中的Index
                if (outaoiIndexR == null || outaoiIndexR.Length <= 0)
                {
                    throw new ArgumentException("右场重采样AOI区域为空!");
                }
                StatRegionSet.SubRegionOutSizeRight  = outAOISize;
                StatRegionSet.SubRegionOutIndexRight = outaoiIndexR;
                double[,] marixr = GetTimeSeriesResampledDataFromSubRegionOutIndex(filesL, bandNumL, fillvalueL, outaoiIndexL, dataPosL, outAOISize);
                Size rightSize = new Size(marixr.GetLength(1), marixr.GetLength(0)); //右场数据大小

                if (progressCallback != null)
                {
                    progressCallback(15, "完成数据采样及标准化,开始矩阵计算...");
                }
                CloudParaStat stat = new CloudParaStat();
                return(stat.AlglibSVDWithAOI(marixL, marixr, outDir, filesL[0], leftSize, rightSize, progressCallback));
            }
            return(null);
        }
Example #3
0
 public double FilesCorrelateStatAOI(string[] filesL, int bandNumL, string[] fillvalueL, string[] filesR, int bandNumR, string[] fillvalueR, Action <int, string> progressCallback, out long scL, out long scR)
 {
     scR = 0; scL = 0;
     //int widthl = 0, heightl = 0, lengthl = filesL.Length;
     //int widthr = 0, heightr = 0, lengthr = filesR.Length;
     //int xoffsetl = 0, yoffsetl = 0, xoffsetr = 0, yoffsetr = 0;
     if (StatRegionSet.UseVectorAOIRegion)
     {
         PrjEnvelope RegionEnv = StatRegionSet.AOIPrjEnvelope;
         _aoiContainer  = StatRegionSet.AoiContainer;
         _VectorAOIName = StatRegionSet.AOIName;
         if (RegionEnv == null || RegionEnv.Height <= 0 || RegionEnv.Width <= 0)
         {
             throw new ArgumentException("矢量AOI区域设置无效或范围不合法!");
         }
         //int[] dataPosL, dataPosR;
         //PrjEnvelope dstmainPrjL = null,dstmainPrjR = null;
         //if (CheckRegionIntersect(filesL[0], RegionEnv, out dataPosL, out dstmainPrjL))
         //{
         //    xoffsetl = dataPosL[0];
         //    yoffsetl = dataPosL[1];
         //    widthl = dataPosL[2];
         //    heightl = dataPosL[3];
         //}
         //if (CheckRegionIntersect(filesR[0], RegionEnv, out dataPosR, out dstmainPrjR))
         //{
         //    xoffsetr = dataPosR[0];
         //    yoffsetr = dataPosR[1];
         //    widthr = dataPosR[2];
         //    heightr = dataPosR[3];
         //}
     }
     if (progressCallback != null)
     {
         progressCallback(3, "开始读取波段数据...");
     }
     #region 获取左场数据
     enumDataType  datatype = enumDataType.Unknow;
     CoordEnvelope FileEnvL, FileEnvR = null;
     Size          fileSizeL, fileSizeR;
     int[]         aoiL, aoiR;
     using (IRasterDataProvider dataPrd = GeoDataDriver.Open(filesL[0]) as IRasterDataProvider)
     {
         if (dataPrd == null)
         {
             throw new FileLoadException(filesL[0] + "打开失败!");
         }
         datatype  = dataPrd.DataType;
         FileEnvL  = dataPrd.CoordEnvelope;
         fileSizeL = new Size(dataPrd.Width, dataPrd.Height);
     }
     aoiL = GetAOI(FileEnvL, _aoiContainer, fileSizeL);
     if (aoiL == null || aoiL.Length <= 0)
     {
         throw new ArgumentException("矢量AOI区域设置无效或范围不合法,左场AOI区域内点数为0!");
     }
     double[] marixl = GetCorrelateArrayAOI(filesL, bandNumL, fileSizeL, fillvalueL, datatype, aoiL, out scL);
     #endregion
     #region 获取右场数据
     using (IRasterDataProvider dataPrd = GeoDataDriver.Open(filesR[0]) as IRasterDataProvider)
     {
         if (dataPrd == null)
         {
             throw new FileLoadException(filesR[0] + "打开失败!");
         }
         datatype  = dataPrd.DataType;
         FileEnvR  = dataPrd.CoordEnvelope;
         fileSizeR = new Size(dataPrd.Width, dataPrd.Height);
     }
     aoiR = GetAOI(FileEnvR, _aoiContainer, fileSizeR);
     if (aoiR == null || aoiL.Length <= 0)
     {
         throw new ArgumentException("矢量AOI区域设置无效或范围不合法!");
     }
     double[] marixr = GetCorrelateArrayAOI(filesR, bandNumR, fileSizeR, fillvalueR, datatype, aoiR, out scR);
     #endregion
     //计算相关系数
     CloudParaStat stat = new CloudParaStat();
     if (progressCallback != null)
     {
         progressCallback(50, "开始计算相关系数...");
     }
     double cor = stat.CalculateCorrelationCoefficient(marixl, marixr, scL, scR);//取样本数最小
     if (progressCallback != null)
     {
         progressCallback(100, "相关系数计算完成!");
     }
     return(cor);
 }