熟悉GPServer的同學肯定知道,GPServer在10.1的ArcMap後需要執行成功一次才能釋出。
釋出GPServer,可以是ArcMap的工具箱的工具,也可以是自己寫的模型。
不管是ArcMap的工具還是自己寫的模型,肯定有許多個輸入與輸出的參數。
ParameterValue的value屬性類型(取決于ParameterValue的類型)
這些參數總有類型,那麼這些參數對應ArcGIS API for JavaScript 4或者3這兩個版本中,分别對應着JavaScript的什麼資料類型呢?
還好這方面的資源很多,官方API中就有,其實就是ParameterValue類的Value屬性的幫助文檔:
3.X中的ParameterValue
4.X中的ParameterValue
推薦使用3.X的表格,因為3.X的表格的GPServer參數類型與ArcGIS for Server上的參數類型名稱一模一樣。
上表的意思是,如果ParameterValue的類型是“Data Type”中的某一個,那麼value屬性的類型就是“JavaScript Type”中的某一個。
舉例說明
例如,在官方的Viewshed這個Task服務中,有如下的參數:
參數清單:
Input_Observation_Point(GPFeatureRecordSetLayer類型的輸入參數)
Viewshed_Distance(GPLinearUnit類型的參數)
Viewshed_Result(GPFeatureRecordSetLayer類型的輸出參數)
在前端代碼中,就變成了這樣:
function computeViewshed(event) {
graphicsLayer.removeAll();
var featureSet = new FeatureSet();
//...featureSet的屬性設定代碼被我省略
var vsDistance = new LinearUnit();
//...vsDistance的屬性設定代碼被我省略
var params = {
"Input_Observation_Point": featureSet,
"Viewshed_Distance": vsDistance
};
//兩個輸入參數就被設定成了FeatureSet類型與LinearUnit類型
//與上表一緻
gp.execute(params).then(drawResultData);
}
在drawResultData方法中,擷取結果參數的代碼如下:
function drawResultData(result) {
//從execute()方法的傳回值result(本方法的參數)中擷取
//ParameterValue[]的第一個元素的value中的features
var resultFeatures = result.results[0].value.features;
var viewshedGraphics = resultFeatures.map(...);//處理結果
graphicsLayer.addMany(viewshedGraphics);
view.goTo({
target: viewshedGraphics,
tilt: 0
});
}
什麼類型的ParameterValue的value屬性擁有features屬性呢?
沒錯,當value是AJS中的FeatureSet時,value的features屬性才能與之對應。
這又印證了ParameterValue若為GPFeatureRecordSetLayer類型(與GPServer的參數類型一緻),則其value的資料類型必為FeatureSet了。
多說一句,ParameterValue類的執行個體用在哪裡?
ParameterValue類沒有構造器,也就是說這個類使用者不能自己執行個體化。
這個類的執行個體是GPTask(Geoprocessor的執行個體)execute方法的傳回值之一:
execute()方法接受一個Object參數對象,傳回一個Object結果對象。
其中接受的Object對象就是輸入參數;
傳回的Object對象如上圖,其results屬性就是ParameterValue[]類型。
在execute().then(回調函數)的回調函數中,回調函數的參數result就是execute()的傳回值——Object對象。
我們可以這樣取得results中的ParameterValue:
var paramterValue = result.results[0];
取數組的第一個元素,GPServer中傳回的參數有多少個,那麼這個傳回的Object對象的results屬性的數組就有多少個元素,一般簡單的GPServer結果參數都隻有一個。