【移動應(yīng)用開發(fā)技術(shù)】ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線_第1頁
【移動應(yīng)用開發(fā)技術(shù)】ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線_第2頁
【移動應(yīng)用開發(fā)技術(shù)】ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線_第3頁
【移動應(yīng)用開發(fā)技術(shù)】ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線_第4頁
【移動應(yīng)用開發(fā)技術(shù)】ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線_第5頁
免費預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】ArcGISRuntimeforAndroid使用異步GP服務(wù)繪制等值線

關(guān)于基于Android上ArcGISServerGP服務(wù)的調(diào)用,已經(jīng)有前輩給出了很好的例子:/esrichinacd/article/details/9231815以及官方的幫助文檔:/android/sample-code/viewshed/詳細通過仔細學(xué)習(xí)上面的內(nèi)容,您也可以基本了解GP服務(wù)的使用過程。本文我們主要將以下三部分內(nèi)容:1.學(xué)會使用使用ArcMap構(gòu)建等值線GP服務(wù)模型2.學(xué)會使用ArcGISServer發(fā)布我們創(chuàng)建的GP服務(wù)模型3.學(xué)會ArcGISRuntimeforAndroid下異步調(diào)用GP服務(wù),繪制等值線其中前兩部分可本博客其他文章有詳細說明可參考:/potential/archive/2012/10/27/2742355.html這篇文章使用的是10.0的ArcGISServer,而這里我們使用的是10.1的ArcGISServer,因此在此我們也會提到10.1下如何來發(fā)布我們的服務(wù)。如果您熟悉GP服務(wù)的發(fā)布過程,可直接跳轉(zhuǎn)至第三部分。第三部分的內(nèi)容主要解決以下幾個問題:1.如果根據(jù)現(xiàn)有的坐標(biāo)信息和對應(yīng)的屬性數(shù)據(jù),構(gòu)造相應(yīng)的地理要素?例如:現(xiàn)在有某個省的個監(jiān)測點的降雨數(shù)據(jù)(監(jiān)測點經(jīng)緯度,及監(jiān)測點的降雨量),那么如何在地圖上對這些監(jiān)測點的數(shù)據(jù)進行反映?2.如何在Android平臺上根據(jù)這些監(jiān)測點的數(shù)據(jù)來對整個地區(qū)進行插值呢?并將等值線添加到Android移動平臺的地圖中?3.如何根據(jù)等值線的值,動態(tài)設(shè)置其不同的顏色呢?一、使用ArcMap構(gòu)建等值線的GP服務(wù)模型既然我們要創(chuàng)建等值線那么,肯定需要繪制等值線的數(shù)據(jù),即進行等值線繪制的點。而等值線又是怎么得到的呢?很簡單,根據(jù)這些點的位置和其表示的值(如該店的降雨量,濃度值等)對其進行插值。插值的過程就是根據(jù)已有的點來計算某一未知區(qū)域的點的濃度值。常用的插值方法有拉格朗日插值,克里金插值,反距離插值,樣條函數(shù)插值等。一般情況下我們選擇反距離和克里金插值,如果想得到非常平滑的插值結(jié)果,則可以采用三次樣條插值。

插值完成之后,實際上得到的是更多的點,而繪制等值線就是將具有相同屬性值的點連接起來得到等值線。通常情況下我們需要自己代碼完成插值過程和追蹤等值點的算法。并連接等值點。但是在ArcGIS中有內(nèi)置的插值工具和等值線工具供我們使用。但是在ArcGIS中各個功能模塊都是一個單獨的工具,而通過上面的分析我們知道繪制等值線至少有兩個過程:1.插值,2.依據(jù)插值結(jié)果繪制等值線

因此依據(jù)上面的分析我們通過ArcMap的ModelBuilder可以構(gòu)建如下的工具模型:

但是通常情況下上述得到的等值線有可能不會很平滑,如果需要較平滑的等值線可以再加上一個平滑工具,如:

通過加上平滑工具,設(shè)置平滑容差,可以得到較為平滑的等值線。二、

發(fā)布GArcMap構(gòu)建的GP服務(wù)模型

在ArcGISServer10.1中,發(fā)布GP服務(wù)的方式較之前有所改變,不再是發(fā)布GP服務(wù)模型本身,而是發(fā)布在GP服務(wù)模型在ArcMap運行之后的結(jié)果,如圖所示:

然后出現(xiàn)發(fā)布服務(wù)的選項:

publishaservice:直接將現(xiàn)有模型結(jié)果發(fā)布為GP服務(wù)。

Saveaservicedefinitionfile:保存為服務(wù)定義文件,可以用于在ArcGISServerManager中發(fā)布為服務(wù)。

Overwriteanexistingservice:覆蓋當(dāng)前的ArcGISServer服務(wù)。這里我們選擇第二個選項,Saveaservicedefinitionfile.這樣的好處是可以在ArcGISManager上遠程發(fā)布。同時sd文件也很容易遷移到其他的機器。

保存為sd文件之后,登陸ArcGISServerManager頁面,點擊發(fā)布服務(wù):

