本系列文章將記錄自己從零學(xué)習(xí)ArcGIS Runtime SDK for Android 100.0.0。
該篇主要內(nèi)容:
1、使用Web 地圖
2、訪問你組織的基礎(chǔ)圖層
3、身份
4、搜索地點(diǎn)
5、建議地點(diǎn)
6、地理編碼
7、反地理編碼
8、路線
使用ArcGIS Runtime Android App,可以將您組織(公司)的地圖數(shù)據(jù)傳送到您的工作人員手中。Map App可以接收來自ArcGIS Online組織的自定義Web地圖。Map App不僅可以使用ArcGIS Online強(qiáng)大的服務(wù),也可以使用您自己的服務(wù)進(jìn)行搜索地點(diǎn)和規(guī)劃路線(規(guī)劃路線即兩點(diǎn)之間的路線)。Map App它還可以將您組織(公司)配置的底圖(離線地圖,或者你公司的在線地圖)進(jìn)行底圖切換。
此示例應(yīng)用程序是開源的,您可以從GitHub(https://github.com/Esri/maps-app-android)上抓取下來,您可以按照示例代碼去編寫您自己的應(yīng)用程序,或者只是學(xué)習(xí)如何將類似的功能集成到自己的應(yīng)用程序中!
一、使用Web地圖
您可以在ArcGIS Online或ArcGIS Pro上面創(chuàng)建自己的Web地圖,然后再通過ArcGIS Online組織共享地圖數(shù)據(jù)給你的Map App,這是ArcGIS內(nèi)置的“Web GIS模型”的中心思想。寫一個(gè)使用Web地圖的應(yīng)用程序,然后在ArcGIS Online中完成制圖和地圖配置,而不是在代碼中完成這些。這就意味著我們的地圖隨時(shí)都可以更改,而不是只有在App更新或者代碼更改后才能更新。我們將詳細(xì)地講解使用Web地圖開發(fā)的好處,我們可以開始了解如何在ArcGIS Online和ArcGIS Pro中創(chuàng)建Web地圖了。
在代碼中加載web地圖是非常容易的,我們的App從門戶網(wǎng)站(可能需要用戶登錄,請(qǐng)參閱下面的身份部分)加載網(wǎng)絡(luò)地圖,只需要使用以下代碼:

二、訪問你組織(公司)的基礎(chǔ)圖層
作為ArcGIS Online組織或門戶網(wǎng)站的管理員,您可以配置用戶通過組之間的切換來切換底圖(http://doc.arcgis.com/zh-cn/arcgis-online/share-maps/share-items.htm)。App可以使用Portal API(https://developers.arcgis.com/android/latest/guide/access-the-arcgis-platform.htm)來進(jìn)行配置,我們的App會(huì)通過異步調(diào)用來執(zhí)行此操作,在底圖庫中查找到包含web地圖的那個(gè)組,使用返回的組的ID,就可以從門戶檢索到底圖的集合。

三、身份
App利用ArcGIS身份模型通過命名的用戶登錄模式提供對(duì)資源的訪問。在路由的工作流程中,App會(huì)提示您輸入您組織的ArcGIS Online憑據(jù),用于獲取稍后由門戶網(wǎng)站和路由服務(wù)使用的令牌。ArcGIS Runtime SDK提供了一個(gè)簡單易用的API來處理ArcGIS登錄。
使用challenge handler訪問令牌安全服務(wù)的過程如下圖所示。

1、向服務(wù)器上的資源發(fā)出請(qǐng)求。
2、門戶網(wǎng)站響應(yīng)未經(jīng)授權(quán)的訪問錯(cuò)誤。
3、與身份管理器相關(guān)聯(lián)的challenge handler會(huì)提供身份憑證。
4、顯示一個(gè)UI,并提示用戶輸入用戶名和密碼。
5、如果用戶被成功認(rèn)證,則向服務(wù)器的請(qǐng)求中就會(huì)包含一個(gè)憑證。
6、身份管理器會(huì)存儲(chǔ)這個(gè)門戶網(wǎng)站的憑證,并且所有請(qǐng)求都會(huì)包含憑證。
DefaultAuthenticationChallengeHandler類負(fù)責(zé)上面的1-6步,如果你的App需要使用這種模式,你可以按照這些指南注冊(cè)您的應(yīng)用程序。

每當(dāng)安全服務(wù)發(fā)出身份驗(yàn)證時(shí),DefaultAuthenticationChallengeHandler和DefaultOAuthIntentReceiver一起工作處理身份驗(yàn)證事務(wù)。除了上面的四行代碼,Android manifest.xml文件必須定義一個(gè)DefaultOAuthIntentReceiver,用于在用戶輸入其憑據(jù)后接收意圖。

在Xml中scheme屬性,如果配置這個(gè)屬性,這個(gè)屬性的值是注冊(cè)成功后重定向的url。
四、搜索地點(diǎn)
地理編碼可以將地址或地名轉(zhuǎn)換為特定地理位置,反之亦然,您可以使用地理位置來查找地理信息,比如使用郵政地址或者是地理名稱。在Map App中,我們使用LocatorTask來執(zhí)行Esri世界地理編碼服務(wù)提供的地理編碼和反向地理編碼功能。LocatorTask有各種異步方法,在搜索位置或地理編碼位置時(shí),我們使用這些異步方法來得到一些地址的建議。
在Maps App中,LocatorTasks使用ArcGIS服務(wù)提供了在線定位器初始化功能。

您還可以配置自己的自定義地理編碼服務(wù)適配自己的組織(公司),在使用LocatorTask進(jìn)行地理編碼或搜索位置之前,LocatorTask必須為LOADED,即可加載模式。LocatorTask是使用ListenableFutures(實(shí)現(xiàn)自Future接口)來進(jìn)行異步操作的,ListenableFutures里面的任務(wù)執(zhí)行完畢后,會(huì)執(zhí)行監(jiān)聽功能。Map App還可以推薦附近的地理位置。
五、建議地點(diǎn)
在地圖應(yīng)用搜索框中輸入地點(diǎn)的前幾個(gè)字母(例如“Voodoo Donut”)會(huì)在設(shè)備位置附近顯示一些建議。


六、地理編碼
一旦用戶已經(jīng)選擇了上面搜索列表中的建議,建議的地址會(huì)使用LocatorTask的geocodeAsync方法進(jìn)行地理編碼。根據(jù)這個(gè)地址,我們還可以設(shè)置特定的地理編碼參數(shù)以調(diào)整結(jié)果,比如:在MapApp中,我們可以設(shè)置首選位置,并通過設(shè)置區(qū)域的邊界來進(jìn)一步細(xì)化,用來搜索匹配的地址。

七、反地理編碼
Map App可以使用內(nèi)置的地圖放大鏡幫助用戶對(duì)地圖上的位置進(jìn)行微調(diào),以進(jìn)行反向地理編碼。放大鏡在地圖視圖上長按后顯示,一旦長按被釋放,地圖上的點(diǎn)就會(huì)進(jìn)行反地理編碼。

我們需要擴(kuò)展DefaultMapViewOnTouchListener里面的onUp事件并實(shí)現(xiàn)我們自己的邏輯。

反向地理編碼的方法:

八、路線
在Maps-app中獲取導(dǎo)航路線在Runtime SDK中與在ArcGIS Online上一樣簡單。您可以為您的組織(公司)自定義導(dǎo)航服務(wù),你可以添加更好地反映組織工作流程的新路線,或刪除不適合您組織工作流程的路線。
在Map App中從點(diǎn)到點(diǎn)的導(dǎo)航有兩種啟用方式:第一種,在生成路線之前必須對(duì)原點(diǎn)和目的地進(jìn)行地理編碼,在Map App中,生成路線會(huì)要求您向Portal或ArcGIS Online組織提供憑據(jù)。就像前面我們?cè)谏矸菡鹿?jié)提到的,我們會(huì)使用DefaultAuthenticationChallengeHandler來管理身份驗(yàn)證過程。

您可以使用RouteTask對(duì)象上的createDefaultParametersAsync()方法實(shí)例化一個(gè)新的RouteParameters對(duì)象。使用此方法生成路線,我們可以配置一些適當(dāng)?shù)哪J(rèn)設(shè)置,比如添加??奎c(diǎn)和請(qǐng)求路線方向,還可以允許指定方向的測(cè)量單位。

生成的路線如下所示
