gp 服務的發布與javascript調用


最近在學習ArcGIS 10.1 for Server 相關的知識,其中的一個必然掌握的知識點,就是服務的發布與使用。在ArcGIS Server 10.1 支持多種服務,包括:地圖服務,影像服務等,而gp服務是日常使用最為廣泛的服務。

擴展閱讀:Esri的server的官方幫助中的服務類型的內容 http://resources.arcgis.com/zh-CN/help/main/10.1/#/na/01540000042s000000/

目標

使用Desktop建立gp 模型。該模型實現創建buffer的功能。通過server發布gp服務,並通過js api在web前端調用發布的GP服務,在頁面點擊,生成鼠標點的buffer。

軟件環境

本文使用的環境為:ArcGIS 10.1 for Desktop, ArcGIs 10.1 for Server,ArcGIS 10.1 Server for javasScript 3.3,vs 2010

步驟

一、gp的建立

1.什么gp

gp是geoprocessing,即地理處理。gp提供一系列的工具,能夠處理包括從簡單的緩沖區分析,面疊加到復雜的諸如回歸分析和影像分類等GIS任務。可以參考Esri的官方文檔中的什么是地理處理:http://resources.arcgis.com/zh-CN/help/main/10.1/#/na/002s00000001000000/。

擴展閱讀:ArcGIS Desktop中的gp框架http://210.43.24.222/chy/3sbase/news/?909.html

2.如何建立gp

gp工具由三種方式創建:模型編輯器,python腳本和使用AML。

擴展閱讀:gp的手工建立流程 http://www.cnblogs.com/gisangela/archive/2011/01/06/1927702.html

               http://210.43.24.222/chy/3sbase/news/?910.html

tips:輸入參數的選擇。dataTyp是選擇featury Layer 還是其他,本文因涉及到與地圖的交互,故將dataType 設置為feature set。如果dataType為feature Layer 則默認對圖層中的所有要素進行緩沖操作。

    圖1 輸入參數屬性對話框

擴展閱讀:gp中的參數,http://blog.csdn.net/arcgisserver_book/article/details/7855748

二、模型的發布

      ArcGIS 10.1 for Server中的gp服務的發布是在result窗口發布gp服務結果,即通過對話框的形式(在模型編輯器中運行模型不會在結果窗口產出結果)運行模型。

 圖2 模型對話框

運行后,在result窗口(在菜單geoprocessing中點擊results彈出窗口)中查看結果狀態。如果出現waring和erro,記得對模型進行調試,直到可以出現預期的輸出。

圖 3 模型運行結果窗口

      在results窗口的模型右鍵 share as -GeoProcessing Service,發布gp服務。

  tips:在發布gp方式時,應該指定服務調用的方式,是異步還是同步方式,如圖中的Execution Mode。關系到調用方式。

圖4 服務發布參數設置

擴展閱讀:gp服務發布前的准備http://210.43.24.222/chy/3sbase/news/?911.html

三、gp服務的測試

      gp服務發布后。最好在服務器端,對gp服務進行測試,將測試結果與本地的結果做比較,如果兩者無差異,即gp服務才算發布成功。

      

圖 5 Desktop鏈接服務

          tips: 在Desktop的catalog中,鏈接Arcgis on localhost(如果服務發布在其他機器上,可以點擊添加Add ArcGIS server,添加服務器),從中可以發現發布的服務,找到需要測試的gp服務,對其進行測試,測試方式和本地是一樣的。

三、gp的調用

      gis web引用程序的調用,通常有兩種方式,方式一:通過在ArcGIS viewer for flex 或者ArcGIS viewer for silverlight 中目標創建web applicataion;方式二:通過web api(ArcGIS server for javascript,silverlight,flex)調用。

      本文的調用是通過使用方式二中的js api,創建web前端應用程序。   

View Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>GP服務測試</title>
    <link href="Scripts/claro.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="http://localhost/arcgis_js_api/library/3.3/jsapi/js/esri/css/esri.css">
    <style>
        html, body, #map
        {
            height: 100%;
            width: 100%;
            margin: 0;
            padding: 0;
        }
        body
        {
            background-color: #FFF;
            overflow: hidden;
            font-family: "Trebuchet MS";
        }
    </style>
    <script src="http://localhost/arcgis_js_api/library/3.3/jsapi/init.js"></script>   
    <!--
    <script src="jsapi_vsdoc10_v33.js" type="text/javascript"></script>
    -->
    <script>
        var map, gp, dynamic;
        //底圖 rest
        var mapurl = "http://localhost:6080/arcgis/rest/services/mapserver/CaliforniaProjecteddd/MapServer";
        // gp服務地址
        var gpurl = "http://localhost:6080/arcgis/rest/services/gp/Createb/GPServer/Createb";
        dojo.require("dijit.layout.BorderContainer");
        dojo.require("dijit.layout.ContentPane");
        dojo.require("dijit.form.Button");
        dojo.require("esri.map");

        function init() {
            map = new esri.Map("map");

            dynamic = new esri.layers.ArcGISDynamicMapServiceLayer(mapurl);
            map.addLayer(dynamic);
            //注冊map的點擊事件,
            dojo.connect(map, "onClick", CreateBuffer);
        }
        //加載dom
        dojo.ready(init);
        

        function CreateBuffer(evt) {
            //創建GP服務
            gp = new esri.tasks.Geoprocessor(gpurl);
            //繪制要素
            var graphic = DrawFeature(evt);
            // 配置gp 服務的參數
            var features = [];
            features.push(graphic);
            var featureSet = new esri.tasks.FeatureSet();
            featureSet.features = features;

            var distance = new esri.tasks.LinearUnit();
            distance.distance = 20;
            distance.units = esri.Units.KILOMETERS;
            //開始調用GP服務
            var params = {
                "Export_Output_2": featureSet,
                "Distance__value_or_field_": distance
            }
           
            //    gp.submitJob(params, addResults);在發布gp服務的時候中,如果選擇的是異步方式,采用的執行方式
            gp.execute(params, addResults);//同步的執行方式
        }

        //
        function DrawFeature(evt) {

            //根據鼠標點的位置,創建feature
            var pointSymbol = new esri.symbol.SimpleMarkerSymbol();
            pointSymbol.setOutline = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 1);
            pointSymbol.setSize(5);
            pointSymbol.setColor(new dojo.Color([255, 0, 0]));
            //
            var grahic = new esri.Graphic(evt.mapPoint, pointSymbol);
            map.graphics.add(grahic);

            return grahic;


        }
    //gp完成后的回調函數    

        function addResults(jobInfo) {         
            var features = jobInfo[0].value.features;
            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);
                map.graphics.add(feature);
            }
          
        }
    </script>
</head>
<body class="claro">
    <div data-dojo-type="dijit.layout.BorderContainer" data-dojo-props="design,'headline',gutters:false">
        <div id="map" data-dojo-type="dijit.layout.ContentPane" data-dojo-props="region:'center'">
        </div>
     <!--   <button data-dojo-type="dijit.form.Button" onclick="CreateBuffer();">
            獲取緩沖區</button>-->
    </div>
</body>
</html>

 

     結果:在map上點擊,生成一個buffer的feature。

 

 

圖 6 結果截圖

     tips: gp服務執行的結果在服務的作業目錄下,通過查看作業目錄,可以檢驗gp服務是否調用成功。

    

圖7 結果輸入目錄

     擴展閱讀:silverlight 中調用gp:http://www.cnblogs.com/potential/archive/2012/11/03/2752289.html

                     flex 中調用gp:http://www.cnblogs.com/gisangela/archive/2011/01/06/1927702.html

                     js中調用gp:http://210.43.24.222/chy/3sbase/news/?913.html

總結

    gp服務是ArcGIS Server 服務中的一主要服務形式。本文只做了簡單的示例。更加深入的學習,參考Esri官方幫助!

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM