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

原创 2016年08月28日 17:08:17
     最近由于在项目中要实现动态插值分析,于是通过在网上大量查阅,借鉴前辈们的工作经验并结合自己对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模型创建及服务发布

ArcGIS的GP模型以Toolbox工具箱大量的函数为基础,能够让用户方便定制所需要的功能,当然,大多数时候仅仅通过模型构建器的拖拽是不够的,需要自行编写Python代码,接下来通过一个极其简单的例...

ArcGIS API for javascript开发笔记(四)——GP服务调用之GP模型的规范化制作详解

感谢一路走来默默陪伴和支持的你~~~ -------------------欢迎来访,拒绝转载------------------- 在之前的利用Python分析GP服务运行结果的输出路径 & ...

ArcGIS API for javascript开发笔记(七)——使用ArcGIS API for javascript调用GP服务

一、             rest执行GP服务测试 在上一篇博客中已经介绍了通过Rest API调用GP服务的方法,不再赘述,点我回顾! 测试界面: Rest测...

(八)ArcGIS API For Javascript调用GP服务

引言 ArcGIS API调用GP服务 1代码实现 2 运行代码发现错误 3修改错误 4 全部代码 1.引言      ArcGIS API中关于GP服务的调用是比较容易出错的,出...

使用ArcGIS GP服务之五 JavaScript的调用

使用前的了解          这是上一个博客留下的最后一张图,GP的服务目录,我们通过点击Tasks下面的一个链接地址进入。这个地址,需要记住,这将是GP服务的地址,需要写在代码里面的。  ...

使用ArcGIS GP服务之五 JavaScript的调用

使用前的了解          这是上一个博客留下的最后一张图,GP的服务目录,我们通过点击Tasks下面的一个链接地址进入。这个地址,需要记住,这将是GP服务的地址,...

Silverlight调用GP服务第二篇之调用GP服务(Geoprocessing Service)过程详解

Silverlight调用GP服务详解 上一篇主要讲了如何发布GP服来绘制等值线及等直面,这里主要将如何通过Silverlight来调用GP服务。 这里先写一下具体的调用过程: 声明GP服务...

ArcGIS API for javascript开发笔记(五)——GP服务调用之GP模型的发布及使用详解

感谢一路走来默默陪伴和支持的你~~~ ----------------欢迎来访,拒绝转载---------------- 关于GP模型的制作请点我! 一、GP发布 ArcGIS Desktop可以作...

腾讯公司有十周年庆典活动吗NET腾讯公司QQ十周年庆典活动热线是

★腾 讯 备 案 电 话【0755十3303十7551】抽 奖 二 线【95013十2195十0586】活 动 热线★抽奖腾讯备案电话【"075533十037十551""℡】抽 奖 二 线【"0755...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)