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服务的更多相关文章

  1. ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)

    一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...

  2. ArcGIS 10.0发布缓存地图服务(详细版)

    1.软件准备ArcGIS Destop10.0,ArcGIS Server10.0,Windows系统下自带的IIS6.0以上服务器 1)安装ArcGIS Destop10.0软件,选择完全安装,安装 ...

  3. ARCGIS 10.1 发布服务问题以及注意事项汇总

    本文会逐渐丰富,并在遇到问题后进行整理进来. 一.了解ArcGIS Server以及如何利用ArcServer发布服务 官方中文帮助文档:http://resources.arcgis.com/zh- ...

  4. ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法

    现象: 前端采用Openlayers,更新Feature时服务器端返回的XML提示更新错误 原因: 参考:http://support.esri.com/en/knowledgebase/techar ...

  5. arcgis api for js入门开发系列十二地图打印(GP服务)

    上一篇实现了demo的地图统计图,本篇新增地图打印,截图如下: (1)地图打印实现的思路如下:首先在创建好地图打印GP模型,设置好模型的参数:其次是验证模型运行模型:然后是发布地图打印的GP服务:最后 ...

  6. arcgis api 3.x for js 入门开发系列十二地图打印GP服务(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  7. 【ArcGIS 10.2新特性】ArcGIS 10.2将PostgreSQL原生数据发布为要素服务

    1.ArcGIS 10.2支持原生数据发布为要素服 有没有将自己已有的空间数据发布为要素服务的需求?有没有将非Esri空间数据类型的数据作为服务在Web端展示的需求?     ArcGIS 10.2 ...

  8. 解决GP服务产生的结果无法自动发布为地图服务的问题

    在ArcGIS for Javascript API或REST API调用GP服务时,常常会遇到这样一种情况:GP服务运行以后,执行成功,也能够生成结果,然而结果并没有直接产生动态的地图服务供API调 ...

  9. ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务

    感谢一路走来默默支持和陪伴的你~~~ -------------------欢迎来访,拒绝转载-------------------- 一.Rest API基础 ArcGIS 平台提供了丰富的REST ...

随机推荐

  1. Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表

    在上一边博客<Web版RSS阅读器(一)——dom4j读取xml(opml)文件>中已经讲过如何读取rss订阅文件了.这次就把订阅的文件读取到页面上,使用树形结构进行加载显示. 不打算使用 ...

  2. SQL Server的备份

    原文:SQL Server的备份 0.参考文献 1.恢复模式 SQL Server 备份和还原操作发生在数据库的恢复模式的上下文中. 恢复模式旨在控制事务日志维护. “恢复模式”是一种数据库属性,它控 ...

  3. 并查集(Union-Find)算法介绍

    原文链接:http://blog.csdn.net/dm_vincent/article/details/7655764 本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构 ...

  4. hdoj 1226 超级password 【隐图BFS】

    称号:hdoj 1226 超级password 分析:这题属于隐式图搜索,状态不是非常明显,须要自己建立. 事实上搜索说白了就是暴力. 这个题目就是,首先对给出的能够组成的全部的数依次枚举.长度从小到 ...

  5. 判断sqlserver对象是否存在

    --查看对象是否已经存在  --数据库是否存在     --if exists (select * from sys.databases where name = ’数据库名’)    --  dro ...

  6. Cocos发育Visual Studio下一个HttpClient开发环境设置

    Cocos2d-x 3.x相关类集成到网络通信libNetwork图书馆project于.这其中包括:HttpClient分类. 我们需要在Visual Studio溶液中加入libNetwork图书 ...

  7. mysql 的load data infile要使用

    LOAD DATA INFILE从文本文件中读出的声明以极高的速度到表. 1.基本语法 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'fi ...

  8. HDU 4793 2013 Changsha Regional Collision[简单的平面几何]

    圆形奖章给定半径的半径和圆形区域.另一个硬币的半径,然后在桌面上平稳.给定硬币的速(的大小和方向,vx,vy)和坐标(奖牌同心圆形区域,圆和心脏为源),Q币在一个圆形区域和多少下滑(不管是什么圆形区域 ...

  9. 饼干怪兽和APT攻击

    APT攻击就像一个孩子,你通过各种方式窃取他们的大脑要拿出饼干,为了防止恶意攻击,过失作为母亲未能发现和防止饼干盗窃贼如.于她仅仅监视厨房椅子.衣柜门或烤箱门的开启.建立起有效防御目标攻击与APT攻击 ...

  10. AIX加入能telnet远程连接方法的帐户

    AIX 加入该账户可以使用命令mkuser 和 SMIT 两种方法,这里有SMIT方式 1.采用root 帐户登录AIX 2.输入 smitty user 3.选择Add a User 4.输入&qu ...