GP的使用心得

在ArcEngine中,GP无疑是GIS开发者的神器。自ArcEngine9.2开始新增一个程序集ESRI.ArcGIS.Geoprocessor,它能调用包含扩展模块在内的所有Geoprocessing工具。关于GP的使用问题,做如下总结:

1.许可问题

大家都知道,AE二次开发有两种许可定义方式:一是直接拖放License控件,右键设置其属性,另一种方式是使用IAoInitialize接口实现。但两者只需一种即可,建议使用后者。Program.cs文件Main函数中初始代码示例:

  1. //绑定Runtime
  2. if (!RuntimeManager.Bind(ProductCode.Engine))
  3. {
  4. ????if (!RuntimeManager.Bind(ProductCode.Desktop))
  5. ????{
  6. ????????MessageBox.Show("不能绑定ArcGIS Runtime,应用程序即将关闭!");
  7. ????????return;
  8. ????}
  9. }
  10. //初始化Advanced许可,还有Standard,Engine,Basic等
  11. esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;
  12. IAoInitialize m_AoInitialize = new AoInitialize();
  13. licenseStatus = m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);
  14. //检查扩展模块功能
  15. licenseStatus = m_AoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst);

?

概念区分

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例子。

工具名称及对应命名空间:


工具名称


命名空间


3D Analyst tools


ESRI.ArcGIS.Analyst3DTools


Analysis tools


ESRI.ArcGIS.AnalysisTools


Conversion tools


ESRI.ArcGIS.ConversionTools


Data Management tools


ESRI.ArcGIS.DataManagementTools


Cartography tools


ESRI.ArcGIS.CartographyTools


Coverage tools


ESRI.ArcGIS.CoverageTools


Geocoding tools


ESRI.ArcGIS.GeocodingTools


Geostatistical Analyst tools


ESRI.ArcGIS.GeostatisticalAnalystTools


Linear Referencing tools


ESRI.ArcGIS.LinearReferencingAnalystTools


Multidimension tools


ESRI.ArcGIS.MultidimensionTools


Network Analyst tools


ESRI.ArcGIS.NetworkAnalystTools


Samples


ESRI.ArcGIS.SamplesTools


Spatial Analyst tools


ESRI.ArcGIS.SpatialAnalystTools


Spatial Statistics tools


ESRI.ArcGIS.SpatialStatisticsTools

第三步,查看它在哪个工具大类下,添加对应的引用,设置参数,调试运行即可。下表是EsriLicenseProduct,关于扩展许可详见esriLicenseExtensionCode


许可


代码


描述


esriLicenseProductCodeEngine


10


Engine Product Code


esriLicenseProductCodeEngineGeoDB


20


Engine Enterprise GeoDatabase


esriLicenseProductCodeArcServer


30


ArcServer Product Code


esriLicenseProductCodeBasic


40


Basic Product Code


esriLicenseProductCodeStandard


50


Standard Product Code


esriLicenseProductCodeAdvanced


60


Advanced Product Code

调用方式

以使用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");

?

array.Add(@"D\data\temp.gdb\road_bf30");

?

array.Add(30);

?

GP.Execute("Buffer", array, null);

?

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

private static IGeoProcessor2 GP = new GeoProcessorClass();        // using ESRI.ArcGIS.Geoprocessing;

?

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

?

调试函数

如果参数设置正确,能够输出想要的结果,如果设置错误,则不能输入结果,也不知哪里错了,这是写了一个调试的函数。

/// <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的执行:

//执行工具

?

Execute(GP,buffer,null);    // GP.Execute(buffer, null);

?

运行结果

除了使用IGeoProcessorResult接口获取GP处理结果外,还可以直接将GP的输出结果写入FeatureClass中,方便进行使用。

IGeoProcessorResult的一个重要属性是ReturnValue,用于返回执行结果,使用示例:

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);

注意事项

  • 数据的测试

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

  • 参数有多个值的设置

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

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

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

    union.in_features = " P1; P2";
    
  1. "重分类"分类表设置

有的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,同一类别的上限和下限用空格隔开,不同类别用分号隔开。

  1. "添加XY数据"的查找

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

  1. "添加XY数据"的输出

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

  1. 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;

?

}

?

  1. 参数值的灵活设置

在使用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才比较合适。当然输出单元格大小越小,使用的内存和耗时就更多!

  1. 裁剪栅格的范围参数

