使用 ArcObjects (Java) 呼叫 ArcGIS Server Geoprocessing (GP) 服務時,開發者常在 gpServer.getJobResult() 方法的最後兩個參數 resultOptions 與 stringArray 上踩坑。典型程式碼片段如下:
GPServerIP gpServer = (GPServerIP) pServerObject;
IGPValues igpValues = new GPValues();
GPString gpString = new GPString();
gpString.setValue("('DATE' > date '1998-01-01 00:00:00' AND 'DATE' < date '1998-01-31 00:00:00') AND ('Day' = 'SUN' OR 'Day'= 'SAT')");
igpValues.add(gpString);
String jobId = gpServer.submitJob("911 Calls Hotspot", igpValues);
IStringArray stringArray = new StrArray();
IGPResultOptions resultOptions = new GPResultOptions();
IGPResult result = gpServer.getJobResult(jobId, stringArray, resultOptions);
GP 服務可能產生多個輸出參數(如衍生要素類、統計表格、報表檔案等)。stringArray 讓呼叫端聲明「我只需要哪幾個輸出」,減少網路傳輸量與序列化開銷。
null 或空陣列,伺服器將預設傳回所有輸出/jobs/<jobId>/results 查看stringArray.add("Output_Feature_Class"); stringArray.add("Statistics_Table");GPResultOptions 類別提供以下關鍵屬性:
| 屬性 | 型別 | 說明 | 常用值 |
|---|---|---|---|
| returnType | esriGPResultType | 決定結果如何傳回 | esriGPResultTypeByValue(直接內嵌資料)、esriGPResultTypeByReference(回傳 URL/資源參考) |
| format | String | 當 returnType 為 ByValue 時,指定序列化格式 | "json"、"amf"(預設)、"geojson" |
| maxRecords | int | 要素類輸出時的最大筆數限制 | 預設 1000,可設更大或 -1 表不限 |
| env:outSR | ISpatialReference | 輸出座標系投影 | 投影 WKID,如 3857 (Web Mercator) |
| env:processSR | ISpatialReference | 處理座標系 | 同上 |
// 1. 建立 stringArray — 明確聲明需要的輸出參數名稱
IStringArray stringArray = new StrArray();
stringArray.add("Hotspot_Result_Layer"); // 圖層輸出
stringArray.add("Hotspot_Statistics"); // 統計表輸出
// 2. 設定 resultOptions — 依需求選擇傳回方式
IGPResultOptions resultOptions = new GPResultOptions();
resultOptions.setReturnType(esriGPResultType.esriGPResultTypeByValue); // 直接拿資料
resultOptions.setFormat("json"); // 方便前端解析
resultOptions.setMaxRecords(5000); // 覆蓋預設 1000 筆限制
// 3. (選擇性) 設定輸出投影為 Web Mercator,便於前端地圖疊加
ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironment();
ISpatialReference outSR = srFactory.createProjectedCoordinateSystem(3857);
IPropertySet env = new PropertySet();
env.setProperty("outSR", outSR);
resultOptions.setEnv(env);
// 4. 呼叫取得結果
IGPResult result = gpServer.getJobResult(jobId, stringArray, resultOptions);
// 5. 解析結果
if (result != null) {
IArray resultArray = result.getResults();
for (int i = 0; i < resultArray.count(); i++) {
IGPResultItem item = (IGPResultItem) resultArray.element(i);
String paramName = item.getParameterName();
IGPValue value = item.getValue();
// 依 paramName 判斷類型並處理 value
}
}
gpServer.getJobStatus(jobId) 直到回傳 esriJobSucceeded,或使用 gpServer.waitForJobCompletion(jobId, timeout)/rest/services/GPServiceName/GPServer/TaskName/jobs/<jobId>/results 列出的 "paramName" 欄位即為正確名稱esriGPResultTypeByReference,前端再以 URL 下載檔案env:outSR 導致圖層偏移stringArray 決定「要哪些輸出」,resultOptions 決定「怎麼傳回」。明確指定輸出參數名稱、選擇 ByValue + json 方便前端、適度調大 maxRecords、必要時設定輸出投影,即可穩定高效取得 GP 服務結果。