版本:ArcGIS Server 10.4 環境:win10
測試目標:創建一個GP服務,功能為根據要素屬性信息(如FID)選擇出輸入內容的對應匹配要素。
注:這個測試非常基礎,僅供新手發布GP服務練習。
如圖所示,數據源為兩個圖層,分別是中國行政區全圖(藍色)與中部幾個省份行政區(淺綠色)。
其中中部幾個省份所在的ChinaCopy圖層中,各要素信息如下。
新建Toolbox.tbx,在其中新建Model。
模型如下圖所示,輸入有:待選擇圖層 和 sql語句(如”FID” = 181)
模型構建過程
(根據上圖將四個部分分別標記為①②③④,以下用數字標記來簡稱這四個部分)
首先將select 工具拖進 Model 編輯窗口:
接着在①上右鍵,添加變量,有兩個選擇,從Parameter或Environment,從下圖可知Parameter即select工具需要輸入的內容。選中Input Features。
同理將Expresssion也選擇。
此時各部分內容都是白色,表明模型還不能順利運行。需要設置默認參數。分別雙擊②、③、④,將默認參數輸入。
此時模型各部分變為彩色。點擊上方圖標運行模型。若成功表示模型沒問題。
此時還需一步設置,如下圖:右鍵③並設置為Model Parameter使其作為模型輸入參數,否則之后運行模型時會使用剛才設置的默認參數,輸入參數無法修改。同理設置②、④。
最終結果:
關閉模型編輯窗口(選擇保存)。
雙擊模型運行。
運行成功后,在Results窗口找到剛運行的結果,右鍵發布GP服務。
注:如果沒有Results窗口,可以在ArcMap最上方,Geoprocessing→Results打開。如下圖所示。
發布服務時需要注意幾點:
①選中 以地圖服務查看結果,這樣之后在rest路徑下測試運行GP服務時,可以以地圖服務的形式查看運行結果。設置如下圖所示:
②模型相關的參數:輸入要素、輸入查詢條件、輸出要素,都需要進行描述,否則分析時會報錯。
另外如上圖所示,此時模型輸入要素是ArcMap中加載的三個圖層,發布的GP工具也只能以它們作為輸入。(應該)也可以使用用戶自己輸入,不過還沒測試(2016年11月28日,已測試,見文末)。
之后點分析、發布。發布成功后在server manager中查看GP服務。
如上圖所示,會有兩個同名服務,一個GP服務,一個地圖服務(GP服務默認運行結果)。
Rest路徑下,可以看到tasks和相關信息。
點擊上圖tasks下的Model。可以看到(如下圖所示)輸入參數的可選項,表達式的默認值等信息。
這里復制Choice List中的“ChinaCopy”方便下一步測試時填寫“輸入要素”。
點擊上圖中的Submit Job(位置在頁面最下方)。這里我們選擇ChinaCopy作為輸入,利用GP工具選擇出其中FID為3861的要素。點擊 Submit Job
Job Status 為運行結果。
Check Job Details Again 查看具體信息。等到出現如下結果,即運行成功,點擊Results下的結果圖層查看。
如下圖所示,陝西區域已被查詢出來。
關於輸入要素設置為用戶自定義的方式(以下測試略基礎,對於未能實現的功能不代表sever不支持,很可能是筆者還不知道該部分內容,以下僅供參考)。
若不選擇設置為用戶自定義,則GP工具的通用性大大降低。設置用戶自定義后,主要問題在於,怎樣輸入用戶自定義的要素?
如下圖(上文使用的GP服務刪掉了,這里界面和上文略有差異)所示GP服務(名稱為 Model),輸入部分為json格式的字符串。
名為Model的GP服務所使用數據源如下圖所示:
因為這里的目的是測試用戶自定義的數據源是否可以使用該GP服務,即該GP服務中包含的數據源不可以再使用。
為了獲取該GP服務中所需輸入的這種格式的字符串,這里使用不同數據源(僅文檔名稱、要素形狀與上面GP服務所使用數據源不同,屬性表、空間參考等都相同)、相同模型,另外發布第二個GP服務,這樣就有了與上圖相同格式(而數據源不包含在上圖GP服務中)的新GP服務。新GP服務數據源如下圖所示。
打開新的GP服務(新服務名稱為 Model2)到如下位置:拷貝輸入要素后面的字符串。
將字符串粘貼到名為Model的第一個GP服務對應位置,執行GP服務。(即 GP服務 + 輸入要素為未包含在該GP服務數據源的要素(用戶自定義要素) )
運行結果如下所示,顯然該要素並非Model GP服務所包含的數據源,即可以使用用戶自定義要素作為GP服務的輸入(不過格式寫起來比較麻煩)。
那么會不會是因為輸入要素為在線的服務才可以使用呢~
為了驗證,將新發布的Model2 GP服務刪除,再執行一次上述查詢,結果相同,即是否在線的服務並不影響。
那么自己寫一個格式相符的可以嗎?
這里我們修改一下復制粘貼的輸入要素字符串(具體修改見下圖后)。之后執行查詢,可以順利執行。
雖然只修改了一個坐標點位置,不過足以證明自己寫一個格式相符的字符串,可以作為GP服務的輸入要素。
輸入要素的描述字符串 原內容如下: 上圖測試修改了其中 45.669056117345974 將5修改為2 變為 42.669056117345974
{
"displayFieldName": "",
"geometryType": "esriGeometryPolygon",
"spatialReference": {"wkt": "GEOGCS[\"GCS_User_Defined\",DATUM[\"D_User_Defined\",SPHEROID[\"User_Defined_Spheroid\",6378140.0,298.2569978029123]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]"},
"fields": [
{
"name": "FID",
"type": "esriFieldTypeOID",
"alias": "FID"
},
{
"name": "test",
"type": "esriFieldTypeInteger",
"alias": "test"
},
{
"name": "Shape_Length",
"type": "esriFieldTypeDouble",
"alias": "Shape_Length"
},
{
"name": "Shape_Area",
"type": "esriFieldTypeDouble",
"alias": "Shape_Area"
}
],
"features": [
{
"attributes": {
"FID": 2,
"test": 0,
"Shape_Length": 15.104826430687684,
"Shape_Area": 13.532019237916634
},
"geometry": {"rings": [[
[
92.37279530645827,
44.18050407480325
],
[
95.79808090900679,
42.857533865595485
],
[
95.89439759507303,
41.13479398735268
],
[
92.37279530645827,
41.13479398735268
],
[
92.37279530645827,
44.18050407480325
]
]]}
},
{
"attributes": {
"FID": 1,
"test": 0,
"Shape_Length": 12.598930062798257,
"Shape_Area": 5.718694943441873
},
"geometry": {"rings": [[
[
99.2482993672221,
45.669056117345974
],
[
101.62889861977555,
43.97824988942091
],
[
101.62889861977555,
41.503610443367336
],
[
96.86997660813404,
41.503610443367336
],
[
99.2482993672221,
42.669056117345974
]
]]}
},
{
"attributes": {
"FID": 0,
"test": 0,
"Shape_Length": 14.035782149398706,
"Shape_Area": 12.17378909335935
},
"geometry": {"rings": [[
[
96.84618199740135,
47.39277643288614
],
[
99.89189208485192,
47.39277643288614
],
[
100.69977058054792,
44.21570577180398
],
[
96.84618199740135,
43.58563882357288
],
[
96.84618199740135,
47.39277643288614
]
]]}
}
],
"exceededTransferLimit": false
}
可以看出,字符串是對數據源中三個多邊形的描述, 每個多邊形有四個點,描述中從左上角點開始順時針,最后返回左上角點,共五個坐標。
在ArcMap中對比查看修改前后:
GP服務 輸入自定義要素如此麻煩,共享GP服務,不如直接拷貝模型?
首先,筆者對GP服務僅剛做了基礎測試,很可能有更方便的使用方法還不知道,有待學習一個。
另外,這里需要提及GP服務在ArcMap中的使用。
如下圖所示,在ArcMap中連接Server,找到GP服務,可以直接運行模型。這也就意味着如下場景:甲制作模型M,發布為GP服務,任意機器上安裝的ArcMap連接上該服務,就可以使用模型M。