Пример #1
0
        private void button11_Click(object sender, EventArgs e)
        {
            Dictionary <string, object> args = new Dictionary <string, object>();

            args.Add("a", 300);
            args.Add("b", 230);
            ArgumentProvider argPrd  = new ArgumentProvider(null, args);
            string           express = "(band1 > var_a) && (band2 > var_b)";

            int[] visitBandNos = new int[] { 6, 2, 1 };
            IExtractFuncProvider <UInt16> funprd = ExtractFuncProviderFactory.CreateExtractFuncProvider <UInt16>(visitBandNos, express, argPrd);
            Func <int, UInt16[], bool>    f      = funprd.GetBoolFunc();
        }
Пример #2
0
        private float GetArea()
        {
            float  area  = 0f;
            string model = txtFormula.Text.ToLower().Replace("x", txtStage.Text);
            IFeatureSimpleComputeFuncProvider <float, float> prd = ExtractFuncProviderFactory.CreateSimpleFeatureComputeFuncProvider <float, float>(model);
            Func <float, float> _featureComputer = prd.GetComputeFunc();

            if (_featureComputer != null)
            {
                area = _featureComputer(0);
            }
            if (_handler != null)
            {
                _handler(GetArgumentValue());
            }
            return(area);
        }
Пример #3
0
        public bool ProcessCSD(string outDir, string[] filenames, int[] modelCalcBands, int[] orderCalcBands, Dictionary <int, int> outBands, string calcModel)
        {
            List <RasterMaper> rms         = new List <RasterMaper>();
            List <int>         outbandsSrc = new List <int>();

            outbandsSrc.AddRange(orderCalcBands);
            foreach (int key in outBands.Keys)
            {
                outbandsSrc.Add(outBands[key]);
            }
            try
            {
                enumDataType        datatype = enumDataType.Atypism;
                IRasterDataProvider rdp      = null;
                RasterMaper         rdpRm    = null;
                for (int i = 0; i < filenames.Length; i++)
                {
                    rdp = GeoDataDriver.Open(filenames[i]) as IRasterDataProvider;
                    if (rdp != null)
                    {
                        datatype = rdp.DataType;
                        rdpRm    = new RasterMaper(rdp, outbandsSrc.ToArray());
                        rms.Add(rdpRm);
                    }
                }
                string outFileName = outDir + "\\" + GetFileName(filenames, ".ldf");

                IExtractFuncProvider <T> prd = ExtractFuncProviderFactory.CreateExtractFuncProvider <T>(modelCalcBands, calcModel, null);
                _boolFunc = prd.GetBoolFunc();
                int inVisitorCount    = rms.Count;
                int inVisitorBand     = orderCalcBands.Length;
                int resultInFileIndex = 0;
                using (IRasterDataProvider outRaster = CreateOutRaster(outFileName, rms.ToArray(), datatype, outBands.Count))
                {
                    RasterMaper[] fileIns  = rms.ToArray();
                    RasterMaper[] fileOuts = new RasterMaper[] { new RasterMaper(outRaster, outBands.Keys.ToArray()) };
                    //创建处理模型
                    RasterProcessModel <T, T> rfr = null;
                    rfr = new RasterProcessModel <T, T>(ConsoleWrite);
                    rfr.SetRaster(fileIns, fileOuts);
                    List <T> curValues   = new List <T>();
                    List <T> nextValues  = new List <T>();
                    List <T> indexValues = new List <T>();
                    rfr.RegisterCalcModel(new RasterCalcHandler <T, T>((rvInVistor, rvOutVistor, aoi) =>
                    {
                        int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX;

                        if (rvInVistor[0].RasterBandsData == null)
                        {
                            return;
                        }
                        for (int index = 0; index < dataLength; index++)
                        {
                            curValues.Clear();
                            for (int inBnad = 0; inBnad < inVisitorBand; inBnad++)
                            {
                                if (rvInVistor[0].RasterBandsData[inBnad] == null)
                                {
                                    return;
                                }
                                curValues.Add(rvInVistor[0].RasterBandsData[inBnad][index]);
                            }
                            resultInFileIndex = 0;

                            for (int inFile = 1; inFile < inVisitorCount; inFile++)
                            {
                                try
                                {
                                    if (rvInVistor[inFile].RasterBandsData == null)
                                    {
                                        return;
                                    }
                                    for (int inBnad = 0; inBnad < inVisitorBand; inBnad++)
                                    {
                                        if (rvInVistor[inFile].RasterBandsData[inBnad] == null)
                                        {
                                            return;
                                        }
                                        nextValues.Add(rvInVistor[inFile].RasterBandsData[inBnad][index]);
                                    }
                                    indexValues.AddRange(curValues);
                                    indexValues.AddRange(nextValues);
                                    if (_boolFunc != null)
                                    {
                                        if (!_boolFunc(index, indexValues.ToArray()))
                                        {
                                            resultInFileIndex = inFile;
                                            curValues.Clear();
                                            curValues.AddRange(nextValues);
                                        }
                                    }
                                }
                                finally
                                {
                                    indexValues.Clear();
                                    nextValues.Clear();
                                }
                            }
                            for (int outBand = 0; outBand < outBands.Count; outBand++)
                            {
                                rvOutVistor[0].RasterBandsData[outBand][index] = rvInVistor[resultInFileIndex].RasterBandsData[inVisitorBand + outBand][index];
                            }
                        }
                    }));
                    //执行
                    rfr.Excute();
                    Console.WriteLine("已完成!");
                }
            }
            finally
            {
            }
            return(true);
        }
