DATE: 2018-04-17

开发环境:

ArcGIS 10.5,Visual Studio 2015 64位

在进行ArcObject(下文简称AO)开发前,应当先安装ArcGIS相关软件,并安装.net开发包,下文所述步骤,是在你已安装好环境,并有ArcGIS 许可的前题下,文中代码,才能运行。

废话不说,直接聊过程、上图、上代码,_^^_

开始新建工程:

1、本文以WinForm表单工程为例,.net framework 要在4以上,见下图:

arkui 安装axios_arkui 安装axios

2、添加许可(此步骤重要)

添加许可时,要根据当前机器所安装的许可,选择正确的许可类型。

在第一步生成的工程名称上右键,在弹出的菜单上点击 Add ArcGIS Licence Checking……,在弹出的对话框中选择正确的许可类型(注:如果各位亲自定义的toolbox工具中用到了ArcGIS扩展功能,此时一定要把许可勾选,否则在运行和调试时,会出现赶也走赶不走的bug),见下图:

arkui 安装axios_自定义_02

arkui 安装axios_自定义_03

该步骤完成后,VS会自动在我们新建的表单工程的Program.cs文件的main方法添加一些许可初始化代码,并生成一个LicenseInitializer.cs文件,在该文件中,进行了许可的绑定。

3、调用 arcgis 自带的toolbox工具和自定义 toolbox 工具

在完成了许可初始化后,我们就可以进行调用toolbox工具代码的编写了,在本示例中,我主要编写了两个方法,一个是对 arcgis 自带工具的调用和自定义工具的调用,不说废话,show you code:

3.1、调用 arcgis 自带工具

调用自带工具只展示一种方式,其中要注意的是,向 parameters 添加参数的顺序一定要与工具输入参数顺序一致,否则会调用不成功:

public static void callSystemToolbox()
        {
            DirectoryInfo rootDir = Directory.GetParent(Environment.CurrentDirectory);
            string root = rootDir.Parent.Parent.FullName;//路径最后不带\

            //using ESRI.ArcGIS.Geoprocessing
            //GeoGeoprocessing 是一个COM Interop程序集, COM Interop看上去像是介乎于COM和.Net之间的一条纽带,一座桥梁
            IGeoProcessor2 gp = new GeoProcessorClass();
            gp.OverwriteOutput = true;

            IVariantArray parameters = new VarArrayClass();
            parameters.Add(root + "\\NetCallArcObject105Toolbox\\resource\\data\\dawen.shp");
            parameters.Add(root + "\\NetCallArcObject105Toolbox\\resource\\result\\Copy4");

            object sev1 = null;
            try
            {
                gp.Execute("CopyFeatures", parameters, null);
                Console.WriteLine(gp.GetMessages(ref sev1));
            }
            catch (Exception ex)
            {
                Console.WriteLine(gp.GetMessages(ref sev1));
            }
        }

 

 3.2、调用自定义toolbox工具

下面代码展示了 2 种调用自定义 toolbox 工具的方式,写在一个方法内,各位亲在阅读时,要注意 2 种方式引用的命名空间不一样,show you code:

private void callCustomerToolbox()
        {
            DirectoryInfo rootDir = Directory.GetParent(Environment.CurrentDirectory);
            string root = rootDir.Parent.Parent.FullName;

            //第 1 种调用方式:
            //using ESRI.ArcGIS.Geoprocessing
            //GeoGeoprocessing 是一个COM Interop程序集, COM Interop看上去像是介乎于COM和.Net之间的一条纽带,一座桥梁
            IGeoProcessor2 gpc = new GeoProcessorClass();
            gpc.OverwriteOutput = true;
            gpc.AddToolbox(root + "\\NetCallArcObject105Toolbox\\resource\\customertoolbox\\ZCustomer.tbx");

            IVariantArray parameters1 = new VarArrayClass();
            parameters1.Add(root + "\\NetCallArcObject105Toolbox\\resource\\data\\rain_2016.flt");
            parameters1.Add("0 0.240362 1;0.240362 0.677384 2;0.677384 1.136257 3;1.136257 1.638832 4;1.638832 2.163258 5;2.163258 2.731386 6;2.731386 3.430621 7;3.430621 4.304665 8;4.304665 5.593879 9");
            parameters1.Add(root + "\\NetCallArcObject105Toolbox\\resource\\result\\rain_2016.json");

            object sev1 = null;
            IGeoProcessorResult result = new GeoProcessorResultClass();
            try
            {
//第一个参数是各位亲自定义的toolbox工具的名称 
                result = gpc.Execute("ProduceJsonFromFltWithNoProject", parameters1, null);
                Console.WriteLine(gpc.GetMessages(ref sev1));
            }
            catch (Exception ex)
            {
                Console.WriteLine(gpc.GetMessages(ref sev1));
            }

            //第 2 种调用方式:
            //using ESRI.ArcGIS.Geoprocessor
            //Geoprocessor 是一个托管程序集
            Geoprocessor GP = new Geoprocessor();
            GP.OverwriteOutput = true;
            GP.AddToolbox(root + "\\NetCallArcObject105Toolbox\\resource\\customertoolbox\\ZCustomer.tbx");

            IVariantArray parameters2 = new VarArrayClass();
            parameters2.Add(root + "\\NetCallArcObject105Toolbox\\resource\\data\\rain_2016.flt");
            parameters2.Add(root + "\\NetCallArcObject105Toolbox\\resource\\result\\rain_2016.tif");

            object sev2 = null;
            try
            {
                GP.Execute("ModelTest", parameters2, null);
                Console.WriteLine(GP.GetMessages(ref sev2));
            }
            catch (Exception ex)
            {
                Console.WriteLine(GP.GetMessages(ref sev2));
            }
        }

 

代码打完,收工

尾注:

切记切记!

 祝各位亲玩的愉快~