我們知道,可以通過ArcGIS提供的Geoprocessing工具調(diào)用ArcToolbox中提供的各類工具,然而,如果是調(diào)用自定義的模型該如何設(shè)置?
示例:根據(jù)高程點(diǎn)插值為面,然后進(jìn)行坡度分析,最后以15度為界限進(jìn)行重分類。
在ArcGIS中ArcToolbox中新建模型,然后使用C#調(diào)用該模型。
開發(fā)環(huán)境:VS2010,ArcGIS10.1,ArcObject10.1
1.在ArcGIS中新建模型
首先,在ArcToolbox中新建工具箱,然后在該工具箱下新建模型,如圖1所示。
圖1 新建模型
然后,添加工具到該模型中,搜索IDW,Slope,Reclassify到該模型中,然后進(jìn)行連接及參數(shù)設(shè)置,IDW右鍵,Make Variable,F(xiàn)rom Parammeter,Input point features,即完成添加輸入?yún)?shù)。雙擊Reclassify,在Reclassification中設(shè)置重分類的屬性,如圖2所示。
圖2 Reclassify中Reclassification的設(shè)置
需要注意的事,在輸入Old values時(shí),”-”前后需添加空格,而且最后一行NoData也是要添加的,否則會(huì)出現(xiàn)如圖3所示錯(cuò)誤。
圖3 輸入Old values時(shí)未輸入空格顯示的錯(cuò)誤提示
最后,在Input point features和Output raster(3)分別右鍵選擇Model Parameter命令,右上角出現(xiàn)“p”即為設(shè)置成功。
至此,自定義建模完成,在ArcGIS中運(yùn)行成功無誤后便可進(jìn)入下一步,調(diào)用自定義模型。
2.調(diào)用自定義模型
VS2010中,設(shè)計(jì)界面如圖4所示。
引用命名空間:
ESRI.ArcGIS.AnalysisTools
ESRI.ArcGIS.Geoprocessor
ESRI.ArcGIS.System
ESRI.ArcGIS.Version
代碼中加入:
using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.esriSystem;
圖5 錯(cuò)誤一
當(dāng)出現(xiàn)如圖5所示錯(cuò)誤時(shí),解決辦法如下:
1 static class Program 2 { 3 /// <summary> 4 /// 應(yīng)用程序的主入口點(diǎn)。 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 錯(cuò)誤二
解決辦法為:Form1中添加License授權(quán)代碼
1 IAoInitialize pAoInitialize = new AoInitializeClass();2 esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;3 licenseStatus = pAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);4 pAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);
至此,整個(gè)應(yīng)用程序運(yùn)行成功!效果如圖7所示。
圖7 運(yùn)行結(jié)果圖
最后,附上整個(gè)應(yīng)用程序的代碼:
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("調(diào)用成功!", "提示");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 }
聯(lián)系客服