然后點擊選擇文件,選擇之前在ArcMap中保存的服務(wù)定義文件(.sd).然后點擊下一步。

之后選擇發(fā)布服務(wù)的名稱,和所在服務(wù)的目錄。最后點擊下一步,發(fā)布服務(wù)。在服務(wù)發(fā)布之后登陸服務(wù)的rest頁面可以查看服務(wù)的具體參數(shù)信息:

接下來我們就需要開始編碼來調(diào)用我們這里的GP服務(wù)實現(xiàn)繪制等值線的功能。到此我們的繪制等值線的GP服務(wù)以及發(fā)布完成,接下來就是編碼的過程。當(dāng)然為了確保您的GP服務(wù)能夠正確運行,建議在編碼之前,通過ArcMap來驗證一下您的GP服務(wù)。驗證過程可參考之前的博文,鑒于篇幅在此不再贅述。三、

ArcGISRuntimeforAndroid調(diào)用異步GP服務(wù)繪制等值線

本文開發(fā)環(huán)境:ArcGISRuntimeforAndroid-10.2.2EclipseJavaEEIDEforWebDevelopers-Version:JunoServiceRelease2JDK-7Android4.0.3及以上(ArcGISRuntimeforAndroid10.2.2要求OPENGL2.0環(huán)境,Android4.0.3及以上版本的模擬器支持2.0的OPENGL)ArcGISServer10.1

調(diào)試過程在真機上實現(xiàn)3.1ArcGISRuntimeforAndroidGP服務(wù)調(diào)用過程

首先我們需要了解GP服務(wù)的幾個問題:

3.1.1.查看當(dāng)前GP服務(wù)是異步還是同步

ArcGIS的GP服務(wù)有異步和同步的兩種模式,默認(rèn)情況下(ArcGISServer10.1)使用的是異步模式。

通過REST頁面的參數(shù)我們也可以知道GP服務(wù)時何種模式:

或者

Asynchronous表示的是異步模式,SubmitJob也表示異步模式,他們是對應(yīng)的。3.11.2異步和同步的區(qū)別

異步模式通常適用于模型較復(fù)雜,運行時間較長的GP服務(wù),而同步適用于模型較簡單,運行時間較短的GP服務(wù)。

對于同步的GP服務(wù),需要等待服務(wù)執(zhí)行完成,然后再去獲取結(jié)果

對于異步的GP服務(wù),無需客戶端等待,但是需要客戶端去查詢GP服務(wù)執(zhí)行的狀態(tài),如果執(zhí)行完成,然后再去獲取結(jié)果,所有的過程需要開發(fā)人員自己編寫代碼,包括服務(wù)調(diào)用,狀態(tài)輪詢等。在ArcGISRuntimeforAndroid中并沒有提供類似與.net下的回調(diào)函數(shù),以方便我們獲取GP服務(wù)結(jié)果(如果您使用過C#+Silverlight/WPF/Win8/WindowsPhone下的GP服務(wù),我們知道異步執(zhí)行GP服務(wù)有個JobCompeleted事件,我們可以在該事件回調(diào)函數(shù)中寫獲取GP服務(wù)結(jié)果的代碼)。而ArcGISRuntimeforAndroid中并沒有這樣的事件供我們使用。3.2

ArcGISRuntime調(diào)用GP服務(wù)的詳細過程

ArcGISRuntimeforAndroid中調(diào)用GP服務(wù)的核心類是:Geoprocessor.該類封裝了調(diào)用GP服務(wù)所需的方法。其中較為重要的如下表所示:用于開始調(diào)用異步GP服務(wù),并返回本次GP服務(wù)調(diào)用的相關(guān)信息(如標(biāo)示id,狀態(tài)等)。和同步不同的是每一次異步調(diào)用GP服務(wù)都會生成一個jobID來標(biāo)示每一次GP調(diào)用的任務(wù),通過這個jobId我們可以找到該次GP服務(wù)調(diào)用的狀態(tài),結(jié)果。Geoprocessor構(gòu)造函數(shù)有兩個重載,都必須傳入GP服務(wù)的地址。

下面我們以上述繪制等值線的基礎(chǔ)為例子,來具體說明如何讓調(diào)用GP服務(wù)。

通過之前繪制等值線GP服務(wù)的REST頁面,我們知道請求GP服務(wù)需要三個輸入?yún)?shù)和一個輸出參數(shù)(計算結(jié)果這里即表示等值線),我們先看一看輸入?yún)?shù):ForecastPoints:預(yù)測點要素集,表示進行等值線繪制的點,且必須帶有concentration屬性,concentration屬性即為點要素的屬性,表示改點代表的濃度值,類型是GPFeatureRecordSetLayerContour_interval:等值線間距,類型是:GPDoubleSmoothing_Tolerance:平滑容差,類型GPLinearUnit

而在調(diào)用GP服務(wù)時,我們需要將上述的參數(shù)添加到GPParameter類的集合中(List<GPParameter>),最后調(diào)用GP服務(wù)傳遞的是List<GPParameter>集合。