裁剪栅格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);

?

} 
时间: 2024-10-11 10:07:37

GP的使用心得的相关文章

windows类书的学习心得(转载)

原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,

GP服务学习笔记(一)

GP服务发布的几个主要步骤: 1.发布地图服务; 2.新建相关脚本; 3.建立模型调用脚本; 4.在发布地图处理服务;5.对发布的地图处理服务进行测试,通过测试之后才进行开发. 学习过程中遇到的问题及心得: 1.一般通过测试之后的地图处理服务,通过ArcGIS API for JavaScript调用的时候一般不会有问题;所以要首先通过测试,避免浪费开发过程中的调试时间; 2.如果通过outputFeatrue=arcpy.getParemeterAsText(5),获取到的输出要素的格式是Te

GP开发示例:数据库去重

这个例子专业讲解基于ArcEngine使用GP开发的过程及遇到的问题.更多GP使用方法:GP使用心得 功能需求:现在外业第一次数据(简称调绘.mdb)和第二次数据(简称检查.mdb)有重复.第二次是在第一次的基础上进行的,即如果调绘.mdb中LCA层有365个要素,检查时发现错误,就删除了11个错误,并新增了43个,共408个,检查.mdb相对于调绘.mdb实际上有354个重复,现在要将重复的删除,mdb中包括点.线.面三种类型的要素类. 软件实现:在ArcGIS里利用工具可以实现,使用按空间位

最近摸索arcgis的一点心得,希望对初来着有些帮助

最近突然想写点东西,记录一下对软件开发上的一些学习心得(其实一直以来都想写点东西,慰藉自己在这些年踩过的坑留点). 主要写三个大方面: 1.  arcgis 记录arcgis for js的开发,涉及:环境部署.arcgis js 图层控制,服务图层查询,动态图层数据查询,标准显示,自定义的infowindow,arcgis 模型, GP服务调用. 2.  .NET. 反射,lamda ,redis,MVC,unity,sokcet 以及几个我常用的设计模式. 3.数据库 触发器.存储过程的编写

Delphi组件indy 10中IdTCPServer修正及SSL使用心得

indy 10终于随着Delphi2005发布了,不过indy套件在我的印象中总是复杂并且BUG不断,说实话,不是看在他一整套组件的面子上,我还是喜欢VCL原生的Socket组件,简洁,清晰.Indy9发展到了indy10几乎完全不兼容,可叹啊.言归正传.在使用IdTCPServer组件的时候发现了他的漏洞,他的OnConnec,OnExecute,OnDisconnect等事件是在其他线程中执行的,通常情况下这没有问题,但是在特殊的情况下会造成问题,如果其他部分的程序写得有问题就会出现漏洞.

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立.发布.测试 第一篇.GP降雨量等值线建模.发布及测试 在水利.气象等行业中,要在WebGIS中实现空间分析功能,如绘制等值线.等高线.等直面.缓冲区等都是经常遇到,经过一段时间的学习和研究,查阅ESRI文档,请教他人,终于可以说是初步实现了等值线功能,这里记录下来详细的操作步骤和图片说明,一方面是对此次努力的总结,另一方面希望也能给后来用到这方面的其他同志们,起个抛砖引玉的作用. 下一篇是关于Silv

Up to 8% free bonus for runescape 2007 gp on Rsorder as july best gift&Enjoy Telos During 7.1-7.22

Now, a small band of freedom fighters struggle to end the osrs gold  long, dark night of Daein's oppression. The big blog news of the day is that Vox Media has acquired Curbed Network. As an amulet you should be wearing an amulet of glory and if you

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

参加老男孩linux培训心得

参加老男孩linux培训心得 时间如白驹过隙,已经不知不觉来到老男孩培训已经三个月了.在这三个月中我渐渐得到了成长,专业技术成长,以及为人处事之道与思想的提高. 我一共就总结以下了三点     一.思想 在我刚来老男孩的时候,老师天天上课前讲一段思想,我当时不太明白,不赶紧上课,讲这干啥呢?而且老师早一点讲完,又可以招下一批学生了,老讲思想,这不是自断财路么?随着时间的流逝,渐渐的我悟懂了点.人在那里都可以学技术,但是学会了技术没有思想,一旦来了新事物,就会接受的很慢.尤其在互联网这个圈子里,软