第一次使用ArcGIS API,也是第一次使用ArcGIS Server的GPServer的调用,遇到比较多的困难,现在记录下来。
Step1:通过ArcGIS Desktop建立自己的Model,至于如何设置Model、要将哪些内容设置为参数,如何设置得到自己想要的参数类型就需要自己探索,百度一下,也会有很全面的教程,此处不再赘述。
Step2:通过ArcGIS API for Javascript调用GPServer,步骤如下:(摘录自:ArcGIS 帮助10.1:ArcGIS 帮助 10.1)
Step2.1:初始化地理处理任务。
gpTaskURL = http://localhost:6080/arcgis/rest/services/MDLInter/GPServer/interpolation;
gpTask = new esri.tasks.Geoprocessor(gpTaskURL);
//一定要设置Geoprocessor的输出空间参考
gpTask.outSpatialReference = map.spatialReference;
Step2.2:设置任务参数。
//设置任务参数,对于每一个参数如何设置,可以参考 ArcGIS 帮助10.1:ArcGIS 帮助 10.1
var params = {"Z_value_field": inputFeatures, "testinter": "aqi"};
Step2.3:运行任务。
dojo.connect(gpTask, "onJobComplete", onTaskComplete);
dojo.connect(gpTask, "onError", onTaskFailure);
dojo.connect(gpTask, "onStatusUpdate", onTaskStatus);
gpTask.submitJob(params);
function onTaskComplete(jobInfo) {
dojo.connect(gpTask, "onGetResultDataComplete",onTaskResultComplete);
gpTask.getResultData(jobInfo.jobId, "Mask");
}
function onTaskStatus(jobInfo) {
console.log(jobInfo.jobStatus);
}
function onTaskFailure(error) {
alert("Error:" + error);
}
function onTaskResultComplete(paramResult) {
var featureSet = paramResult.value;
var taskResultLayer = new esri.layers.GraphicsLayer ({id: "MyGPSubmitJobResultLayer"});
dojo.forEach(featureset.features, function(feature) {taskResultLayer.add(feature);});
esri.map.map.addLayer(taskResultLayer);
}
Step2.4:渲染结果。
Step3:遇到问题
Q1:代理的问题。如我发的帖子:
arcgis api的GP服务调用中出现问题,如图-CSDN论坛
A1:百度了一下,应该是设置代理出现的问题。设置代理的所有问题可以自行参考官网(
Using the proxy | Guide | ArcGIS API for JavaScript 3.40 | ArcGIS Developer)的解说,不过解说是英文版的,英语比较挫的我还真是有点头疼。
A1.1如何得到代理所需的proxy包,Download the appropriate proxy for your platform from
GitHub(
https://github.com/Esri/resource-proxy/releases).
A1.2如何使用proxy包,在下载的包中,针对不同的语言有不同的包,读取这个包下面对应的ReadMe文件,很容易了解其使用方法,本人方法如下:
A1.2.1 将java对应的包拷贝至apache tomcat的目录下,一定记得重新启动tomcat,不然很可能没有办法访问。
A1.2.2 通过浏览器访问:
http://[yourmachine]/Java/proxy.jsp?http://services.arcgisonline.com/ArcGIS/rest/services/?f=pjson
A1.2.3 编辑proxy.config文件,设置自己的代理。
<serverUrls>节点下添加一个子节点<serverUrl >,设置属性url:如果你的web程序用到大于两个服务(下面"二、"说的七种服务)的话 url=http://你的IP地址/arcgis/rest/services/;如果是web程序用到一个服务的话:url=http://你的IP地址/arcgis/rest/services/MyMapService/MapServer 。如果你不是用本地的服务的话你可以不做修改(因为它里面已经有ESRI发布的相关服务的URL了)
A1.2.4 在Javascript代码中使用代理:
//下面这段代码我添加在了Step2.1代码的前面
esri.config.defaults.io.proxyUrl =
http://localhost:8080/esriproxy/proxy.jsp;
esri.config.defaults.io.alwaysUseProxy = false;//此处用true还是false请自己去查咯~
Q2:参数设置的问题
A2:我用到的是GPFeatureRecordSetLayer类型的一个变量,通过FeatureSet来传递参数,通过esri.tasks.FeatureSet(json)来设置参数(参考
http://gis.jl.gov.cn/Portal/api/JS/help/jsapi/featureset.htm#FeatureSetConst2),其中json包括的内容有:
<String> displayFieldName
<
Graphic[]> features
<Object> fieldAliases
<String> geometryType
<
SpatialReference> spatialReference
Q3:Error:Unable to Opearate。
Messages:esriJobFailed
A3:根据jobStatus类型判断,发现esriJobFailed的错误,(参考
ArcGIS 帮助 10.1)