下面我們來構(gòu)造上述GP服務(wù)參數(shù),首先我們新建一個類,取名:GPService,然后定義所所需的參數(shù):并實例化:說明:10.2的ArcGISRuntimeforAndroid的API中對于GraphicsLayer有了很大的改進,在聲明GraPhicsLayer對象時可以指定Gphics的渲染模式,當(dāng)指定為DYNAMIC時可以極大優(yōu)化Graphic的加載速度,從而提高用戶體驗。同時為了簡化整個過程,這里我們用于繪制等值線的點,以及其對于的濃度值并不是真實的數(shù)據(jù),我們將采用代碼來生成模擬的數(shù)據(jù),具體過程是:用戶輸入一個點,以該點為中心生成21x41個網(wǎng)格點。當(dāng)然換成真實數(shù)據(jù)的過程一樣。下面是生成模擬數(shù)據(jù)的方法,這里我們使用了一個橢圓的函數(shù)來構(gòu)造濃度值,因此我們預(yù)期的等值線應(yīng)該是一個一個的橢圓,此外還需要注意的是用于預(yù)測的點要素集必須包含concentration屬性,因為我們這里服務(wù)器端的GP服務(wù)是根據(jù)concentration屬性來繪制等值線的。要素的的屬性數(shù)據(jù)是以鍵值對的方式存放的。在構(gòu)造完所需的參數(shù)之后,我們添加集合輔助方法:注意:在ArcGISRuntimeforAndroid的API中,沒有單獨為Graphic提供添加屬性(Attributes,如果您熟悉.net下的ArcGISapi,那么您應(yīng)該知道可以通過Graphic的addAttributes方法來為Graphic添加屬性),由于沒有類似.net下的addAttributes方法,因此在需要給Graphic添加方法時只能通過兩種方式:在構(gòu)造Graphic的時候就將我們的屬性數(shù)據(jù)傳遞過去,比如本文使用的方法。通過將Graphic添加到GraPhicsLayer,然后調(diào)用GarphicsLayer的updateGraphic(intid,Map<String,Object>attributes)方法來更新Graphic的Attributes屬性。定義好參數(shù)以及相關(guān)的輔助方法后,下面就來完成請求GP服務(wù)的代碼,定義一個StartGPService方法:為了使得請求GP服務(wù)時不影響前臺的UI線程,因此我們重新new一個線程,因為如果直接在UI線程來添加用于預(yù)測的網(wǎng)格點(21x41)會有卡頓的現(xiàn)象。這里的submitJobandPolling方法如下,大致過程是:1.提交當(dāng)前的GP服務(wù)請求繪制等值線。2.提交完成之后,取得當(dāng)前的請求的JobId。3.通過Timer,同時根據(jù)當(dāng)前的JobId輪詢該GP服務(wù)的執(zhí)行狀態(tài)4.如果GP服務(wù)執(zhí)行完成,則停止輪詢5.如果GP服務(wù)執(zhí)行成功,則獲取GP服務(wù)的結(jié)果:getResultData(jobId,"ContourLine"),得到GPParameter6.因為是等值線,所以結(jié)果是線要素,因此我們將GPParameter轉(zhuǎn)為GPFeatureRecordSetLayer。7.讀取GPFeatureRecordSetLayer中的Graphic,即等值線8.根據(jù)等值線的值(contour屬性)分類渲染等值線。9.將等值線圖層添加到地圖中代碼如下:到此關(guān)于GP服務(wù)的準(zhǔn)備過程全部完成,下面我們開始編寫調(diào)用的代碼,有了上面的工作,下面的就很容易了:首先我們看一下Android界面的布局:這里加載本地數(shù)據(jù)為預(yù)留功能。然后我們實例化一個GPService對象,傳入自動繪制預(yù)測點要素集所需的起點坐標(biāo)和MapView對象,然后設(shè)置等值線間距和平滑容差,最后調(diào)用GP服務(wù)即可。代碼如下:最后等待我們的等值線出來吧。最后的效果圖:總結(jié):關(guān)于GP服務(wù),實際上無論Java平臺還是C#平臺,無論Silverlight,F(xiàn)lex還是JavaScript,無論WindowPhone還是Android(IOS沒有了解過,不是很清楚,屌絲沒有蘋果機真啊)他們調(diào)用GP服務(wù)的過程基本上都是一樣一樣的,注意是基本上。因此多少還是有些差別,但是總體上來說都遵循這樣的過程:1.聲明Geoprocessor變量,指定GP服務(wù)地址。2.根據(jù)GP服務(wù),聲明其所需的參數(shù),并添加到GPParameter集合(其他平臺名字也行稍有不一樣)3.根據(jù)異步和同步,執(zhí)行調(diào)用GP服務(wù)的方法4.獲取GP服務(wù)的結(jié)果了解了這個過程那么您就知道GP服務(wù)該如何使用了。一點題外話:

再次寫博客,發(fā)現(xiàn)上一次還是一年以前,不由的感慨時間飛逝,這一年中,渾渾噩噩的感覺就過去了,然后匆匆忙忙的找了份工作,然后馬上就要畢業(yè)了...留給自己

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論