当GP的输出类型是Raster时,那么这个GP工具发布的GP服务就只能在ArcGIS Desktop客户端调用,怎样可以在其他客户端使用呢?从http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#/na/002v00000004000000/里可以知道,提供了将GP以结果地图服务进行发布这种方法。
本文以Natural Neighbor这个GP工具为例,展现一下整个操作流程。
第一部分:发布服务
1 创建目录结构
http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Managing_the_jobs_directory/002v0000000m000000/
2 构建模型
将Natural Neighbor这个GP工具拖到Model里,然后设置点图层为输入参数。
其中,output的设置方法如下。在对output进行设置的时候,如果最后的结果不需要渲染,可以直接设置成“%scratchworkspace%/output”,不需要设置最后输出栅格数据的格式(如.tif)。
3 设置工作空间
在ArcToolBox的空白处单击右键,选择“Enviornments”,然后将“workspace”展开,将当前工作空间(Current Workspace)和临时工作空间(Scratch Workspace)指向在第一步创建的工作目录里。
4 配置渲染文件
第一步在ArcMap里运行已经构建好的GP工具,结果图层output会自动加载进ArcMap里。
第二步对output图层进行渲染,然后另存为.lyr文件(假如取名为output-config.lyr)。
第三步打开GP工具,在output上单击右键,选择“Properties”,然后单击“Layer Symbology”,将第二步保存的lyr添加进来。进行保存。
5 准备发布的数据。
再次运行这个GP工具,然后将GP工具直接拖到TOC上,那么这个GP工具就会以图层的形式存在。点击“保存“,命名为“gprater.mxd”。这里需要注意的是,一定要以相对路径进行存储。
6发布服务
两种方式。第一种直接在ArcGIS Catalog里,找到gprater.mxd这个地图文档,单击右键,选择“Publish to ArcGIS Server”,在第二步将“Geoprocessing”勾选上,剩下的选默认参数就可以了。第二种采用“Add New Service”方式,服务类型选“Geoprocessing Service”,在第二步的时候,将“gprater.mxd”添加进来。
在发布服务这一环节,经测试,只能选异步方式,不能选同步方式。
第二部分:测试服务
在GP工具发布服务成功之后,需要对其发布的服务进行测试。
测试分为两个部分:
1打开ArcMap,加载测试数据ZPts.shp(测试的点图层)。然后将发布后的GP服务里的工具添加进ArcToolbox里,运行这个GP工具。
2在rest环境下测试。
http://localhost/ArcGIS/rest/services/gprater/GPServer/Model
选择“Submit Job”,输入测试数据
然后选择“Submit Job(GET)”.
Job Messages:
· esriJobMessageTypeInformative: Submitted.
· esriJobMessageTypeInformative: Executing...
· esriJobMessageTypeInformative: Succeeded.
第三部分:调用GP服务
环境:VS2010+Silverlight API for ArcGIS 2.1
a.txt放的是测试数据,放置路径是C:/inetpub/wwwroot。
Geoprocessor _geoprocessorTask;
public MainPage()
{
InitializeComponent();
}
private void button1_Click(object sender,RoutedEventArgs e)
{
_geoprocessorTask = new Geoprocessor("http://lius/ArcGIS/rest/services/gprater/GPServer/Model");
List<GPParameter> parameters =new List<GPParameter>();
parameters.Add(new GPFeatureRecordSetLayer("ZPts", "http://localhost/a.txt"));
_geoprocessorTask.SubmitJobAsync(parameters);
_geoprocessorTask.JobCompleted += new EventHandler<JobInfoEventArgs>(_geoprocessorTask_JobCompleted);
_geoprocessorTask.Failed += GeoprocessorTask_Failed;
}
private void _geoprocessorTask_JobCompleted(object sender,JobInfoEventArgs e)
{
Geoprocessor geoprocessorTask = sender as Geoprocessor;
geoprocessorTask.GetResultDataCompleted += GeoprocessorTask_GetResultDataCompleted;
geoprocessorTask.GetResultDataAsync(e.JobInfo.JobId, "output");
}
private void GeoprocessorTask_GetResultDataCompleted(object sender,GPParameterEventArgs e)
{
Geoprocessor geoprocessorTask = sender as Geoprocessor;
_geoprocessorTask.GetResultImageLayerAsync(geoprocessorTask.SubmitJobLastResult.JobId, e.Parameter.Name);
_geoprocessorTask.GetResultImageLayerCompleted += new EventHandler<GetResultImageLayerEventArgs>(_geoprocessorTask_GetResultImageLayerCompleted);
}
void _geoprocessorTask_GetResultImageLayerCompleted(object sender,GetResultImageLayerEventArgs e)
{
GPResultImageLayer mGPResultImageLAyer = e.GPResultImageLayer;
MyMap.Layers.Clear();
MyMap.Layers.Add(mGPResultImageLAyer);
}
private void GeoprocessorTask_Failed(object sender,TaskFailedEventArgs e)
{
MessageBox.Show( e.Error.ToString());
}