ArcGIS GP服務問題列表html
在使用GP服務時,從建立模型到發佈服務,再到調用服務,整個過程都須要注意輸入參數和輸出參數的問題。GP服務支持的輸入和輸出參數可詳見服務器
http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#/na/00530000001n000000/異步
若是輸入參數類型和GP服務的類型不一致,則會報錯。字體
當輸入或是輸出的參數類型不是GP服務支持的類型,則發佈GP服務不會成功。調試
當咱們獲取GP服務的執行結果是,須要注意咱們 結果的名稱必需要和GP服務輸出結果的名稱一致!例如:htm
這是發佈的GP服務輸出參數的信息:對象
這裏咱們能夠知道輸出參數的名稱是:SurfaceOutput,那麼在咱們請求服務的時候必定要注意參數名一致。blog
_geoprocessorJobTask.GetResultImageLayerAsync(e.JobInfo.JobId, "SurfaceOutput");ci
這段代碼是向服務器獲取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。說明成功了。
有時候咱們在調用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服務,在ArcMap中驗證成功,調用的時候也成功了,可是就是沒法將結果顯示在當前的圖上,查看Jobs的文件夾,發現確實有結果生成。
以後從新建了模型,並從新設置了環境工做空間,輸出的文件夾路徑。而後發現問題解決了。固然是否是真的由於這個緣由,這裏也只是個人一個猜測,不太重新建模確定是能夠解決這個問題的。
轉自:http://www.cnblogs.com/potential/archive/2012/05/18/GP.html