ArcGIS?

Tags: 問題, 錯誤,

ArcGIS GP服務問題列表及解決辦法。

方法/步驟

輸入參數錯誤

在使用GP服務時,從創建模型到發佈服務,再到調用服務,整個過程都需要注意輸入參數和輸出參數的問題。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我們現在調用GP服務時輸入GPFeatureRecordSetLayer類型的參數

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

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

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

超出邊界的問題。

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

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

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

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

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

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

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

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

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

同步異步的問題

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

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

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

_geoprocessorExecuteTask.ExecuteAsync(ExecuteGPParameter);

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

_geoprocessorJobTask.SubmitJobAsync(JobGPParameter);

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

ArcGIS Server 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就是無法顯示,並報如下的錯誤:

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

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

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

HttpWebRequest.RegisterPrefix(";, System.Net.Browser.WebRequestCreator.ClientHttp);

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

_geoprocessorJobTask.SubmitJobAsync(Jobgpparameter);

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

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

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

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

相關問題答案