使用ArcGIS GP服務遇到的問題,原因以及解決方案 – 用戶端API開發(Javascript/Flex/Silverlig 轉載

來源:互聯網
上載者:User

 來自:http://www.woxihuan.com/46528208/1339982748088020.shtml

ArcGIS 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改為其他的名稱則會出現如下所示的錯誤:

2.
超出邊界的問題。

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

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

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

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

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

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

3.
同步非同步問題

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

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

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

_geoprocessorExecuteTask.ExecuteAsync(ExecuteGPParameter);

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

_geoprocessorJobTask.SubmitJobAsync(JobGPParameter);

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

4.
未將對象設定到類的執行個體的錯誤

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

黃色字型部分即為報錯的地方。

以下是擷取非同步呼叫結果的完整代碼:

void
geoprocessorTask_GetResultDataCompleted(objectsender, GPParameterEventArgse)


{


GraphicsLayer
graphiclayer=Map.Layers["CountorLayer"] asGraphicsLayer;


GPFeatureRecordSetLayer
feature=e.ParameterasGPFeatureRecordSetLayer;


foreach (Graphic
graphicinfeature.FeatureSet.Features)


{


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


graphiclayer.Graphics.Add(graphic);


}

}

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

GPFeatureRecordSetLayer
feature=e.ParameterasGPFeatureRecordSetLayer;

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

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

5.
遠程服務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);

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

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

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

以上是自己在使用GP服務時遇到的一些問題,再次做了一個小小的總結,如有不完善的或是不對的地方,希望可以指出,大家相互學習,共同進步!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.