基于C#的AE二次开发之GP工具的使用心得

28 篇文章 16 订阅
24 篇文章 42 订阅

基于C#的AE二次开发之GP工具的使用心得

Geoprocessor与Geoprocessing有什么区别?

Geoprocessing是GIS三大视角之一,能够通过分析处理已存在的数据,在新的数据集中产生结果。可以简单地理解为ToolBoxs中的工具。

Geoprocessor是ArcEngine9.2新增的一个基于NET Framework2.0的托管类,所有的Geoprocessing工具,包括扩展工具,都是由Geoprocessor对象调用运行,Geoprocessor能够通过设置不同的环境参数,简化执行Geoprocessing工具的过程,并返回相应的处理结果。(来看《插件式GIS应用框架的设计与实现——基于C#和ArcGIS Engine9.2》,这是一本不错的书!)

所以,一般地,在进行开发调用GP之前要添加Geoprocessor和Geoprocessing两个引用:

using ESRI.ArcGIS.Geoprocessor;
using ESRI.ArcGIS.Geoprocessing;

寻找工具

第一步,首先在ToolBox里找到要使用的工具,最好利用该工具测试一下实验数据,确保其正确性。工具右键属性可看到其英文名称。

第二步,去ESRI帮助中查找工具参数。在其中我们可以看到有哪些参数,分别是什么类型、含义,如果不知道怎么填写,可参考Python例子。

AE/AO开发工具与全名空间对应表

工具名称命名空间
3D Analyst toolsESRI.ArcGIS.Analyst3DTools
Analysis toolsESRI.ArcGIS.AnalysisTools
Conversion toolsESRI.ArcGIS.ConversionTools
Data Management toolsESRI.ArcGIS.DataManagementTools
Cartography toolsESRI.ArcGIS.CartographyTools
Coverage toolsESRI.ArcGIS.CoverageTools
Geocoding toolsESRI.ArcGIS.GeocodingTools
Geostatistical Analyst toolsESRI.ArcGIS.GeostatisticalAnalystTools
Linear Referencing toolsESRI.ArcGIS.LinearReferencingAnalystTools
Multidimension toolsESRI.ArcGIS.MultidimensionTools
Network Analyst toolsESRI.ArcGIS.NetworkAnalystTools
SamplesESRI.ArcGIS.SamplesTools
Spatial Analyst toolsESRI.ArcGIS.SpatialAnalystTools
Spatial Statistics toolsESRI.ArcGIS.SpatialStatisticsTools

调用方式

使用Buffer为例,调用GP实现缓冲区分析的方式:

方式一:实例化GP对象

//初始化GP
Geoprocessor GP = new Geoprocessor();
//初始化Buffer
ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer();
//输入要素
buffer.in_features = @"D\data\temp.gdb\road";
//输出要素类
buffer.out_feature_class = @"D\data\temp.gdb\road_bf30";
//缓冲距离
buffer.buffer_distance_or_field = 30; //默认单位
//执行工具
GP.Execute(buffer, null);

方式二:VariantArray传递参数

Geoprocessor GP = new Geoprocessor();
//工具箱存放路径
GP.AddToolbox(@"C:\Program Files (x86)\ArcGIS\Desktop10.1\ArcToolbox\Toolboxes\Analysis Tools.tbx");
//使用IVariantArray传递参数
IVariantArray array = new VarArrayClass();
array.Add(@"D\data\temp.gdb\road");//参数1
array.Add(@"D\data\temp.gdb\road_bf30");//参数2
array.Add(30);//缓冲距离
GP.Execute("Buffer", array, null);//执行工具

当然,定义GP对象也有两种方法:一是通过引用ESRI.ArcGIS.Geoprocessing命名空间,使用IGeoProcessor2接口定义,注意其中的P是大写;二是使用Geoprocessor类。

 // using ESRI.ArcGIS.Geoprocessor;
private static Geoprocessor GP = new Geoprocessor();

// using ESRI.ArcGIS.Geoprocessing;
IGeoProcessor2 GP = new GeoProcessor() as IGeoProcessor2; 

调试函数(C#)

/// <summary>
/// 执行GP
/// </summary>
/// <param name="mGP">GP对象</param>
/// <param name="process">GP工具</param>
/// <param name="TC"></param>
/// <returns>处理结果</returns>
public static IGeoProcessorResult Execute(Geoprocessor mGP, IGPProcess process, ITrackCancel TC)
{
    tGeoResult = null;
    mGP.OverwriteOutput = true; // 是否覆盖
    try
    {
       tGeoResult = (IGeoProcessorResult)mGP.Execute(process, null);
       ReturnMessages(mGP);
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message+"\n\n"+ex.StackTrace);
        ReturnMessages(mGP); //当调试正确后注释本行
    }
    return tGeoResult;
}
  
private static void ReturnMessages(Geoprocessor gp)
{
    string ms = "";
    if (gp.MessageCount > 0)
    {
        for (int Count = 0; Count <= gp.MessageCount - 1; Count++)
        {
            ms +="$"+ gp.GetMessage(Count) + "\n\n";
        }
    }
    MessageBox.Show(ms);
}

修改GP的执行:

IGeoProcessorResult result=Execute(GP,buffer,null);
IFeatureClass mFeatureClass=GP.Open(result.ReturnValue);

设置环境

个GP工具都有自己的执行参数,其中有些参数是很工具都有的,如容差、输入、输出位置都是有的,像ArcMap中一样,在进行地理处理前要进行环境的设置。

使用setEnvironmentValue方法来设置环境变量的值,使用getEnvironmentValue方法来获取当前环境变量的值。例如:

//获取和设置环境:单元格大小
String env = (String) gp.getEnvironmentValue("cellsize");
GP.setEnvironmentValue("cellsize", Double.valueOf(10.0));
// 设置输出坐标系统
gp.setEnvironmentValue("outputCoordinateSystem", "c:/Program Files/ArcGIS/Coordinate Systems/Projected Coordinate Systems/UTM/Nad 1983/NAD 1983 UTM Zone 21N.prj");
// 重置
GP.resetEnvironments();

批量处理

GeoProcessor类为我们提供了一些提取数据的方法,即通过list来获取数据库中数据名称,结果是字符串,通过获取的路径再进行GP调用等操作:

listDatasets (string wildCard, string datasetType)

listFeatureClasses (string wildCard, string featureType, string dataset)

listRasters (string wildCard, string rasterType)

listTables (string wildCard, string tableType)

listToolboxes(string wildCard)

listWorkspaces (string wildCard, string workspaceType)

/// <summary>
/// 要素筛选
/// </summary>
/// <param name="filePath">数据库位置</param>
/// <param name="featureType">文件类型,可填写Point,Polyline,Polygon等</param>
/// <param name="wildCard">扩展通配符</param>
/// <param name="dataset">要素集</param>
/// <returns></returns>
public static List<string> FeatureClassFilter(string filePath,string wildCard, string featureType,string dataset)
{
    lstWorkspace.Clear();
    GP.SetEnvironmentValue("workspace", filePath);
    IGpEnumList featureClasses = GP.ListFeatureClasses(wildCard,featureType,dataset);
    string featureClass = featureClasses.Next();
    while(featureClass!="")
    {
        lstWorkspace.Add(featureClass.ToString());
        featureClass = featureClasses.Next();
    }
    return lstWorkspace;
}

调用方法:

FeatureClassFilter(@"D\data\temp.gdb", "P*", "poInt", "net");

此句的含义是遍历获取temp.gdb中net数据集下名为p开头的点层要素。当然也可以通过IGPUtilities类直接打开要素层或要素类等。

IFeatureClass mFeatureClass=gpUtilities.OpenFeatureClassFromString(dataPath);

注意事项

(1)数据的测试

GP工具对输入、输出参数要求严格,因此首先要保证数据没有问题,可以先在ArcGIS中调用ArcToolBox进行操作,如果能正常执行,则说明数据基本没有问题。除数据本身名,还要注意数据的命名(不要出现中文的符号)、使用权限等问题。

(2)参数有多个值的设置

有的GP工具有多个输入,如联合(Union),如将数据库中的P1和P2进行联合操作,其输入要素要用分号隔开。

union.in_features = @"D\temp.gdb\P1;D\temp.gdb\P2";

如果已设置GP的默认数据库,可直接写成如下形式:

union.in_features = " P1; P2";

(3)"重分类"分类表设置

有的GP工具参数比较特殊,需要进行特别处理,可参考帮助文档中Python示例,如重分类工具,其重分类表参数设置如下:

Reclassify rc = new Reclassify();
rc.reclass_field = "Value";
rc.remap = "0.0 2.0 1; 2.0 2.5 2; 2.5 3.0 3 ";
……

即将原来的0-2重分类为1,原来2-2.5重分类为2,原来2.5-3重分类为3,同一类别的上限和下限用空格隔开,不同类别用分号隔开。

(4)添加XY数据

我们经常将文本文件中的坐标数据转到ArcMap中的点,需要使用 “添加xy数据"工具,通常会选择"文件”-“添加数据”-“添加XY数据”,这时,它属性哪个工具箱的呢?可以通过搜索的功能来查找它应该引用的类库。它在ToolBox中叫"创建XY事件图层"。当然,有些工具ToolBox是没有的,再怎么搜索也找不到,如"文件"-“共享为”-“服务”。

(5)"添加XY数据"的输出

工具"添加XY数据"的输出比较特殊,由此工具创建的是临时图层,需要保存,在ArcMap中右键导出结果即可,在ArcEngine中调用GP工具CopyFeatures(复制要素),FeatureToPoint(要素转点)或FeatureClassToFeatureClass(要素类转要素类)可导出为对应的图层。

(6)OpenRasterLayerFromString

IGPUtilities接口的OpenRasterLayerFromString函数总是不能得到结果,所以,只能使用IWorkspaceFactory接口来打开数据库中的栅格数据。示例代码:

/// <summary>
/// 打开栅格
/// </summary>
/// <param name="path">文件路径</param>
/// <param name="name">文件名</param>
/// <returns>栅格图层</returns>
public static IRasterLayer GetRater(string path, string name)
{
    IWorkspaceFactory mWSF = new RasterWorkspaceFactoryClass();
    IRasterWorkspace mRasterWorkspace = mWSF.OpenFromFile(path, 0) as IRasterWorkspace;
    IRasterDataset mRasterDataset = mRasterWorkspace.OpenRasterDataset(name);
  
    //创建rasterlayer从RasterDataset
    IRasterLayer mRasterLayer = new RasterLayerClass();
    mRasterLayer.CreateFromDataset(mRasterDataset);
    return mRasterLayer;
}

(7)参数值的灵活设置

在使用ArcMap中的工具时,有的工具参数需要灵活的设置,不能固化。

如做缓冲区分析,缓冲的半径为图层范围最大值,不同的图层,其值则不相同,所以,读取到变量中,再进行缓冲区分析。

private void BufferBounding500()
{
     //读取范围,设置半径
    IGeoDataset pGeodataset = gpUtilities.OpenFeatureClassFromString(gdbPath + filename+"_xy") as IGeoDataset;
    IEnvelope pEnvelope = pGeodataset.Extent;
    double distance = Max(pEnvelope.XMax - pEnvelope.XMin, pEnvelope.YMax - pEnvelope.YMin);
     //缓冲区分析
    ESRI.ArcGIS.AnalysisTools.Buffer bf = new ESRI.ArcGIS.AnalysisTools.Buffer();
    bf.in_features = gdbPath + fileName + "_sp";
    bf.buffer_distance_or_field = distance + " Degrees"; //注意设置缓冲半径的单位
    bf.out_feature_class = gdbPath + fileName + "_bf500";
    RunGPTool(GP, bf, null);
}

再如,做Kriging插值时,其参数"输出单元格大小"默认情况下是插值点范围的最大值除以250,但在实际中,这样的插值结果显示效果不很理想,因此,一般都是改为除以2500才比较合适。当然输出单元格大小越小,使用的内存和耗时就更多!

(8)裁剪栅格的范围参数

裁剪栅格Clip的rectangle参数需要设置为输出范围图层的四至。

private void ClipRaster()
{
    IGeoDataset pGeodataset = gpUtilities.OpenFeatureClassFromString(gdbPath + fileName + "_ clip") as IGeoDataset;
    IEnvelope pEnvelope = pGeodataset.Extent;
    //顺序:X 最小值、Y 最小值、X 最大值和 Y 最大值
    string strEnvelope = pEnvelope.XMin.ToString() + "" + pEnvelope.YMin.ToString() + "" + pEnvelope.XMax.ToString() + "" + pEnvelope.YMax.ToString();
    ESRI.ArcGIS.DataManagementTools.Clip cp = new ESRI.ArcGIS.DataManagementTools.Clip();
    cp.in_raster = gdbPath + fileName + "_krg";
    cp.in_template_dataset = gdbPath + fileName + "_ clip";
    cp.rectangle = strEnvelope;
    cp.clipping_geometry = "true";
    cp.out_raster = gdbPath + fileName + "_re";
    RunGPTool(GP, cp, null);
}

(9)按位置选择

按位置选择工具的输入必须是要素图层;不可以是要素类。所在在调用工具之前,需要先使用MakeFeatureLayer来创建要素图。

文章转自博客园-我也是个傻瓜

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C是指在编程过程中使用C语言作为主要编程语言。C语言是一种通用的高级编程语言,广泛应用于系统软件开发、嵌入式系统程序、游戏开发等领域。 基于C的优势有以下几点: 1. 速度高效:C语言以底层的方式运行,对计算机资源的利用率高,执行速度快。这使得C语言非常适合处理一些对性能要求较高的任务,如图形处理和嵌入式系统开发。 2. 跨平台性好:C语言是一种具有较高可移植性的编程语言。它的代码可以在不同操作系统和硬件上进行编译和执行,只需要进行少量的修改。这使得基于C的程序具有较好的跨平台特性,方便在不同平台上进行开发和部署。 3. 功能丰富:C语言提供了丰富的库函数和强大的功能,如内存管理、文件操作、指针操作等。这些功能使得开发者能够更高效地完成任务,简化开发过程,提高程序的可读性和可维护性。 4. 社区支持强大:C语言是一门相对较早的编程语言,有庞大的开发者社区和丰富的学习资源。开发者可以方便地获取到丰富的代码示例、开发工具和教程等,这些资源能够提供有力的帮助和支持。 基于C的缺点也需要考虑: 1. 相对复杂:C语言是一门相对底层的编程语言,对于初学者来说,可能会感到相对复杂。需要对内存管理、指针概念等进行深入理解,容易出现一些编程错误。 2. 安全性较低:C语言对于程序的边界值检查和安全性措施较弱,容易出现一些安全漏洞,如缓冲区溢出等。这要求开发者在编程过程中要非常注意安全问题,加强代码的检查和测试。 总的来说,基于C的编程具有高效、灵活和可移植等优势,但也需要注意语言本身的特性和安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值