您的位置:首页 > Web前端 > JavaScript

基于ArcGIS API For JavaScript调用GP服务实现动态插值分析实现

2016-08-28 17:08 821 查看
最近由于在项目中要实现动态插值分析,于是通过在网上大量查阅,借鉴前辈们的工作经验并结合自己对ArcMap中插值工具的使用理解,
捣鼓出了基于ArcGIS API For JavaScript实现动态插值分析的路线,再此记录下来,以供学习交流。

首先,要在Web上实现动态插值分析,就不得不提到GP Service(地理处理服务),据ArcGIS Help中提到的概念,地理处理服务是借助于
万维网来展示 ArcGIS 强大分析功能的方式。地理处理服务包含地理处理任务,任务采用在 Web 应用程序中捕获的简单数据,对其进行处理,
然后以如下形式返回有意义且有用的输出:要素、地图、报表及文件。任务可以计算危险化学泄漏物的可能疏散区、逐渐增大的飓风的预测踪迹
和强度、用户定义的分水岭内土地覆被和土壤报表、包含所有权历史详细信息的宗地地图或污水处理系统的许可应用。这些服务的可能性是
无穷的。在ArcGIS Server发布后,让在Web系统中使用ArcGIS强大的地理分析功能变成了可能,通过调用GP服务来实现一些地理处理功能就是一个
很好的例子。

以文章主题为例,通过ArcGIS API For JavaScript实现含障碍的核插值法的实现主要由以下几个步骤构成:
1.通过ModelBuild建立含障碍的核插值法模型;
2.将上述模型验证,运行成功后共享为GP服务;
3.通过ArcGIS API For JavaScript在Web前端调用GP服务,执行插值分析,得到结果。


下面详细阐述各个步骤的方法和注意事项:

1.通过ModelBuild建立含障碍的核插值法模型

通过在ArcMap工具栏中选择地理处理-》模型构建器,弹出模型编辑器窗口,在系统工具箱中选择Geostatiscal Analyst Tools中的插值分析,将含障碍的核插值法拖到模型编辑器窗口中,如下图:



这个时候,整个模型的还是黑白的,表示模型还不可用,主要是缺少参数,我们在ArcMap中使用核插值方法的时候需要的参数如下图所示:



这时,我们设置相应的模型参数,并将输入数据指定为模型参数,其中点数据集创建为要素集,然后从工具

中选择从模型参数获取变量Z值字段,点击模型验证即可出现下面带色的模型图:



2.将上述模型验证,运行成功后共享为GP服务;

将该模型保存到工具箱中,运行成功后即可发布GP服务。这里要注意的是只有当创建的Model运行成功后

才能发布GP服务,在Model运行结束后,点击地理处理-》结果,在结果查看中会显示当前的执行Model的会话,右键选择共享为地理处理服务即可进行GP服务的发布。整个服务发布过程和MapServer服务发布类

似,注意在参数填写这块要尽量不使用中文地段。



模型的GP服务发布成功后,和查看MapServer一样,会有一个以GPServer结尾的地址,例如:

http://127.0.0.1:6080/arcgis/rest/services/CZFX/GPServer. 在浏览器上输入该地址得到如下结果:



图中的Tasks就是我们插值分析的任务名称,点击后可以看到GP服务详情:



图中的参数名称就是在代码中为GP服务传递参数的名称,一定要准确。

以上服务发布好后,接下来要做的就是如何通过代码调用GP服务来进行插值分析了。

* 3.通过ArcGIS API For JavaScript在Web前端调用GP服务*

通过ArcGIS API For JavaScript调用GP服务实现插值分析代码在前端执行,下面上代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Create a Map</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_v39_sdk/arcgis_js_api/library/3.9/3.9/js/dojo/dijit/themes/tundra/tundra.css"/>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_v39_sdk/arcgis_js_api/library/3.9/3.9/js/esri/css/esri.css" />
<script type="text/javascript" src="http://localhost/arcgis_js_v39_sdk/arcgis_js_api/library/3.9/3.9/init.js"></script>
<script type="text/javascript">
dojo.require("esri.map");
dojo.require( "esri/layers/ArcGISDynamicMapServiceLayer");
dojo.require("esri/layers/FeatureLayer");
dojo.require("esri/tasks/Geoprocessor");
dojo.require("esri/config");
dojo.require("esri/tasks/query");
dojo.require("esri/tasks/QueryTask");
dojo.require("esri/tasks/FeatureSet");
dojo.require("esri.tasks.gp");

