我们知道,可以通过ArcGIS提供的Geoprocessing工具调用ArcToolbox中提供的各类工具,然而,如果是调用自定义的模型该如何设置?
示例:根据高程点插值为面,然后进行坡度分析,最后以15度为界限进行重分类。
在ArcGIS中ArcToolbox中新建模型,然后使用C#调用该模型。
开发环境:VS2010,ArcGIS10.1,ArcObject10.1
1.在ArcGIS中新建模型
首先,在ArcToolbox中新建工具箱,然后在该工具箱下新建模型,如图1所示。
图1 新建模型
然后,添加工具到该模型中,搜索IDW,Slope,Reclassify到该模型中,然后进行连接及参数设置,IDW右键,Make Variable,From Parammeter,Input point features,即完成添加输入参数。双击Reclassify,在Reclassification中设置重分类的属性,如图2所示。
图2 Reclassify中Reclassification的设置
需要注意的事,在输入Old values时,”-”前后需添加空格,而且最后一行NoData也是要添加的,否则会出现如图3所示错误。
图3 输入Old values时未输入空格显示的错误提示
最后,在Input point features和Output raster(3)分别右键选择Model Parameter命令,右上角出现“p”即为设置成功。
至此,自定义建模完成,在ArcGIS中运行成功无误后便可进入下一步,调用自定义模型。
2.调用自定义模型
VS2010中,设计界面如图4所示。
图4 设计界面图引用命名空间:
ESRI.ArcGIS.AnalysisTools
ESRI.ArcGIS.Geoprocessor
ESRI.ArcGIS.System
ESRI.ArcGIS.Version
代码中加入:
using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.esriSystem;
图5 错误一
当出现如图5所示错误时,解决办法如下:
1 static class Program 2 { 3 /// <summary> 4 /// 应用程序的主入口点。 5 /// </summary> 6 [STAThread] 7 static void Main() 8 { 9 Application.EnableVisualStyles();10 Application.SetCompatibleTextRenderingDefault(false);11 ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);12 Application.Run(new Form1());13 }14 }
即在Program.cs中添加ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
图6 错误二
解决办法为:Form1中添加License授权代码
1 IAoInitialize pAoInitialize = new AoInitializeClass();2 esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;3 licenseStatus = pAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);4 pAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);
至此,整个应用程序运行成功!效果如图7所示。
图7 运行结果图
最后,附上整个应用程序的代码:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 using ESRI.ArcGIS.Geoprocessor;11 using ESRI.ArcGIS.esriSystem;12 13 namespace CallModel14 {15 public partial class Form1 : Form16 {17 public Form1()18 {19 IAoInitialize pAoInitialize = new AoInitializeClass();20 esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;21 licenseStatus = pAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);22 pAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);23 24 InitializeComponent();25 }26 27 private void Form1_Load(object sender, EventArgs e)28 {29 30 }31 32 private void button1_Click(object sender, EventArgs e)33 {34 OpenFileDialog openFileDialog = new OpenFileDialog();35 openFileDialog.Title = "打开文件";36 openFileDialog.Filter = "(shp文件)*.shp|*.shp";37 if (openFileDialog.ShowDialog() == DialogResult.OK)38 {39 textBox1.Text = openFileDialog.FileName;40 }41 }42 43 private void button2_Click(object sender, EventArgs e)44 {45 SaveFileDialog saveDialog = new SaveFileDialog();46 saveDialog.Title = "保存文件";47 saveDialog.Filter = "(tif文件)*.tif|*.tif|(img文件)*.img|*.img";48 if (saveDialog.ShowDialog() == DialogResult.OK)49 {50 textBox2.Text = saveDialog.FileName;51 }52 }53 54 private void button3_Click(object sender, EventArgs e)55 {56 Geoprocessor gp = new Geoprocessor();57 gp.OverwriteOutput = true;58 59 gp.AddToolbox(@"D:\Program Files\ArcGIS\Desktop10.1\ArcToolbox\Toolboxes\MyToolbar.tbx");60 IVariantArray parameters = new VarArrayClass();61 parameters.Add(textBox1.Text.ToString().Trim());62 parameters.Add(textBox2.Text.ToString().Trim());63 gp.Execute("Model", parameters, null);64 MessageBox.Show("调用成功!", "提示");65 }66 67 private void button4_Click(object sender, EventArgs e)68 {69 this.Close();70 //System.Environment.Exit(System.Environment.ExitCode);终止程序方式二71 //Application.Exit();终止程序方式三72 }73 }74 }
联系客服