ArcGIS Server GP服務使用常見錯誤總結

  1. 輸入參數錯誤

在使用GP服務時,從創建模型到發佈服務,再到調用服務,整個過程都需要注意輸入參數和輸出參數的問題。GP服務支持的輸入和輸出參數可詳見   http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#/na/00530000001n000000/

如果輸入參數類型和GP服務的類型不一致,則會報錯。

當輸入或是輸出的參數類型不是GP服務支持的類型,則發佈GP服務不會成功。

當我們獲取GP服務的執行結果是,需要注意我們 結果的名稱必須要和GP服務輸出結果的名稱一致!例如:

這是發佈的GP服務輸出參數的信息: 

這裏我們可以知道輸出參數的名稱是:SurfaceOutput,那麼在我們請求服務的時候一定要注意參數名一致。

 _geoprocessorJobTask.GetResultImageLayerAsync(e.JobInfo.JobId"SurfaceOutput");

 這段代碼是向服務器獲取GP執行的結果,結果的名稱是:SurfaceOutput,必須要和GP服務的輸出參數一致。

如果不一致,比如我們將這裏的SurfaceOutput改爲ErroSurfaceOutput就會出現如下的錯誤:


所以我們也可以知道,當出現如圖所示的錯誤時,我們可以檢查一下獲取GP服務結果的參數是否一致!

同理,我們也需要保持輸入參數的一致性。當輸入的參數不一致時會出現如下的錯誤。

例如下圖是我們GP服務輸入參數額基本信息:

 

我們現在調用GP服務時輸入GPFeatureRecordSetLayer類型的參數Jobgpparameter.Add(newGPFeatureRecordSetLayer("PolutionPoints"featureData));

注意這裏PolutionPoints即爲GP服務輸入參數的名稱,這裏必須要求和GP服務的Parameter名稱相同,如果這裏我們將PolutionPoints改爲其他的名稱則會出現如下所示的錯誤:


  1. 超出邊界的問題。

 這裏一般是由於在我們建模時,選擇的要素的座標系統的屬性域過小引起的。

例如當我們輸入的參數是點要素時,那麼我們在我們創建點要素時,需要選擇點要素的座標系統(也可以選擇 Unknown).當我們非選擇Unknown時,那麼我們要素的屬性域就是固定的(相對選擇Unknown時會小很多)。例如當選擇的座標系統是 WGS_1984時,它的屬性域範圍如下:


當選擇的是Unknown時,要素的屬性域如下:


所以我們可以知道選擇不同的座標系統,那麼屬性域是不一樣的。

因此,由於XY屬性域範圍的限制,當我們輸入的點參數xy座標超出XY屬性域的範圍時,調用GP服務就會報錯,出現如下所示的錯誤:


解決的措施就是,將輸入的點要素的座標系統設置成Unknown,就可以了。

  1. 同步異步的問題

我們在發佈GP服務的時候會選擇是同步還是異步。同步調用GP服務實際上是在客戶端完成工作,結果存儲在客戶端,異步調用實在服務器端執行,結果存儲在服務器端,客戶端上服務器端索取。當處理的數據量較小,用戶不要要等待太長的時間時,可以採用同步的,當處理數據量較大,需要用戶等待一段時間,那麼我們則可以選擇異步的方式。

因此,由於GP服務有同步和異步之分,那麼我們在發佈和調用GP服務的時候都需要知道採用哪種方式。

例如我們發佈的GP服務是同步的, 我們只能用同步的方式調用:

 _geoprocessorExecuteTask.ExecuteAsync(ExecuteGPParameter);

 同理當GP服務爲異步的時候,如下調用:

 _geoprocessorJobTask.SubmitJobAsync(JobGPParameter);

而如果我們我們發佈的是同步方式的GP服務,而採用的卻又是異步方式來調用,那麼就會出現如下所示的錯誤:


  1. 未將對象設置到類的實例的錯誤

在我異步請求GP服務,獲取GP服務執行的結果時,遇到了這樣的錯誤。報錯代碼如下:

 

黃色字體部分即爲報錯的地方。

以下是獲取異步調用結果的完整代碼:

  voidgeoprocessorTask_GetResultDataCompleted(objectsenderGPParameterEventArgse)

        {

            GraphicsLayergraphiclayer=Map.Layers["CountorLayer"asGraphicsLayer;

            GPFeatureRecordSetLayerfeature=e.ParameterasGPFeatureRecordSetLayer;

            foreach (Graphicgraphicinfeature.FeatureSet.Features)

                      {

                           graphic.Symbol=LayoutRoot.Resources["RedLineSymbol"asESRI.ArcGIS.Client.Symbols.Symbol;

                           graphiclayer.Graphics.Add(graphic);

                       }

        }

這端代碼確實沒有錯誤,但是當自己運行程序的時候就報錯,說未將對象引用設置到對象的實例,後來經“菩提老王“的點播,發現原來我的GP服務都沒有執行成功(Fialded),換句話說就是e.Parameter中並沒有結果,因此當給feature賦值的時候實際上是不成功的。

GPFeatureRecordSetLayerfeature=e.ParameterasGPFeatureRecordSetLayer;

因而在後面遍歷feature中的Features時,則會報錯。

而當GP服務執行成功時,則不會出現如上的錯誤,調試發現此時feature中已經有了多個Features。說明成功了。

  1. 遠程服務NotFound的錯誤

有時候我們在調用GP服務時會出現如下的錯誤,說遠程服務NotFound,而我們發現GP服務生成了正確的結果,但是SL就是無法顯示,並報如下的錯誤:


這裏的原因是由於Silverlight自身訪問服務器資源引起的,在我們發送GP服務請求之前添加如下代碼便可以解決問題;

 

//添加這段代碼很重要,否則會出現遠程服務器NOT Found的錯誤

HttpWebRequest.RegisterPrefix("http://"System.Net.Browser.WebRequestCreator.ClientHttp);

Jobgpparameter.Add(newGPFeatureRecordSetLayer("PolutionPoints"featureData));

_geoprocessorJobTask.SubmitJobAsync(Jobgpparameter);

 

  1. GP執行成功,卻無法將結果顯示在地圖上

這個問題實際上是模型的問題,之前自己遇到過,開始的時候百思不得其解,因爲自己發佈了一個GP服務,在ArcMap中驗證成功,調用的時候也成功了,但是就是無法將結果顯示在當前的圖上,查看Jobs的文件夾,發現確實有結果生成。

之後重新建了模型,並重新設置了環境工作空間,輸出的文件夾路徑。然後發現問題解決了。當然是不是真的因爲這個原因,這裏也只是我的一個猜想,不過重新建模肯定是可以解決這個問題的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章