ArcGIS 10.1 发布使用ArcEngine自定义的GP服务
1. 新建立GP模型
在VS2010中新建一个普通的程序及,引入ArcEngine相关的dll。在该DLL中定义一个或多个GP类和一个GP工厂类。GP类要继承IGPFunction2接口,GP工厂类要继承IGPFunctionFactory接口。
下面是各个接口的一些实现方法
|
IGPFunction2 |
|
|
接口 |
接口意义 |
|
UID DialogCLSID { get; } |
对话框的类标识,该方法在实现时直接返回为空即可。 public UID DialogCLSID{ get{ return null; }} |
|
string DisplayName { get; } |
该GP工具显示的名字 显示的名字和FullName中设置的一致。 |
|
IName FullName { get; } |
IGPFunctionName functionName = new GPFunctionNameClass(); functionName.MinimumProduct = esriProductCode.esriProductCodeAdvanced; IGPName name; name = (IGPName)functionName; name.Category = "AreaCalculation0";//分组名称 name.Description = "Calculate Area for FeatureClass0";//GP工具的描述信息 name.DisplayName = "Calculate Area0";//GP工具显示的名称 name.Name = "CalculateArea0";//GP工具的名称 name.Factory = new 所属的工厂类//GP工具所属的工厂类 |
|
int HelpContext { get; } |
帮助文件的上下文 直接返回0即可。 |
|
string HelpFile { get; } |
帮助文件路径,直接返回空字符串即可。 |
|
string MetadataFile { get; } |
元数据文件,返回空字符串即可。 |
|
string Name { get; } |
返回GP工具的名字,名字和fullName中设置的名字一致 |
|
IArray ParameterInfo { get; } |
参数列表,定义系统输入和输出的参数 //定义参数列表 IArray myParameters = new ArrayClass(); //定义一个输入参数 IGPParameterEdit myP1 = new GPParameterClass(); myParameters.Add(myP1); myP1.DataType = new GPFeatureLayerTypeClass(); myP1.Value = new GPFeatureLayerClass(); myP1.Direction = esriGPParameterDirection.esriGPParameterDirectionInput; myP1.DisplayName = "Input Features"; myP1.Name = "Input_Features"; myP1.ParameterType = esriGPParameterType.esriGPParameterTypeRequired; //定义一个输出 IGPParameterEdit myP2 = new GPParameterClass(); myParameters.Add(myP2); myP2.DataType = new GPDoubleTypeClass(); myP2.Direction = esriGPParameterDirection.esriGPParameterDirectionOutput; myP2.ParameterType = esriGPParameterType.esriGPParameterTypeDerived; myP2.DisplayName = "Out FeatureCount"; myP2.DisplayOrder = 0; myP2.Name = "Out_FeatureCount"; return myParameters; |
|
void Execute(IArray paramvalues, ITrackCancel TrackCancel, IGPEnvironmentManager envMgr, IGPMessages message); |
代码执行 //得到第一个参数 IGPParameter parameter = (IGPParameter)paramvalues.get_Element(0); //IGPValue parameterValue = m_GPUtilities.UnpackGPValue(parameter); // 获取参数值 IFeatureClass inputFeatureClass; IQueryFilter qf; m_GPUtilities.DecodeFeatureLayer(parameterValue, out inputFeatureClass, out qf); if (inputFeatureClass == null) { message.AddError(2, "Could not open input dataset."); return; } // 下面就是处理逻辑的代码了 int indexA; parameter = (IGPParameter)paramvalues.get_Element(1); string field = parameter.Value.GetAsText(); indexA = inputFeatureClass.FindField(field); if (indexA < 0) { IFieldEdit fieldEdit = new FieldClass(); fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; fieldEdit.Name_2 = field; inputFeatureClass.AddField(fieldEdit); } int featcount = inputFeatureClass.FeatureCount(null); //设置进度信息 IStepProgressor pStepPro = (IStepProgressor)trackcancel; pStepPro.MinRange = 0; pStepPro.MaxRange = featcount; pStepPro.StepValue = (1); pStepPro.Message = "Calculating Area0"; pStepPro.Position = 0; pStepPro.Show(); // Create an Update Cursor indexA = inputFeatureClass.FindField(field); IFeatureCursor updateCursor = inputFeatureClass.Update(qf, false); IFeature updateFeature = updateCursor.NextFeature(); IGeometry geometry; IArea area; double dArea; while (updateFeature != null) { geometry = updateFeature.Shape; area = (IArea)geometry; dArea = area.Area; updateFeature.set_Value(indexA, dArea); updateCursor.UpdateFeature(updateFeature); updateFeature.Store(); updateFeature = updateCursor.NextFeature(); pStepPro.Step(); } pStepPro.Hide(); //释放资源 System.Runtime.InteropServices.Marshal.ReleaseComObject(updateCursor); |
|
object GetRenderer(IGPParameter pParam); |
根据指定的参数返回自定义的渲染器 实现时 返回Null即可。 |
|
bool IsLicensed(); |
验证许可是否通过 IAoInitialize aoi = new AoInitializeClass(); ILicenseInformation licInfo = (ILicenseInformation)aoi; string licName = licInfo.GetLicenseProductName(aoi.InitializedProduct()); if (licName == "Advanced") { return true; } else { return false; } |
|
void UpdateMessages(IArray paramvalues, IGPEnvironmentManager pEnvMgr, IGPMessages Messages |
给定参数值之后,验证参数信息,并设置返回的消息 IGPMessage msg = (IGPMessage)Messages; if (msg.IsError()) return; // Get the first Input Parameter IGPParameter parameter = (IGPParameter)paramvalues.get_Element(0); // UnPackGPValue. This ensures you get the value either form the dataelement or GpVariable (ModelBuilder) IGPValue parameterValue = m_GPUtilities.UnpackGPValue(parameter); // Open the Input Dataset - Use DecodeFeatureLayer as the input might be a layer file or a feature layer from ArcMap. IFeatureClass inputFeatureClass; IQueryFilter qf; m_GPUtilities.DecodeFeatureLayer(parameterValue, out inputFeatureClass, out qf); IGPParameter3 fieldParameter = (IGPParameter3)paramvalues.get_Element(1); string fieldName = fieldParameter.Value.GetAsText(); // Check if the field already exists and provide a warning. int indexA = inputFeatureClass.FindField(fieldName); if (indexA > 0) { Messages.ReplaceWarning(1, "Field already exists. It will be overwritten."); } return; |
|
void UpdateParameters(IArray paramvalues, IGPEnvironmentManager pEnvMgr); |
更新输入参数 m_Parameters = paramvalues; // Retrieve the input parameter value IGPValue parameterValue = m_GPUtilities.UnpackGPValue(m_Parameters.get_Element(0)); // Get the derived output feature class schema and empty the additional fields. This will ensure you don't get duplicate entries. IGPParameter3 derivedFeatures = (IGPParameter3)paramvalues.get_Element(2); IGPFeatureSchema schema = (IGPFeatureSchema)derivedFeatures.Schema; schema.AdditionalFields = null; // If we have an input value, create a new field based on the field name the user entered. if (parameterValue.IsEmpty() == false) { IGPParameter3 fieldNameParameter = (IGPParameter3)paramvalues.get_Element(1); string fieldName = fieldNameParameter.Value.GetAsText(); // Check if the user's input field already exists IField areaField = m_GPUtilities.FindField(parameterValue, fieldName); if (areaField == null) { IFieldsEdit fieldsEdit = new FieldsClass(); IFieldEdit fieldEdit = new FieldClass(); fieldEdit.Name_2 = fieldName; fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; fieldsEdit.AddField(fieldEdit); // Add an additional field for the area values to the derived output. IFields fields = fieldsEdit as IFields; schema.AdditionalFields = fields; } } |
|
IGPMessages Validate(IArray paramvalues, bool updateValues, IGPEnvironmentManager envMgr); |
验证信息 if (m_Parameters == null) m_Parameters = ParameterInfo; // Call UpdateParameters(). // Only Call if updatevalues is true. if (updateValues == true) { UpdateParameters(paramvalues, envMgr); } // Call InternalValidate (Basic Validation). Are all the required parameters supplied? // Are the Values to the parameters the correct data type? IGPMessages validateMsgs = m_GPUtilities.InternalValidate(m_Parameters, paramvalues, updateValues, true, envMgr); // Call UpdateMessages(); UpdateMessages(paramvalues, envMgr, validateMsgs); // Return the messages return validateMsgs; |
|
IGPFunctionFactory |
|
|
方法 |
说明 |
|
string Alias { get; } |
别名 |
|
UID CLSID { get; } |
public UID CLSID { get { UID id = new UIDClass(); //后面的B很重要 id.Value = this.GetType().GUID.ToString("B"); return id; } } |
|
string Name { get; } |
名称 |
|
IGPFunction GetFunction(string Name); |
根据GP的名称得到GP对象 |
|
IEnumGPEnvironment GetFunctionEnvironments(); |
如果没有设置全局环境的话,可以返回null。 |
|
IGPName GetFunctionName(string Name); |
根据名称返回GPName,就是返回GP的 FullName 每次调用都重新实例化对象返回即可 |
|
IEnumGPName GetFunctionNames(); |
返回这个工厂所包含的GPName 每次调用都重新实例化对象返回即可 |
2. DLL注册
把代码编译成dll,如果在机器上已经安装了ArcGIS Desctop,鼠标右键点击dll文件,出现[register]按钮,点击该按钮,系统会弹出注册对话框,对话框如下:

点击注册按钮即可完成注册。
注册完毕后,打开ArcCatalog,在自定义的ToolBox中右键点击添加Tool按钮,就可以把刚才我们注册的dll中包含的GP工具添加到ToolBox中。

点击Tool菜单按钮后,出现选择Gp工具对话框,如下图所示:

打勾的就是我们自己发布的GP工具,点击确定,即可添加到自定义的ToolBox中。

双击一个工具即可使用。

3. 如果发布GP服务
ArcGIS 10.1为了保证发布的GP服务能够正确运行,只能在运行一次后,在运行结果里面点击该工具进行发布。我们运行一下我们开发的GP工具,该GP工具的功能是得到一个要素类中的要素的个数。

点击[OK]按钮。

运行结果界面如上图所示,输出参数 FeatureCount的值是5,也就是说刚才我们选的文件中有5个要素。
下面右键点击界面上的工具,发布GP服务。如下图所示:

点击按钮,弹出发布对话框

选择是发布一个服务,还是保存成一个服务文件,还是覆盖现有的服务。我们选择发布一个新的服务,点击下一步。

选择要发布的服务器服务和设置服务的名称,点击下一步。

选择发布的目录,是在根目录下,还是在某个文件夹下面,也可以自己新建文件夹。点击继续。

在这儿设置一下发布的参数,在点击最后一个按钮发布的时候,系统会检查我们填写信息的完整性,如果不完整,系统会给出提示,按照提示修改即可。

上面就是我们没做任何修改,点击发布时,系统提示的错误信息。一个是缺少描述信息,;另一个错误我也不知道咋回事,但设置完一些描述信息后,错误和警告都没了。
点击分析看下有没有错误,没有的话 点击发布即可。

任务发布成果后提示的信息。

在ArcServer的服务管理界面,我们就可以看到我们发布的服务。

下面查看下服务。

在浏览器中查看。

ArcGIS 10.1 发布使用ArcEngine自定义的GP服务的更多相关文章
- ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)
一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...
- ArcGIS 10.0发布缓存地图服务(详细版)
1.软件准备ArcGIS Destop10.0,ArcGIS Server10.0,Windows系统下自带的IIS6.0以上服务器 1)安装ArcGIS Destop10.0软件,选择完全安装,安装 ...
- ARCGIS 10.1 发布服务问题以及注意事项汇总
本文会逐渐丰富,并在遇到问题后进行整理进来. 一.了解ArcGIS Server以及如何利用ArcServer发布服务 官方中文帮助文档:http://resources.arcgis.com/zh- ...
- ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法
现象: 前端采用Openlayers,更新Feature时服务器端返回的XML提示更新错误 原因: 参考:http://support.esri.com/en/knowledgebase/techar ...
- arcgis api for js入门开发系列十二地图打印(GP服务)
上一篇实现了demo的地图统计图,本篇新增地图打印,截图如下: (1)地图打印实现的思路如下:首先在创建好地图打印GP模型,设置好模型的参数:其次是验证模型运行模型:然后是发布地图打印的GP服务:最后 ...
- arcgis api 3.x for js 入门开发系列十二地图打印GP服务(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 【ArcGIS 10.2新特性】ArcGIS 10.2将PostgreSQL原生数据发布为要素服务
1.ArcGIS 10.2支持原生数据发布为要素服 有没有将自己已有的空间数据发布为要素服务的需求?有没有将非Esri空间数据类型的数据作为服务在Web端展示的需求? ArcGIS 10.2 ...
- 解决GP服务产生的结果无法自动发布为地图服务的问题
在ArcGIS for Javascript API或REST API调用GP服务时,常常会遇到这样一种情况:GP服务运行以后,执行成功,也能够生成结果,然而结果并没有直接产生动态的地图服务供API调 ...
- ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务
感谢一路走来默默支持和陪伴的你~~~ -------------------欢迎来访,拒绝转载-------------------- 一.Rest API基础 ArcGIS 平台提供了丰富的REST ...
随机推荐
- 玩转Linux之- CentOS 7.0,启用iptables防火墙
原文 玩转Linux之- CentOS 7.0,启用iptables防火墙 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall:sy ...
- Git 1.9.5.msysgit.1
Git 1.9.5.msysgit.1 发布,现已提供下载:https://github.com/msysgit/git/archive/v1.9.5.msysgit.1.zip. Git是一个开源的 ...
- sql小总结2
SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录.这意味着该字段将以 NULL 值保存. NULL 值的处理方式与其他值不同. NULL ...
- 【超酷超实用】CSS3可滑动跳转的分页插件制作教程
原文:[超酷超实用]CSS3可滑动跳转的分页插件制作教程 今天我要向大家分享一款很特别的CSS3分页插件,这款分页插件不仅可以点击分页按钮来实现分页,而且可以滑动滑杆来实现任意页面的跳转,看看都非常酷 ...
- awk学习总结(两) How awk works and awk CMD in a file
测试文件names Tom Savage 100 Molly Lee 200 John Doe 300 $0 代表file的整行; $1,第一列;$2,第二列...... $ awk '/Tom/{p ...
- 大数据系列修炼-Scala课程03
前言 今天上班看了很多关于前端js,jQuery.bootstrap.js以及springMVC看得迷迷糊糊的,毕竟以前很少去学习前端的技术,所有看得有点困,还好看得比较多,回家后也开始学习关于Sca ...
- Android dumpsys命令的使用
Android提供的dumpsys工具能够用于查看手机中的应用程序和系统服务信息与状态,手机连接电脑后能够直接命令行运行adb shell dumpsys 查看全部支持的Service可是这样输出的太 ...
- Mysql编写定时任务事件
原文:Mysql编写定时任务事件 场景: 例如:某系统,用户每天只能拥有一次的抽奖机会,抽过后当天就不可再抽,但是过了24:00点后用户就重新拥有一次抽奖机会.像这种需要数据库定时对某个字段进行更新操 ...
- 远程数据client交换器
不太繁忙的文本. 要被写入
- hdoj 1226 超级password 【隐图BFS】
称号:hdoj 1226 超级password 分析:这题属于隐式图搜索,状态不是非常明显,须要自己建立. 事实上搜索说白了就是暴力. 这个题目就是,首先对给出的能够组成的全部的数依次枚举.长度从小到 ...