ArcGIS GP服務問題列表
- 輸入參數錯誤
在使用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改為其他的名稱則會出現如下所示的錯誤:
- 超出邊界的問題。
這里一般是由於在我們建模時,選擇的要素的坐標系統的屬性域過小引起的。
例如當我們輸入的參數是點要素時,那么我們在我們創建點要素時,需要選擇點要素的坐標系統(也可以選擇 Unknown).當我們非選擇Unknown時,那么我們要素的屬性域就是固定的(相對選擇Unknown時會小很多)。例如當選擇的坐標系統是 WGS_1984時,它的屬性域范圍如下:
當選擇的是Unknown時,要素的屬性域如下:
所以我們可以知道選擇不同的坐標系統,那么屬性域是不一樣的。
因此,由於XY屬性域范圍的限制,當我們輸入的點參數xy坐標超出XY屬性域的范圍時,調用GP服務就會報錯,出現如下所示的錯誤:
解決的措施就是,將輸入的點要素的坐標系統設置成Unknown,就可以了。
- 同步異步的問題
我們在發布GP服務的時候會選擇是同步還是異步。同步調用GP服務實際上是在客戶端完成工作,結果存儲在客戶端,異步調用實在服務器端執行,結果存儲在服務器端,客戶端上服務器端索取。當處理的數據量較小,用戶不要要等待太長的時間時,可以采用同步的,當處理數據量較大,需要用戶等待一段時間,那么我們則可以選擇異步的方式。
因此,由於GP服務有同步和異步之分,那么我們在發布和調用GP服務的時候都需要知道采用哪種方式。
例如我們發布的GP服務是同步的, 我們只能用同步的方式調用:
_geoprocessorExecuteTask.ExecuteAsync(ExecuteGPParameter);
同理當GP服務為異步的時候,如下調用:
_geoprocessorJobTask.SubmitJobAsync(JobGPParameter);
而如果我們我們發布的是同步方式的GP服務,而采用的卻又是異步方式來調用,那么就會出現如下所示的錯誤:
- 未將對象設置到類的實例的錯誤
在我異步請求GP服務,獲取GP服務執行的結果時,遇到了這樣的錯誤。報錯代碼如下:
黃色字體部分即為報錯的地方。
以下是獲取異步調用結果的完整代碼:
voidgeoprocessorTask_GetResultDataCompleted(objectsender, GPParameterEventArgse)
{
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。說明成功了。
- 遠程服務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);
- GP執行成功,卻無法將結果顯示在地圖上
這個問題實際上是模型的問題,之前自己遇到過,開始的時候百思不得其解,因為自己發布了一個GP服務,在ArcMap中驗證成功,調用的時候也成功了,但是就是無法將結果顯示在當前的圖上,查看Jobs的文件夾,發現確實有結果生成。
之后重新建了模型,並重新設置了環境工作空間,輸出的文件夾路徑。然后發現問題解決了。當然是不是真的因為這個原因,這里也只是我的一個猜想,不過重新建模肯定是可以解決這個問題的。
以上是自己在使用GP服務時遇到的一些問題,再次做了一個小小的總結,如有不完善的或是不對的地方,希望可以指出,大家相互學習,共同進步!