本系列文章将记录自己从零学习ArcGIS Runtime SDK for Android 100.0.0。
该篇主要内容:
1、使用Web 地图
2、访问你组织的基础图层
3、身份
4、搜索地点
5、建议地点
6、地理编码
7、反地理编码
8、路线
使用ArcGIS Runtime Android App,可以将您组织(公司)的地图数据传送到您的工作人员手中。Map App可以接收来自ArcGIS Online组织的自定义Web地图。Map App不仅可以使用ArcGIS Online强大的服务,也可以使用您自己的服务进行搜索地点和规划路线(规划路线即两点之间的路线)。Map App它还可以将您组织(公司)配置的底图(离线地图,或者你公司的在线地图)进行底图切换。
此示例应用程序是开源的,您可以从GitHub(https://github.com/Esri/maps-app-android)上抓取下来,您可以按照示例代码去编写您自己的应用程序,或者只是学习如何将类似的功能集成到自己的应用程序中!
一、使用Web地图
您可以在ArcGIS Online或ArcGIS Pro上面创建自己的Web地图,然后再通过ArcGIS Online组织共享地图数据给你的Map App,这是ArcGIS内置的“Web GIS模型”的中心思想。写一个使用Web地图的应用程序,然后在ArcGIS Online中完成制图和地图配置,而不是在代码中完成这些。这就意味着我们的地图随时都可以更改,而不是只有在App更新或者代码更改后才能更新。我们将详细地讲解使用Web地图开发的好处,我们可以开始了解如何在ArcGIS Online和ArcGIS Pro中创建Web地图了。
在代码中加载web地图是非常容易的,我们的App从门户网站(可能需要用户登录,请参阅下面的身份部分)加载网络地图,只需要使用以下代码:
二、访问你组织(公司)的基础图层
作为ArcGIS Online组织或门户网站的管理员,您可以配置用户通过组之间的切换来切换底图(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)来进行配置,我们的App会通过异步调用来执行此操作,在底图库中查找到包含web地图的那个组,使用返回的组的ID,就可以从门户检索到底图的集合。
三、身份
App利用ArcGIS身份模型通过命名的用户登录模式提供对资源的访问。在路由的工作流程中,App会提示您输入您组织的ArcGIS Online凭据,用于获取稍后由门户网站和路由服务使用的令牌。ArcGIS Runtime SDK提供了一个简单易用的API来处理ArcGIS登录。
使用challenge handler访问令牌安全服务的过程如下图所示。
1、向服务器上的资源发出请求。
2、门户网站响应未经授权的访问错误。
3、与身份管理器相关联的challenge handler会提供身份凭证。
4、显示一个UI,并提示用户输入用户名和密码。
5、如果用户被成功认证,则向服务器的请求中就会包含一个凭证。
6、身份管理器会存储这个门户网站的凭证,并且所有请求都会包含凭证。
DefaultAuthenticationChallengeHandler类负责上面的1-6步,如果你的App需要使用这种模式,你可以按照这些指南注册您的应用程序。
每当安全服务发出身份验证时,DefaultAuthenticationChallengeHandler和DefaultOAuthIntentReceiver一起工作处理身份验证事务。除了上面的四行代码,Android manifest.xml文件必须定义一个DefaultOAuthIntentReceiver,用于在用户输入其凭据后接收意图。
在Xml中scheme属性,如果配置这个属性,这个属性的值是注册成功后重定向的url。
四、搜索地点
地理编码可以将地址或地名转换为特定地理位置,反之亦然,您可以使用地理位置来查找地理信息,比如使用邮政地址或者是地理名称。在Map App中,我们使用LocatorTask来执行Esri世界地理编码服务提供的地理编码和反向地理编码功能。LocatorTask有各种异步方法,在搜索位置或地理编码位置时,我们使用这些异步方法来得到一些地址的建议。
在Maps App中,LocatorTasks使用ArcGIS服务提供了在线定位器初始化功能。
您还可以配置自己的自定义地理编码服务适配自己的组织(公司),在使用LocatorTask进行地理编码或搜索位置之前,LocatorTask必须为LOADED,即可加载模式。LocatorTask是使用ListenableFutures(实现自Future接口)来进行异步操作的,ListenableFutures里面的任务执行完毕后,会执行监听功能。Map App还可以推荐附近的地理位置。
五、建议地点
在地图应用搜索框中输入地点的前几个字母(例如“Voodoo Donut”)会在设备位置附近显示一些建议。
六、地理编码
一旦用户已经选择了上面搜索列表中的建议,建议的地址会使用LocatorTask的geocodeAsync方法进行地理编码。根据这个地址,我们还可以设置特定的地理编码参数以调整结果,比如:在MapApp中,我们可以设置首选位置,并通过设置区域的边界来进一步细化,用来搜索匹配的地址。
七、反地理编码
Map App可以使用内置的地图放大镜帮助用户对地图上的位置进行微调,以进行反向地理编码。放大镜在地图视图上长按后显示,一旦长按被释放,地图上的点就会进行反地理编码。
我们需要扩展DefaultMapViewOnTouchListener里面的onUp事件并实现我们自己的逻辑。
反向地理编码的方法:
八、路线
在Maps-app中获取导航路线在Runtime SDK中与在ArcGIS Online上一样简单。您可以为您的组织(公司)自定义导航服务,你可以添加更好地反映组织工作流程的新路线,或删除不适合您组织工作流程的路线。
在Map App中从点到点的导航有两种启用方式:第一种,在生成路线之前必须对原点和目的地进行地理编码,在Map App中,生成路线会要求您向Portal或ArcGIS Online组织提供凭据。就像前面我们在身份章节提到的,我们会使用DefaultAuthenticationChallengeHandler来管理身份验证过程。
您可以使用RouteTask对象上的createDefaultParametersAsync()方法实例化一个新的RouteParameters对象。使用此方法生成路线,我们可以配置一些适当的默认设置,比如添加停靠点和请求路线方向,还可以允许指定方向的测量单位。
生成的路线如下所示