了解 Azure Maps 路线查找

已完成

本单元将大致介绍 Azure Maps 的功能和应用程序。

Azure Maps 简介

本模块将广泛探讨 Azure Maps 的路线查找功能。 但是,还有许多其他功能与道路和出行无关。 路线查找是较复杂的功能之一,因为它涉及各种知识的运用,包括实时路况、道路质量、渡轮时刻表、道路法规以及大量其他数据。 地图的一种更简单的用法是将其主要用作背景,以显示与地图上任何特定位置相关的数据。 其中一个例子就是地震数据。 下图称为热度地图,它显示了特定时间段内的重大地震次数。 图中有一个热梯度,通常是从紫色到蓝色、绿色、黄色、橙色再到红色。 地震越频繁、越强烈,热度就越高。

屏幕截图显示了火山带的热度地图。

“火环”这个名字恰如其分。

Azure Maps 的一项重要功能是能够在整个世界的视图与只有几条街道的视图之间来回缩放。

接下来让我们看看如何构建复杂的地图展示。

分层地图

Azure Maps 是分层构建的。 你可以选择要显示的图层。 让我们以纽约地区为例来说明如何分层。

基础层包含地形轮廓,其中包括公园。

屏幕截图显示了 Azure Maps 的纽约基础层。

让我们将交通运输层添加到基础层之上。 交通运输层会添加所有已知的干道和支路。 如果仔细观察,你会发现它还添加了渡轮路线。 还添加了铁路线。

屏幕截图显示了 Azure Maps 的纽约交通运输层。

在交通运输层上面,我们添加标签层。 现在,它开始看起来像一张地图了。

屏幕截图显示了 Azure Maps 的纽约标签层。

我们可以止于标签层,但还有另一个层称为“流量”层。 该层显示所有交通事故。 纽约市不乏各种交通事故!

屏幕截图显示了 Azure Maps 的纽约车流层。

当我们编写对 Azure Maps 的调用时,可以添加自己的图层。 理应添加的图层是从 A 到 B 的最佳路线。如果需要,我们还可以添加天气层和包含空间数据的图层。 但是,这样一来,图层就太多了。 请注意流量层是如何遮挡其下方的一些标签层的。 图层具有优先级,因此你可以决定遮盖哪些信息。

路线查找

世界上几乎所有国家/地区都提供了路线规划信息。 但是,只有少数国家/地区提供包含实时路况信息的路线规划,而提供卡车专用路线规划的国家/地区更是屈指可数。 在北美洲,美国、加拿大和墨西哥提供了所有级别的路线规划。

显然,需要一些详细数据来计算从 A 到 B 的交通路线:必须知道每个路口、单向街道、桥梁净距、路面坡度。 另外,还需要有关车辆的准确信息。 该信息包括物理信息:长度、宽度、高度、重量。 还有发动机效率数据:耗油量、加速效率、上坡效率等。 对于电动汽车,则需要不同的发动机数据。

可以使用 Azure Maps API 指定大量物理数据和发动机效率数据。 但是,使用默认值也是不错的选择。 而且,由于我们在此阶段只是探索一下,因此,fuelEnergyDensityInMJoulesPerLiter 的设置现在对我们而言并不重要!

在示例应用中,我们指定三辆车:一辆自行车、一辆汽车和一辆卡车。 我们为这三辆车设置宽度、高度和长度。 对于卡车,我们添加第四个变量,即所装货物。 所装货物巧妙地引入了危险品的概念!

危险品

我们要生成的应用有一个很有趣的功能,即,能够为卡车设置危险品分类。

经联合国危险货物运输专家委员会协商一致,将危险品分为九类。 下表总结了这九个类别以及美国的危险品类别。 这些分类适用于所有运输形式 - 公路、铁路、海上、空中和内陆水道。 这些分类的数字顺序并不表示危险程度的高低。

分类 描述
USHazmatClass1 爆炸品
USHazmatClass2 气体
USHazmatClass3 易燃或可燃液体
USHazmatClass4 易燃固体、自燃物品、遇水燃烧品
USHazmatClass5 氧化剂和有机过氧化物
USHazmatClass6 毒害品、感染性物品或吸入危害物品
USHazmatClass7 放射性物质
USHazmatClass8 腐蚀品
USHazmatClass9 其他

