示例#1
0
 // 空间分析:坡度
 private void Slope(object in_raster, object out_raster)
 {
     ESRI.ArcGIS.SpatialAnalystTools.Slope pTool = new ESRI.ArcGIS.SpatialAnalystTools.Slope()
     {
         in_raster  = in_raster,
         out_raster = out_raster
     };
     GP.Execute(pTool, null);
 }
示例#2
0
        private void btOk_Click(object sender, EventArgs e)
        {
            this.rtxtState.AppendText("正在执行,请您耐心等待...\n");
            this.rtxtState.ScrollToCaret();
            #region 步骤一:接收输入数据的路径
            string sInputFile = this.txtInput.Text;
            if (sInputFile.Equals(""))
            {
                MessageBox.Show("请选择输入DEM数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            this.rtxtState.AppendText("读取DEM数据...\n");
            this.rtxtState.ScrollToCaret();

            string sOutputFile = this.txtOutput.Text;
            if (sOutputFile.Equals(""))
            {
                MessageBox.Show("请选择输出路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            this.rtxtState.AppendText("读取输出路径...\n");
            this.rtxtState.ScrollToCaret();

            #endregion

            //string fileName = "地形地貌.mxd";
            //axMapControl1.LoadMxFile(fileName);
            ////将地图全屏最大化
            //axMapControl1.Extent = axMapControl1.FullExtent;



            IVariantArray parameters = new VarArrayClass();
            Geoprocessor  GP         = new Geoprocessor();
            object        sev        = null;
            this.rtxtState.AppendText("调用GP工具箱功能...\n");
            this.rtxtState.ScrollToCaret();

            ESRI.ArcGIS.SpatialAnalystTools.Slope slo = new ESRI.ArcGIS.SpatialAnalystTools.Slope();//计算坡度

            slo.in_raster          = sInputFile;
            slo.output_measurement = smeasurement;
            slo.z_factor           = sfactor;
            string sRoad1 = sOutputFile + sslope;
            slo.out_raster = sRoad1;
            this.rtxtState.AppendText("利用DEM数据计算坡度信息...\n");
            this.rtxtState.ScrollToCaret();

            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCal1 = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCal2 = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCal3 = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCal4 = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();

            //try
            //{
            GP.Execute(slo, null);//坡度计算
            this.rtxtState.AppendText("计算坡度完成...\n");
            this.rtxtState.ScrollToCaret();
            //坡度<=8°&高程<=2500m
            sOrder1             = "(\"" + sOutputFile + "/slope.tif" + "\"" + "<=8" + ")" + "&" + "(\"" + sInputFile + "\"" + "<=2500" + ")";
            sCal1.expression    = sOrder1;
            sCal1.output_raster = sOutputFile + sSlope08;
            this.rtxtState.AppendText("开始进行建设区分级计算...\n");
            this.rtxtState.ScrollToCaret();
            GP.Execute(sCal1, null);
            this.rtxtState.AppendText("计算出“优化建设区”...\n");
            this.rtxtState.ScrollToCaret();
            //8°<坡度<=15°& 高程<=2500m
            sOrder2             = "(" + "8<" + "\"" + sOutputFile + "/slope.tif" + "\")" + "&" + "(\"" + sOutputFile + "/slope.tif" + "\"" + "<=15" + ")" + "&" + "(\"" + sInputFile + "\"" + "<=2500" + ")";
            sCal2.expression    = sOrder2;
            sCal2.output_raster = sOutputFile + sSlope815;
            GP.Execute(sCal2, null);
            this.rtxtState.AppendText("计算出“允许建设区”...\n");
            this.rtxtState.ScrollToCaret();
            //15°<坡度<=25°&高程<=2500m
            sOrder3             = "(" + "15<" + "\"" + sOutputFile + "/slope.tif" + "\")" + "&" + "(\"" + sOutputFile + "/slope.tif" + "\"" + "<=25" + ")" + "&" + "(\"" + sInputFile + "\"" + "<=2500" + ")";
            sCal3.expression    = sOrder3;
            sCal3.output_raster = sOutputFile + sSlope1525;
            GP.Execute(sCal3, null);
            this.rtxtState.AppendText("计算出“有条件建设区”...\n");
            this.rtxtState.ScrollToCaret();
            //25°<坡度 | 高程<=2500m
            sOrder4             = "(\"" + sOutputFile + "/slope.tif" + "\"" + ">25" + ")" + "|" + "(\"" + sInputFile + "\"" + ">2500" + ")";
            sCal4.expression    = sOrder4;
            sCal4.output_raster = sOutputFile + sSlope25;
            GP.Execute(sCal4, null);
            this.rtxtState.AppendText("计算出禁止建设区...\n");
            this.rtxtState.ScrollToCaret();

            this.rtxtState.AppendText("结果计算完成...\n");
            this.rtxtState.ScrollToCaret();
            //MessageBox.Show(GP.GetMessages(ref sev));


            //修改mxd数据源路径
            this.rtxtState.AppendText("开始将结果用地图输出展示,请稍等...\n");
            this.rtxtState.ScrollToCaret();
            IMapDocument pMapDocument = new MapDocumentClass();
            pMapDocument.Open("模板地形地貌.mxd"); //打开本地的“模板地形地貌.mxd”地图文档,用来操作改mxd文件
            IMap              pMap                   = pMapDocument.get_Map(0);
            IMapLayers        pMapLayer              = pMap as IMapLayers;
            IRasterLayer      pRasterLayer           = new RasterLayerClass();
            IWorkspaceFactory rasterWorkspaceFactory = new RasterWorkspaceFactoryClass();
            IRasterWorkspace  rasterWorkspace        = (IRasterWorkspace)rasterWorkspaceFactory.OpenFromFile(txtOutput.Text, 0);



            IRasterDataset pRasterDataset1 = rasterWorkspace.OpenRasterDataset("优化建设区.tif"); //打开"优化建设区.tif"为栅格图的文件名
            pRasterLayer.CreateFromDataset(pRasterDataset1);                                 //创建
            pRasterLayer = pMapLayer.get_Layer(1) as IRasterLayer;
            pRasterLayer.CreateFromDataset(pRasterDataset1);

            //更改“允许建设区.tif”数据源路径
            IRasterLayer   pRasterLayer2   = new RasterLayerClass();
            IRasterDataset pRasterDataset2 = rasterWorkspace.OpenRasterDataset("允许建设区.tif"); //打开"允许建设区.tif"为栅格图的文件名
            pRasterLayer2.CreateFromDataset(pRasterDataset2);                                //创建
            pRasterLayer2 = pMapLayer.get_Layer(2) as IRasterLayer;
            pRasterLayer2.CreateFromDataset(pRasterDataset2);

            //更改"有条件建设区.tif"数据源路径
            IRasterLayer   pRasterLayer3   = new RasterLayerClass();
            IRasterDataset pRasterDataset3 = rasterWorkspace.OpenRasterDataset("有条件建设区.tif"); //打开"有条件建设区.tif"为栅格图的文件名
            pRasterLayer3.CreateFromDataset(pRasterDataset3);                                 //创建
            pRasterLayer3 = pMapLayer.get_Layer(3) as IRasterLayer;
            pRasterLayer3.CreateFromDataset(pRasterDataset3);

            //更改"禁止建设区.tif"数据源路径
            IRasterLayer   pRasterLayer4   = new RasterLayerClass();
            IRasterDataset pRasterDataset4 = rasterWorkspace.OpenRasterDataset("禁止建设区.tif"); //打开"禁止建设区.tif"为栅格图的文件名
            pRasterLayer4.CreateFromDataset(pRasterDataset4);                                //创建
            pRasterLayer4 = pMapLayer.get_Layer(4) as IRasterLayer;
            pRasterLayer4.CreateFromDataset(pRasterDataset4);


            pMapDocument.Save(true, true);//保存更改完路径后的mxd文件模板地形地貌2

            //string fileName = "南湖村.mxd";// @"C:\Users\tangmeng\Desktop\农用地籍数据库\实验四\南湖数据\南湖村.mxd";
            //pMap.LoadMxFile(fileName);
            ////将地图全屏最大化
            //pMap.Extent = pMap.FullExtent;



            string MdbFile = "模板地形地貌.mxd";
            _PageLayoutControl.LoadMxFile(MdbFile);
            //将mxd全屏最大化
            _PageLayoutControl.Extent = _PageLayoutControl.FullExtent;


            // tabControl1.SelectedTab = tabPage1;

            this.rtxtState.AppendText("地图输出完成...\n");
            this.rtxtState.ScrollToCaret();
        }
示例#3
0
        private void btnOK_Click(object sender, EventArgs e)
        {
            if (txtSoilClay.Text.Equals(""))
            {
                MessageBox.Show("请选择输入土壤黏粒含量(%)数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (txtSoilSlit.Text.Equals(""))
            {
                MessageBox.Show("请选择输入土壤粉粒含量(%)数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (txtSoilSand.Text.Equals(""))
            {
                MessageBox.Show("请选择输入土壤砂粒含量(%)数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (txtSoilOrganic.Text.Equals(""))
            {
                MessageBox.Show("请选择输入土壤有机物含量(%)数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (txtDem.Text.Equals(""))
            {
                MessageBox.Show("请选择输入DEM数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (txtC.Text.Equals(""))
            {
                MessageBox.Show("请选择输入地表覆被因子相关数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (txtP.Text.Equals(""))
            {
                MessageBox.Show("请选择输入水土保持措施因子数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (txtSavePath.Text.Equals(""))
            {
                MessageBox.Show("请选择结果输出路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (rbtnR.Checked && txtR.Text.Equals(""))
            {
                MessageBox.Show("请选择输入降雨侵蚀力因子R相关数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if ((!rbtnR.Checked) && txtPcpPath.Text.Equals(""))
            {
                MessageBox.Show("请选择输入多年平均各月降雨量数据所在路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if ((!rbtnR.Checked) && txtPcpPrefix.Text.Equals(""))
            {
                MessageBox.Show("请输入数据前缀(如:pcp_*)!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if ((!rbtnR.Checked) && txtPcpSuffix.Text.Equals(""))
            {
                MessageBox.Show("请输入数据后缀(如:tif)!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if ((!rbtnR.Checked) && txtYear.Text.Equals(""))
            {
                MessageBox.Show("请输入年平均降水量!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //现创建一个存放临时文件的临时文件夹
            string newPath = System.IO.Path.Combine(Temfile, "");

            System.IO.Directory.CreateDirectory(newPath);

            this.rtxtState.AppendText("正在执行,请您耐心等待...\n");
            this.rtxtState.ScrollToCaret();
            this.rtxtState.AppendText("开始准备配置文件...\n");
            this.rtxtState.ScrollToCaret();
            IVariantArray parameters = new VarArrayClass();
            Geoprocessor  GP         = new Geoprocessor();

            this.rtxtState.AppendText("准备调用GP工具箱...\n");
            this.rtxtState.ScrollToCaret();
            //ESRI.ArcGIS.DataManagementTools.GetRasterProperties NDVIMin = new ESRI.ArcGIS.DataManagementTools.GetRasterProperties();
            //ESRI.ArcGIS.DataManagementTools.GetRasterProperties NDVIMax = new ESRI.ArcGIS.DataManagementTools.GetRasterProperties();
            ESRI.ArcGIS.SpatialAnalystTools.Slope            slo     = new ESRI.ArcGIS.SpatialAnalystTools.Slope();//计算坡度
            ESRI.ArcGIS.SpatialAnalystTools.Fill             demFill = new ESRI.ArcGIS.SpatialAnalystTools.Fill();
            ESRI.ArcGIS.SpatialAnalystTools.FlowDirection    Filldec = new ESRI.ArcGIS.SpatialAnalystTools.FlowDirection();
            ESRI.ArcGIS.SpatialAnalystTools.FlowAccumulation DecAcc  = new ESRI.ArcGIS.SpatialAnalystTools.FlowAccumulation();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCals   = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCalm   = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCalLS  = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCalR   = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCalK   = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCalA   = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator sCalC   = new ESRI.ArcGIS.SpatialAnalystTools.RasterCalculator();
            //1计算参数R

            if (rbtnR.Checked)
            {
                sR = txtR.Text;
                this.rtxtState.AppendText("降水侵蚀因子R读取成功,准备计算参数K...\n");
                this.rtxtState.ScrollToCaret();
            }
            else
            {
                this.rtxtState.AppendText("开始计算参数R...\n");
                this.rtxtState.ScrollToCaret();
                string sFileName = "";
                string sYear     = txtYear.Text;
                for (int i = 1; i < 13; i++)
                {
                    sFileName = txtPcpPath.Text + "\\" + this.txtPcpPrefix.Text + i.ToString() + "." + this.txtPcpSuffix.Text;
                    strExp    = "(1.735 * Power(10,1.5 * Log10((" + "\"" + sFileName + "\"" + " * " + "\"" + sFileName + "\"" + ") /" + "\"" + txtYear.Text + "\")" + " - 0.08188))";
                    if (i < 12)
                    {
                        sR2 = sR2 + strExp + "+";
                    }
                    else
                    {
                        sR2 = sR2 + strExp;
                    }
                }
                sR3 = sR2;
                sCalR.expression = sR3;
                sR = Temfile + "\\CalR.tif";
                sCalR.output_raster = sR;
                GP.Execute(sCalR, null);
                this.rtxtState.AppendText("降水侵蚀因子R计算成功,准备计算参数K...\n");
                this.rtxtState.ScrollToCaret();
            }

            //2计算参数K
            sK = "(0.2 + 0.3 * Exp(-0.0256 *" + "\"" + txtSoilSand.Text + "\"" + "* (1.0 - " + "\"" + txtSoilSlit.Text + "\"" + " / 100.0))) * Power((" + "\"" + txtSoilSlit.Text + "\"" + " * 1.0 / (" + "\"" + txtSoilClay.Text + "\"" + " * 1.0 + " + "\"" + txtSoilSlit.Text + "\"" + " * 1.0)), 0.3) * (1.0 - 0.25 * " + "\"" + txtSoilOrganic.Text + "\"" + " * 0.58 / (" + "\"" + txtSoilOrganic.Text + "\"" + " * 0.58 + Exp(3.72 - 2.95 * " + "\"" + txtSoilOrganic.Text + "\"" + " * 0.58))) * (1.0 - (0.7 * (1.0 - " + "\"" + txtSoilSand.Text + "\"" + " / 100.0)) / ((1.0 - " + "\"" + txtSoilSand.Text + "\"" + " / 100.0) + Exp(-5.51 + 22.9 * (1.0 - " + "\"" + txtSoilSand.Text + "\"" + " / 100.0))))";
            sCalK.expression    = sK;
            CalKpath            = Temfile + "\\CalK.tif";
            sCalK.output_raster = CalKpath;
            GP.Execute(sCalK, null);
            this.rtxtState.AppendText("土壤可蚀性因子K计算成功...\n");
            this.rtxtState.ScrollToCaret();
            this.rtxtState.AppendText("准备计算地形因子LS...\n");
            this.rtxtState.ScrollToCaret();
            //3计算参数LS
            //Fill Dem
            this.rtxtState.AppendText("开始填充洼地...\n");
            this.rtxtState.ScrollToCaret();
            demFill.in_surface_raster  = txtDem.Text;
            demFill.out_surface_raster = Temfile + "\\demFill.tif";
            GP.Execute(demFill, null);
            // cal FlowDirection
            this.rtxtState.AppendText("开始计算流向...\n");
            this.rtxtState.ScrollToCaret();
            Filldec.in_surface_raster         = Temfile + "\\demFill.tif";
            Filldec.out_flow_direction_raster = Temfile + "\\FillDec.tif";
            GP.Execute(Filldec, null);
            //cal FlowAccumulation
            this.rtxtState.AppendText("开始计算流量...\n");
            this.rtxtState.ScrollToCaret();
            Filldec.in_surface_raster = Temfile + "\\FillDec.tif";
            FlowAcc = Temfile + "\\FlowAcc.tif";
            Filldec.out_flow_direction_raster = FlowAcc;
            GP.Execute(Filldec, null);

            //先计算坡度
            this.rtxtState.AppendText("开始计算坡度...\n");
            this.rtxtState.ScrollToCaret();
            slo.in_raster          = txtDem.Text;
            slo.output_measurement = "DEGREE";
            slo.z_factor           = 1;
            string sRoad1 = Temfile + "\\Slope.tif";

            slo.out_raster = sRoad1;
            GP.Execute(slo, null);//坡度计算
            //cal S
            sS = "Con(" + "\"" + sRoad1 + "\"" + " < 5,10.8 * Sin(" + "\"" + sRoad1 + "\"" + " * 3.14 / 180) + 0.03,Con(" + "\"" + sRoad1 + "\"" + " >= 10,21.9 * Sin(" + "\"" + sRoad1 + "\"" + " * 3.14 / 180) - 0.96,16.8 * Sin(" + "\"" + sRoad1 + "\"" + " * 3.14 / 180) - 0.5))";
            sCals.expression    = sS;
            Calspath            = Temfile + "\\CalS.tif";
            sCals.output_raster = Calspath;
            GP.Execute(sCals, null);
            //cal m
            sM = "Con(" + "\"" + sRoad1 + "\"" + " <= 1,0.2,Con(" + "\"" + sRoad1 + "\"" + " <= 3,0.3,Con(" + "\"" + sRoad1 + "\"" + " <= 5,0.4,0.5)))";
            sCalm.expression    = sM;
            Calmpath            = Temfile + "\\CalM.tif";
            sCalm.output_raster = Calmpath;
            GP.Execute(sCalm, null);
            //cal ls
            sLs = "\"" + Calspath + "\"" + " * Power((" + "\"" + CalKpath + "\"" + " * " + this.txtCellSize.Text + " / 22.1)," + "\"" + Calmpath + "\"" + ")";
            sCalLS.expression    = sLs;
            Callspath            = Temfile + "\\CalLS.tif";
            sCalm.output_raster  = Calmpath;
            sCalLS.output_raster = Callspath;
            GP.Execute(sCalLS, null);
            this.rtxtState.AppendText("地形因子LS计算成功...\n");
            this.rtxtState.ScrollToCaret();

            //4计算参数C
            if (rbtnVegCover.Checked)
            {
                CalCpath = txtC.Text;
                this.rtxtState.AppendText("地表覆盖因子C读取成功...\n");
                this.rtxtState.ScrollToCaret();
            }
            else
            {
                this.rtxtState.AppendText("准备计算地表覆盖因子C...\n");
                this.rtxtState.ScrollToCaret();
                //计算NDVI最小值
                //NDVIMin.in_raster = txtC.Text;
                //CalKpath = txtDem.Text + "/CalK.tif";
                //NDVIMin.property_type = "MINIMUM";
                //GP.Execute(sCalK, null);
                double         dMin = 0;
                IGeoProcessor2 gp   = new GeoProcessorClass();
                gp.OverwriteOutput = true;
                // Create a variant array to hold the parameter values.
                IVariantArray       parameters2 = new VarArrayClass();
                IGeoProcessorResult result      = new GeoProcessorResultClass();
                // Set parameter values.
                parameters2.Add(txtC.Text);
                parameters2.Add("MINIMUM");
                result = gp.Execute("GetRasterProperties_management", parameters2, null);
                dMin   = (double)result.ReturnValue;

                //计算NDVI最大值
                double         dMax = 0;
                IGeoProcessor2 gp2  = new GeoProcessorClass();
                gp2.OverwriteOutput = true;
                // Create a variant array to hold the parameter values.
                IVariantArray       parameters3 = new VarArrayClass();
                IGeoProcessorResult result3     = new GeoProcessorResultClass();
                // Set parameter values.
                parameters3.Add(txtC.Text);
                parameters3.Add("MAXIMUM");
                result3 = gp2.Execute("GetRasterProperties_management", parameters3, null);
                dMax    = (double)result3.ReturnValue;

                //最后计算C
                sC = "(" + "\"" + txtC.Text + "\"" + " - " + dMin + ") / (" + dMax + " - " + dMin + ")";
                sCalC.expression    = sC;
                CalCpath            = Temfile + "\\CalC.tif";
                sCalC.output_raster = CalCpath;
                GP.Execute(sCalC, null);
                this.rtxtState.AppendText("地表覆盖因子C计算成功...\n");
                this.rtxtState.ScrollToCaret();
            }


            //5计算P
            sP = txtP.Text;
            this.rtxtState.AppendText("读取水土保持措施因子P...\n");
            this.rtxtState.ScrollToCaret();
            //最后开始计算A=R*K*LS*C*P
            this.rtxtState.AppendText("准备计算水土流失方程...\n");
            this.rtxtState.ScrollToCaret();
            sA = "\"" + sR + "\"" + " * " + "\"" + CalKpath + "\"" + " * " + "\"" + Callspath + "\"" + " * (1 - " + "\"" + CalCpath + "\"" + ") * " + "\"" + sP + "\"";
            sCalA.expression = sA;

            sCalA.output_raster = txtSavePath.Text;
            GP.Execute(sCalA, null);
            //删除临时文件夹
            string deleteFile = Temfile;

            DeleteFolder(deleteFile);
            this.rtxtState.AppendText("计算成功,已将结果成功保存...\n");
            this.rtxtState.ScrollToCaret();
        }