Пример #4
0
        /// <summary>
        /// 修改原始方法-增加角度文件计算
        /// 修改说明:
        /// 修改创建输出文件:原输出一个文件,现输出包含角度多个文件
        /// 修改输出文件赋值部分
        /// </summary>
        /// <param name="isangle">是否假如角度文件进行计算</param>
        /// <param name="outDir">输出文件夹</param>
        /// <param name="filenames">输入文件-主ldf文件</param>
        /// <param name="modelCalcBands"></param>
        /// <param name="orderCalcBands"></param>
        /// <param name="outBands"></param>
        /// <param name="calcModel"></param>
        /// <returns></returns>
        public bool AngleProcessCSD(string outDir, string[] filenames, int[] modelCalcBands, int[] orderCalcBands, Dictionary <int, int> outBands, string calcModel)
        {
            IRasterDataProvider outRaster        = null;
            List <RasterMaper>  listoutrastermap = new List <RasterMaper>();
            enumDataType        angletype        = enumDataType.Int16;
            List <RasterMaper>  rms      = new List <RasterMaper>();
            List <RasterMaper>  rmsangle = new List <RasterMaper>();//角度输入文件rm

            List <int> outbandsSrc  = new List <int>();
            List <int> listoutindex = new List <int>();
            //输入文件角度对应键值对 分别为影像文件序号,影像文件对应的角度文件序号
            Dictionary <int, List <int> > _dicangle = new Dictionary <int, List <int> >();

            outbandsSrc.AddRange(orderCalcBands);
            foreach (int key in outBands.Keys)
            {
                outbandsSrc.Add(outBands[key]);
            }
            try
            {
                enumDataType        datatype = enumDataType.Atypism;
                IRasterDataProvider rdp      = null;
                RasterMaper         rdpRm    = null;
                //rmlist增加常规影像文件
                for (int i = 0; i < filenames.Length; i++)
                {
                    rdp = GeoDataDriver.Open(filenames[i]) as IRasterDataProvider;
                    if (rdp != null)
                    {
                        datatype = rdp.DataType;
                        rdpRm    = new RasterMaper(rdp, outbandsSrc.ToArray());
                        rms.Add(rdpRm);
                    }
                }
                IExtractFuncProvider <T> prd = ExtractFuncProviderFactory.CreateExtractFuncProvider <T>(modelCalcBands, calcModel, null);
                _boolFunc = prd.GetBoolFunc();
                int inVisitorCount    = rms.Count;
                int inVisitorBand     = orderCalcBands.Length;
                int resultInFileIndex = 0;
                #region 输出文件准备
                string outFileName = outDir + "\\" + GetFileName(filenames, ".ldf");
                outRaster = CreateOutRaster(outFileName, rms.ToArray(), datatype, outBands.Count);
                #endregion
                RasterMaper[] fileIns  = rms.ToArray();
                RasterMaper[] fileOuts = new RasterMaper[] { new RasterMaper(outRaster, outBands.Keys.ToArray()) };
                //创建处理模型
                RasterProcessModel <T, T> rfr = null;
                rfr = new RasterProcessModel <T, T>(ConsoleWrite);
                rfr.SetRaster(fileIns, fileOuts);
                List <T> curValues   = new List <T>();
                List <T> nextValues  = new List <T>();
                List <T> indexValues = new List <T>();
                rfr.RegisterCalcModel(new RasterCalcHandler <T, T>((rvInVistor, rvOutVistor, aoi) =>
                {
                    int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX;

                    if (rvInVistor[0].RasterBandsData == null)
                    {
                        return;
                    }
                    for (int index = 0; index < dataLength; index++)
                    {
                        curValues.Clear();
                        for (int inBnad = 0; inBnad < inVisitorBand; inBnad++)
                        {
                            if (rvInVistor[0].RasterBandsData[inBnad] == null)
                            {
                                return;
                            }
                            curValues.Add(rvInVistor[0].RasterBandsData[inBnad][index]);
                        }
                        resultInFileIndex = 0;

                        for (int inFile = 1; inFile < inVisitorCount; inFile++)
                        {
                            try
                            {
                                if (rvInVistor[inFile].RasterBandsData == null)
                                {
                                    return;
                                }
                                for (int inBnad = 0; inBnad < inVisitorBand; inBnad++)
                                {
                                    if (rvInVistor[inFile].RasterBandsData[inBnad] == null)
                                    {
                                        return;
                                    }
                                    nextValues.Add(rvInVistor[inFile].RasterBandsData[inBnad][index]);
                                }
                                indexValues.AddRange(curValues);
                                indexValues.AddRange(nextValues);
                                if (_boolFunc != null)
                                {
                                    if (!_boolFunc(index, indexValues.ToArray()))
                                    {
                                        resultInFileIndex = inFile;
                                        curValues.Clear();
                                        curValues.AddRange(nextValues);
                                    }
                                }
                            }
                            finally
                            {
                                indexValues.Clear();
                                nextValues.Clear();
                            }
                        }
                        for (int outBand = 0; outBand < outBands.Count; outBand++)
                        {
                            rvOutVistor[0].RasterBandsData[outBand][index] = rvInVistor[resultInFileIndex].RasterBandsData[inVisitorBand + outBand][index];
                        }
                        listoutindex.Add(resultInFileIndex);
                    }
                }));
                //执行
                rfr.Excute();

                #region 输入文件准备
                for (int i = 0; i < filenames.Length; i++)
                {
                    string[] anglefiles = GetAngleFilesByMainFile(filenames[i]);
                    for (int j = 0; j < anglefiles.Length; j++)
                    {
                        if (!File.Exists(anglefiles[j]))
                        {
                            continue;
                        }
                        IRasterDataProvider rdtemp = GeoDataDriver.Open(anglefiles[j]) as IRasterDataProvider;;
                        RasterMaper         rmtemp = new RasterMaper(rdtemp, new int[] { 1 });
                        rmsangle.Add(rmtemp);
                        List <int> itemangleindex = new List <int>();
                        itemangleindex.Add(rmsangle.Count - 1);
                        if (!_dicangle.Keys.Contains(i))//新增主键
                        {
                            _dicangle.Add(i, itemangleindex);
                        }
                        else//已经包含主键
                        {
                            _dicangle[i].Add(rmsangle.Count - 1);
                        }
                    }
                }
                #endregion
                #region 输出文件准备
                string[] outanglefiles = GetAngleFilesByMainFile(outFileName);
                for (int i = 0; i < outanglefiles.Length; i++)
                {
                    IRasterDataProvider itemraster = CreateOutRaster(outanglefiles[i], rmsangle.ToArray(), angletype, 1);//角度文件只有一个波段
                    listoutrastermap.Add(new RasterMaper(itemraster, new int[] { 1 }));
                }
                RasterMaper[] fileInsangle  = rmsangle.ToArray();
                RasterMaper[] fileOutsangle = listoutrastermap.ToArray();
                #endregion
                //创建处理模型
                RasterProcessModel <UInt16, UInt16> rfrangle = new RasterProcessModel <UInt16, UInt16>();;
                rfrangle.SetRaster(fileInsangle, fileOutsangle);
                int totalindex = 0;
                rfrangle.RegisterCalcModel(new RasterCalcHandler <UInt16, UInt16>((rvInVistor, rvOutVistor, aoi) =>
                {
                    int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX;
                    for (int i = 0; i < dataLength; i++)
                    {
                        int rasterindex            = listoutindex[totalindex + i];//当前点的合成数据所在文件序号
                        List <int> listangleindexs = _dicangle[rasterindex];
                        for (int outangleindex = 0; outangleindex < listangleindexs.Count; outangleindex++)
                        {
                            int _angleindex = listangleindexs[outangleindex];
                            rvOutVistor[outangleindex].RasterBandsData[0][i] = rvInVistor[_angleindex].RasterBandsData[0][i];
                        }
                    }
                    totalindex += dataLength;
                }

                                                                                  ));
                rfrangle.Excute();
                Console.WriteLine("全部生成完成!");
            }
            finally
            {
                if (outRaster != null)
                {
                    outRaster.Dispose();
                }
                if (listoutrastermap.Count > 0)
                {
                    for (int i = 0; i < listoutrastermap.Count; i++)
                    {
                        listoutrastermap[i].Raster.Dispose();//是否可以这样释放
                    }
                }
            }
            return(true);
        }