在给定分类下,某些道路将无法使用。 前三类危险品会对路线产生重大影响。 例如,许多隧道禁止运输爆炸性或易燃性货物。 测试应用时,可以对路线进行改进,并了解卡车路线与汽车路线有何不同,或者当卡车装载涉及危险品的其他货物时,路线将如何变化。 由于一些显而易见的原因,道路限制最有可能出现在人口稠密的地区。

Azure Maps 单位

Azure Maps 使用公制系统作为其计算基础。 例如,车辆的长度、宽度和高度均以米为单位指定。 另外,耗油量以公升为单位进行存储,并以诸如 currentFuelInLitresconstantSpeedConsumptionInLitersPerHundredkmfuelEnergyDensityInMJoulesPerLiter 之类的常量形式使用。 本模块不讨论发动机油耗模型,但你可以调整这些参数,使其与默认油耗模型不同。

假设你希望用户看到英里、美制加仑或英制加仑。 你需要将 Azure Maps 返回的值乘以适当的常数。

Azure Maps 和 Azure IoT

Azure IoT(即“物联网”)提供用于从数千个远程设备读取遥测数据的云资源,并使用云后端服务存储和处理数据。 遥测数据可能包括温度、速度、湿度、加速度、压力等等。 遥测还包括位置数据:纬度、经度和(可选)海拔高度。 由于了解移动设备所在位置的意义非常重大,因此,Azure IoT 常用于进行车队管理。 位置遥测结合使用了 Azure IoT 和 Azure Maps。

除车队管理外,其他基于位置的常见应用场景还包括资产跟踪和智能城市应用程序。 如果你管理一组装有温度、湿度和安全传感器的智能建筑,那么可以想象一下,查看每台设备的准确地图位置可能非常重要,并且能够让你安心。 包含设备位置的地图可能是 IoT 仪表板的一部分。 仪表板的其他元素可能会显示传入的遥测数据,并提供一些用于将数据发送到设备的命令。

IoT 是指将数据发送到单个云服务(称为 IoT 中心)以进行存储和处理的远程设备。 在本模块的“总结”部分,查看提供 IoT 入门资料的 Learn 模块,以及结合了 Azure Maps 和 IoT 的 Learn 模块。

使用 JavaScript 调用 Azure Maps

在之前的讨论中,你应该会记得,地图视图既可以放大得很详细,也可以缩小到显示整个世界。 我们需要对视图进行一些控制。 通过为路线设置起点和终点,并在 Azure Maps 中调用照相机函数,可以实现此控制。 这些点将为默认情况下需要显示的区域指定一个边界框。 用户可以更改缩放比例,但是第一个视图将显示整个路线。

我们还提到了层的概念。 在我们的应用中,我们添加一个图层来显示路线,并为三辆车设置特定的颜色和线宽。 因此,可以同时显示这三条路线。 向第二个图层添加一些图形图标,以显示路线的起点、终点和中间点。

使用相同的起点和终点来设置坐标。 坐标是应用主调用的基础。 创建一个 routeURL 对象,然后就可以调用 calculateRouteDirections。 请注意,这里有一个以毫秒为单位的超时值。 计算从西雅图到迈阿密的最佳自行车路线可能需要花费几秒钟的时间! 如果花费的时间太长,你可能会想放弃路线查找。

以下代码是来自下一单元中源代码的片段。 它显示了最重要的调用,以及该调用如何返回 directions

...
routeURL.calculateRouteDirections(atlas.service.Aborter.timeout(milliseconds), coordinates, {
            travelMode: mode,
            vehicleWidth: vWidth,
            vehicleHeight: vHeight,
            vehicleLength: vLength,
            vehicleLoadType: vLoad
        }).then((directions) => {

            // Get data features from the response.
            var data = directions.geojson.getFeatures();
...

是时候开门见山了。 让我们来构建这一点!