esriConfig.defaults.io.proxyUrl = "/proxy.ashx";
var mapserviceurl="http://127.0.0.1:6080/arcgis/rest/services/NXMap/MapServer";
var myMap;
var gp;

function init() {
myMap = new esri.Map("map");
var gpServiceUrl = "http://127.0.0.1:6080/arcgis/rest/services/CZFX/GPServer/CZFX";

var myTiledMapServiceLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://127.0.0.1:6080/arcgis/rest/services/NXMap/MapServer");
var myYNPointServiceLayer=new esri.layers.ArcGISDynamicMapServiceLayer("http://127.0.0.1:6080/arcgis/rest/services/QTXPoint/MapServer");
myMap.addLayer(myTiledMapServiceLayer);
myMap.addLayer(myYNPointServiceLayer);

var query = new esri.tasks.Query();
var queryTask = new esri.tasks.QueryTask("http://127.0.0.1:6080/arcgis/rest/services/QTXPoint/MapServer/0");
query.returnGeometry = true;
query.outFields = ["*"];
query.outSpatialReference = { "wkid": 21478 };
query.where = "X_80>0";
queryTask.execute(query, function (fs) {
var featureSet = fs;
gp = new esri.tasks.Geoprocessor(gpServiceUrl);
//设置GP服务参数
var params = {
YNPoint_shp : featureSet,
ZValue : "有机质1"
};
//cleanup any results from previous runs
//cleanup();
gp.submitJob(params, gpJobComplete, gpJobStatus, gpJobFailed);
});
}

//GP完成之后加载结果图层
function gpJobComplete(jobinfo) {
//construct the result map service url using the id from jobinfo we'll add a new layer to the map
/*var mapurl = mapserviceurl + "/" +jobinfo.results.BufferResult_shp;
alert(mapurl);
var hotspotLayer = new esri.layers.ArcGISDynamicMapServiceLayer(mapurl, {
"id": "bufferlayer"
});*/

//gp.getResultData(jobinfo.jobId,"fx",addResults);
//add the hotspot layer to the map
//myMap.addLayers([hotspotLayer]);

var mapserviceurl = "http://127.0.0.1:6080/arcgis/rest/services/QTXPoint/MapServer";
var mapurl = mapserviceurl + "/" + jobinfo.jobId;

var resultlayer = new esri.layers.ArcGISDynamicMapServiceLayer(mapurl,{
"opacity":0.7
});
var imageParam = new esri.layers.ImageParameters();
imageParam.imageSpatialReference = new esri.SpatialReference({wkid:21478});
imageParam.transparent = true;
gp.getResultImageLayer(jobinfo.jobId,"fx",imageParam,getResultImaLayer);
}

//取回结果图层
function getResultImaLayer(gpLayer){

gpLayer.setOpacity(0.5);
//alert(myMap.layerIds.length+"个图层");
myMap.addLayer(gpLayer,2);
//alert(myMap.layerIds.length+"个图层");

}

/*for(var f = 0, fl = features.length; f < fl; f++) {
var feature = features[f];
var polySymbolRed = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 12, new esri.symbol.SimpleLineSymbol(esri.symbol.        SimpleLineSymbol.STYLE_SOLID, new dojo.Color([204, 102, 51]), 1), new dojo.Color([158, 184, 71, 1]));
feature.setSymbol(polySymbolRed);
alert(myMap.graphics[0]);
myMap.graphics.add(feature);
alert(myMap.graphics.length);
}*/
}
//获得GP运行状态
function gpJobStatus(jobinfo) {
var jobstatus = '';
switch (jobinfo.jobStatus) {
case 'esriJobSubmitted':
jobstatus = 'Submitted...';
break;
case 'esriJobExecuting':
jobstatus = 'Executing...';
break;
case 'esriJobFailed':
jobstatus = 'Failed...';
break;
case 'esriJobSucceeded':
jobstatus = 'Succeeded...';
break;
}
alert(jobstatus);
}
//获得GP失败信息
function gpJobFailed(error) {
alert(error);
}

dojo.addOnLoad(init);
</script>
</head>
<body>
<div id="map" style="width:1900px; height:1000px; border:1px solid #000;">
<span id="status" style='position:absolute;bottom:5px;'></span>
</div>
</body>
</html>


执行成功后,结果如下图所示:



综上,通过ArcGIS API For JavaScript调用GP服务实现插值分析的例子就实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript api 经验 工作
相关文章推荐