基于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服务实现插值分析的例子就实现了。
相关文章推荐
- ArcGIS API for JavaScript开发笔记(二)GP服务REST调用
- 如何用javascript api for arcgis调用有参数的GP服务
- ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务
- ArcGIS API for javascript开发笔记(七)——使用ArcGIS API for javascript调用GP服务
- ArcGIS API for javascript开发笔记(五)——GP服务调用之GP模型的发布及使用详解
- ArcGISServer Flex API 调用GP服务实现服务区分析(转帖)
- ArcGIS API for javascript开发笔记(五)——GP服务调用之GP模型的发布及使用详解
- ArcGIS API for javascript开发笔记(四)——GP服务调用之GP模型的规范化制作详解
- ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务
- ArcGISServer Flex API 调用GP服务实现服务区分析
- (三)ArcGIS API For Javascript之调用动态地图服务
- (八)ArcGIS API For Javascript调用GP服务
- ArcGIS API For Javascript之调用动态地图服务+属性、空间查询
- ArcGIS API for javascript开发笔记(四)——GP服务调用之GP模型的规范化制作详解
- ArcGIS API for Javascript和GP服务调用
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现点、线、面的buffer分析(十一)
- ArcGIS API for Silverlight 调用GP服务加载等值线图层
- 基于ArcGIS API for JavaScript的统计图表实现
- ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能
- ArcGIS API for Silverlight 调用GP服务绘制等值面