天天看點

ArcGIS Server Flex API調用GP服務的一般步驟

ArcGIS Server Flex API調用GP服務的一般步驟

1、說明

ArcGIS Geoprocessing提供了大量地理處理和分析工具,可根據需要對這些工具進行組合構造自己的GIS分析模型,然後釋出成GP服務,以友善各種Web用戶端調用。Flex API中提供了通路GP服務的接口,通過該接口和GP工具,可實作具有進階GIS分析功能的Web應用。

2、模型建立與測試

    建立模型可在modelbuilder可視化環境下進行,也可使用Python腳本定義。模型建立完成需要在ArcMap環境下測試是否正常運作。

    詳細模組化過程請參考ArcGIS的幫助文檔。

3、GP服務釋出

    釋出GP服務可使用兩種資源類型:GP工具;包含結果圖層的MXD文檔。其中包含結果圖層的MXD文檔釋出成GP服務時又有兩種選擇:一種隻釋出為GP服務;另一種釋出成MapService和GP服務。第二種方式可預先在MXD文檔中對結果圖層渲染,這樣可簡化用戶端的可視化工作。實際項目中選擇使用哪一種方式,需要根據具體業務需要确定,不能一概而論。

4、GP服務測試

(1)在ArcMap中加載MapService

注意為友善測試,該MapService不能使用釋出GP服務時一同釋出出來的MapService。

(2)在ArcToolbox中添加GP服務

将釋出的GP服務添加到ArcToolbox中,點選運作,生成的結果會自動添加到目前的地圖中。

5、ArcGIS Server Flex API調用GP服務示例

上面幾小節簡單的介紹了GP工具的制作和GP服務的釋出,本小節正式進入正題,講講如何使用ArcGIS Server Flex API調用GP服務。

GP服務分同步和異步兩種執行模式,Flex API也提供了兩種處理方式與之對應。Flex API調用GP服務使用的是Geoprocessor類。該類提供了execute(params)和submitJob(params)兩個方法調用背景的GP服務進行資料處理,其中execute(params)對應的是同步執行模式,執行完成觸發executeComplete事件。submitJob(params)對應的是異步執行模式,執行完成觸發jobComplete事件。對GP服務結果的處理我們可以定義在這些complete事件中。如果GP服務處理過程比較簡單而且耗費時間少,我們可以選擇同步執行模式,但如果比較耗時,為避免用戶端長時間等待,常使用異步執行模式。

為保證Flex API正常調用GP服務,在GP模型定義和GP服務釋出過程需要,還需要注意以下幾項:

(1)在配置MXD文檔時,設定臨時工作空間

在MXD中添加完GP工具後,如果未設定臨時工作空間,則運作GP工具生成的結果将預設儲存在C槽下,該路徑會導緻GP服務無法讀取結果圖層,可通過設定臨時工作空間解決。設定方法:在ArcToolbox上右鍵選擇Environment,設定scratchworkspace的路徑即可。

(2)GP工具輸出路徑的處理

         為友善通路輸出圖層,一般情況下使用環境變量來指定輸出路徑,即使用scratchworkspace變量,該變量指向ArcGIS Server的arcgisjobs目錄。例如:%scratchworkspace%\idwraster。

(3)輸出圖層中文字元處理

如果GP工具中輸出的圖層名包含中文,需要更改為英文名稱,否則添加到地圖上的結果圖層無法正常顯示。

本示例以生成等值面為例,資料使用ArcGIS自帶的World地圖,軟體環境使用ArcGIS Server9.3.1,ArcGIS for Flex API 1.3版本。示例代碼如下:

(1)釋出服務

将包含GP工具的MXD文檔釋出成同名的地圖服務和GP服務。

(2)Flex調用GP服務

<mx:Script>
       <![CDATA[
           import mx.controls.Alert;
           import com.esri.ags.events.*;
           import com.esri.ags.tasks.*;
           import com.esri.ags.layers.*;

           private function gpJobCompleteHandler(event:GeoprocessorEvent):void

           {             
              var imageParameters : ImageParameters = new ImageParameters();
              var myImageLayer2 :GPResultImageLayer = gp.getResultImageLayer(event.jobInfo.jobId,"dzhm",imageParameters);
              //dzhm參數為GP工具中定義的輸出檔案名
              baseLayer.visible = false;
              map1.addLayer(myImageLayer2,0);        
              Alert.show("job:"+event.jobInfo.jobId);
           }
       ]]>

</mx:Script>

<esri:Geoprocessor id="gp" url="http://xinli:8399/arcgis/rest/services/test/world_gdb/GPServer/IDW"

                     jobComplete="gpJobCompleteHandler(event)">
       <esri:fault>
           <![CDATA[
           Alert.show(event.fault.message);
           ]]>
       </esri:fault>
</esri:Geoprocessor>
<mx:Button x="10" y="10" label="執行">
       <mx:click>
           <![CDATA[
              var params:Object = {};
              gp.submitJob(params);
           ]]>
       </mx:click>
</mx:Button>
<esri:Map id="map1" width="100%" height="100%">
        <esri:ArcGISDynamicMapServiceLayer id="baseLayer" url="http://xinli:8399/arcgis/rest/services/test/world_gdb/MapServer"/>
</esri:Map>
           

繼續閱讀