首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ArcObjects 訪問 GP 服務:正確設定 resultOptions 與 stringArray 參數完整教學

     編輯:程式設計疑難解答

問題場景:提交 GP 作業後如何正確取得結果?

使用 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);

參數深度解析

1. IStringArray stringArray — 指定要傳回的結果參數名稱

GP 服務可能產生多個輸出參數(如衍生要素類、統計表格、報表檔案等)。stringArray 讓呼叫端聲明「我只需要哪幾個輸出」,減少網路傳輸量與序列化開銷。

  • 若 GP 服務只有一個輸出參數,且你確定要取得它,可傳入 null 或空陣列,伺服器將預設傳回所有輸出
  • 若需指定,需先知道輸出參數的「名稱」(非顯示名稱),可在 ArcGIS Server Manager 的服務頁面或 REST 端點 /jobs/<jobId>/results 查看
  • 範例:stringArray.add("Output_Feature_Class"); stringArray.add("Statistics_Table");

2. IGPResultOptions resultOptions — 控制結果傳回格式與行為

GPResultOptions 類別提供以下關鍵屬性:

屬性型別說明常用值
returnTypeesriGPResultType決定結果如何傳回esriGPResultTypeByValue(直接內嵌資料)、esriGPResultTypeByReference(回傳 URL/資源參考)
formatString當 returnType 為 ByValue 時,指定序列化格式"json"、"amf"(預設)、"geojson"
maxRecordsint要素類輸出時的最大筆數限制預設 1000,可設更大或 -1 表不限
env:outSRISpatialReference輸出座標系投影投影 WKID,如 3857 (Web Mercator)
env:processSRISpatialReference處理座標系同上

最佳實踐程式碼範例

// 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
    }
}

常見錯誤與除錯技巧

  1. Job 狀態未就緒即呼叫 getJobResult:務必輪詢 gpServer.getJobStatus(jobId) 直到回傳 esriJobSucceeded,或使用 gpServer.waitForJobCompletion(jobId, timeout)
  2. 輸出參數名稱拼錯:REST 端點 /rest/services/GPServiceName/GPServer/TaskName/jobs/<jobId>/results 列出的 "paramName" 欄位即為正確名稱
  3. 結果過大導致記憶體溢位:改用 esriGPResultTypeByReference,前端再以 URL 下載檔案
  4. 座標系不匹配:前端地圖為 3857,GP 服務輸出為 4326,忘設 env:outSR 導致圖層偏移

總結

stringArray 決定「要哪些輸出」,resultOptions 決定「怎麼傳回」。明確指定輸出參數名稱、選擇 ByValue + json 方便前端、適度調大 maxRecords、必要時設定輸出投影,即可穩定高效取得 GP 服務結果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved