就在不久之前,Azure发布了基于位置的服务(LBS, Location Based Service)。这个服务归属在Azure IoT服务类别下,猜测目的是便于提供有定位、导航和路径规划的IoT解决方案。LBS这个词你肯定不会陌生,因为你用的很多应用都是用了LBS的服务,从饿了么到陌陌,从小黄车到支付宝红包…

    在Azure里启用LBS服务很简单,开启之后除了提供订阅的Key,几乎也没什么配置的地方。微软给这个服务提供了开发使用文档:https://docs.microsoft.com/zh-cn/azure/location-based-services/

    可是我更建议结合github上的示例代码来研究这个服务是如何使用的。说明加上代码加上相关的插件说明和Azure REST API,几小时之内你就能写出自己的调用地图的应用。从逻辑原理上说,微软提供了一套javascript/css 插件接口,以及一个支持地图服务的网站。接下来我们就开始做第一件事。

     ×××……是的,js和css所在的网站https://atlas.microsoft.com 我这里反正是不能访问,×××之后才看到地图…其实这也不是啥大问题,毕竟测试全球版Azure的你肯定有×××的办法……

    github上的示例有四个,交互式搜索、静态搜索、路径和跟踪路径。交互式搜索能够很快让你知道这个服务的大概样子;然后通过静态搜索,能够了解到地图的各种对象例如map、popup、point等等;路径能够了解如何调用这个服务来计算从起点到终点的路由;而跟踪路径可以看到增加道路限制之后不同的路径计算结果。

先看InteractiveSearch,把github上的代码复制下来之后,将替换成在Azure里面添加LBS服务设置里显示的两个Key的任何一个,保存为HTML文件,浏览器打开就能看到如下界面。代码里hard conding了中心位置,默认是在洛杉矶,顺着10号公路一路开,就到了Santa Monica海滩,满满的回忆啊~在搜索框里可以进行搜索。

尝鲜云端地图服务 Azure Location Based Service Preview_第1张图片

     你会发现有很多的限制,后面我们再说原因。接下来,开始我们的学习之旅。看看第一个示例 Search。当然先把给换了,后面就不重复了。打开代码学习一下它是怎么工作的。其实流程基本就是构造一个URL请求字串,然后把返回的数据进行处理。默认搜索的是加油站,我把它换成了hotel,提交给LBS的服务网站之后,按照提交的query进行查询,然后把返回的结果处理后显示在网页上。

尝鲜云端地图服务 Azure Location Based Service Preview_第2张图片

    显示过程使用了Popup方法,也就是代码里的atlas.Popup(),可以在站点查询所有LBS服务使用的方法:https://docs.microsoft.com/zh-cn/javascript/api/location-based-services-javascript/popup?view=azure-iot-typescript-latest

尝鲜云端地图服务 Azure Location Based Service Preview_第3张图片

    定义的弹出显示,除了名字“The Westin Bellevue”和地址,还显示了经纬度。这个酒店是前年参加MVP全球峰会我住的地方,满满的回忆+1。我们把经纬度复制备用。

尝鲜云端地图服务 Azure Location Based Service Preview_第4张图片

    接下来的Route路径规划示例,会显示如何查询从起点到终点的路径查询,并在地图中显示出来。一样,我把默认的加油站的经纬度,改成了我们刚才查询到的酒店的经纬度。这里会看到,使用了atlas.data的Point函数,这个函数对应了Position,文档显示这是一个三维坐标,经纬度是必须的,高度是可选的。可参考:

https://docs.microsoft.com/zh-cn/javascript/api/location-based-services-javascript/point?view=azure-iot-typescript-latest

https://docs.microsoft.com/zh-cn/javascript/api/location-based-services-javascript/position?view=azure-iot-typescript-latest

    这也就是说,IoT应用可以直接把GPS读取的位置信息处理后,传递给LBS服务进行地图展现。

尝鲜云端地图服务 Azure Location Based Service Preview_第5张图片

    对于返回的数据绘制,使用了atlas.data的Feature,不过没看到详细的说明,我试探着把icon的描述从pin-round-blue改成了pin-round-red,于是地图中起点Microsoft就从蓝色变成了红色。

尝鲜云端地图服务 Azure Location Based Service Preview_第6张图片

    更复杂一点的例子,就是针对路径查询设置一些限制,使得路径能够规避一些不能/不适合通行的道路。这个例子是traceRoute。如代码中高亮部分,对通行条件做了针对卡车的限制,因此查询的两条线路会导致不同的线路结果。

尝鲜云端地图服务 Azure Location Based Service Preview_第7张图片

    找了一下,查询限制说明可以参考:https://docs.microsoft.com/zh-cn/rest/api/location-based-services/route/getroutedirections 但我没有发现示例代码使用的参数。倒是说明站点有显示:https://docs.microsoft.com/en-us/azure/location-based-services/tutorial-prioritized-routes,最终我在这里找到了说明:https://developer.tomtom.com/online-routing/online-routing-documentation-routing/common-routing-parameters

    别忘了,地图的右下角写着小小的TomTom~

    按照文档说明,这个示例应该显示卡车走Evergreen Point Bridge,而汽车走90号公路。可是我运行后是这样的……

尝鲜云端地图服务 Azure Location Based Service Preview_第8张图片

    我猜现在西雅图是半夜,没啥车,所以卡车汽车都走上面了。那怎么体现按照不同条件限制选择不同线路呢?有办法。

truckRouteUrl += “&routeType=shortest”

    我让卡车去掉限制,走最短线路~这下效果出来了~

尝鲜云端地图服务 Azure Location Based Service Preview_第9张图片        目前Azure LBS有挺多的限制,例如,中国的地图暂时不可用~

尝鲜云端地图服务 Azure Location Based Service Preview_第10张图片

那么哪些地方的地图可以查询到什么程度呢?可以参考:

    地图编码覆盖区域,能够查询城镇,道路,门牌等

    交通覆盖区域,能够查询路况信息,有事故标注、流量情况。

    即使是美国的地图,Azure LBS的和Bing的,也有差异。

尝鲜云端地图服务 Azure Location Based Service Preview_第11张图片

    Bing的地图显示建筑信息更全一点,美国的地图提供者是HERE,也就是最早的Nokia?

尝鲜云端地图服务 Azure Location Based Service Preview_第12张图片

    如果你下载过Windows 10里的地图,你就知道至少日本、朝鲜韩国的地图是没有的,而在Bing地图中,日本的地图供应商是Zenrin。

尝鲜云端地图服务 Azure Location Based Service Preview_第13张图片

    而国内的地图供应商是Navinfo。

尝鲜云端地图服务 Azure Location Based Service Preview_第14张图片

    有关地图供应商说明可参考:https://support.microsoft.com/zh-cn/help/17831/about-bing-data-suppliers