65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 TomTom 地图 API 实现车队可见性

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019年1月8日

CPOL
viewsIcon

6541

在本文中,我将向您介绍TomTom提供的一些API,并演示如何利用它们将位置数据点转化为关于您车队的可操作信息。

现代技术可以为我们提供大量的车辆位置及其状态数据,但有时这些数据点与有用且可操作的信息之间的路径并不容易找到。在本文中,我将向您介绍TomTom提供的一些API,并演示如何利用它们将位置数据点转化为关于您车队的可操作信息。

我们将通过一些示例来确定特定车辆的位置(以人类可理解的形式),然后识别车辆到达该位置所走的路线。最后,我们将研究如何查找有关路线的更多信息,甚至识别车辆在完成路线过程中是否超速。

为了尽可能让本文独立于任何编程语言,我将分享直接的API调用;但是,任何现代Web语言都可以访问这些API。

TomTom地图API

您可以在 TomTom开发者门户 找到开始使用TomTom API所需的一切。您首先需要做的是在该门户上创建一个账户。从主页,输入您的电子邮件地址,然后点击“获取免费API密钥”按钮。

图 1 TomTom 开发者门户

下一步是选择一个用户名并阅读条款和条件。您的免费账户每天支持多达2,500次免费交易。需要注意的是,如果每天2,500次API交易不够用,您可以通过访问开发者仪表板中的“我的积分”屏幕来购买更多交易。

一封包含设置帐户密码链接的电子邮件将发送到您的邮箱,然后您就可以开始使用了。在请求 API 密钥之前,您需要配置一个应用程序。在您的仪表板中,点击“+ 添加应用”按钮。

应用程序需要一个名称,您还需要启用应用程序需要访问的API。在本例中,我们将使用的产品是搜索API路由API产品。如果您正在跟着操作,请选择搜索API路由API产品,然后点击创建应用程序

图 2 创建新应用程序

您可以通过访问 TomTom开发者门户,并输入您的电子邮件地址以获取“免费API密钥”,来获得一个唯一的API密钥。您需要阅读并同意条款和条件,并选择一个用户名。一封电子邮件会提示您设置密码,然后您就可以导航到您的仪表板并创建一个新的应用程序。

应用程序会很快获得批准并在您的仪表板上显示。条目显示了消费者 API 密钥以及有关您的应用程序的信息,包括应用程序的批准状态以及它使用的每个产品。

本文重点介绍如何使用TomTom搜索和路由API,但开发人员还可以访问包含类似功能的Web和移动SDK。您可以从以下链接了解更多关于每个SDK的信息

图 3 应用程序详细信息

下面的每个示例都包含短语ReplaceWithYourAPIHere。您需要用您应用程序的唯一消费者API密钥替换该短语。让我们来看看我们的司机都把公司车辆开到哪里去了。

他们现在在哪里?

场景如下:我们有一辆车装有GPS定位器,并以纬度和经度对的形式将位置信息发送到我们的系统。在本例中,我们将使用以下坐标对

45.512077,-122.627832

让我们看看是否能找到地址,然后看看是否也能获得最近的交叉路口。基础URL是api.tomtom.com,我们将访问搜索API。该API的当前版本是2,我们将执行反向地理编码选项。

https://api.tomtom.com/search/2/reverseGeocode/45.512077,-122.627832.json?key=ReplaceWithYourAPIKeyHere
图4 反向地理编码示例URL

如果您收到类似于下面的响应,您需要确保您的API密钥输入正确。

<h1>Developer Inactive</h1>
图5 API密钥不正确时收到的错误

JSON路径参数表示我们希望以JSON格式接收响应。如果省略此参数,则使用默认格式XML。上面URL的响应如下所示。

{
 "summary": {
   "queryTime": 134,
   "numResults": 1
 },
 "addresses": [
   {
     "address": {
       "buildingNumber": "3527",
       "streetNumber": "3527",
       "routeNumbers": [],
       "street": "SE Hawthorne Blvd",
       "streetName": "SE Hawthorne Blvd",
       "streetNameAndNumber": "3527 SE Hawthorne Blvd",
       "countryCode": "US",
       "countrySubdivision": "OR",
       "countrySecondarySubdivision": "Multnomah",
       "municipality": "Portland",
       "postalCode": "97214",
       "country": "United States Of America",
       "countryCodeISO3": "USA",
       "freeformAddress": "3527 SE Hawthorne Blvd, Portland, OR 97214",
       "countrySubdivisionName": "Oregon"
     },
     "position": "45.512046,-122.627833"
   }
 ]
}
图6 反向地理编码响应

好了——我现在知道司机已经把车停在了波特兰市中心3527 SE Hawthorne Blvd。如果我没记错的话,Blue Star Donuts就在街对面。(希望他们带几个回办公室。)

在我们等甜甜圈的时候,让我们看看是否有办法获得更多关于他们确切位置的信息。Hawthorne Blvd是一条很长的路。我想知道他们离哪个交叉路口最近。

https://api.tomtom.com/search/2/reverseGeocode/crossStreet/45.512077,-122.627832.json?key=ReplaceWithYourAPIKeyHere
图7 带交叉路口信息的反向地理编码示例URL
{
 "summary": {
   "numResults": 1,
   "queryTime": 209
 },
 "addresses": [
   {
     "address": {
       "streetName": "SE 35th Pl & SE Hawthorne Blvd",
       "crossStreet": "SE 35th Pl",
       "municipalitySubdivision": "Richmond, Portland",
       "municipality": "Portland",
       "countrySecondarySubdivision": "Multnomah",
       "countryTertiarySubdivision": "Portland East",
       "countrySubdivision": "OR",
       "postalCode": "97214",
       "countryCode": "US",
       "country": "United States Of America",
       "countryCodeISO3": "USA",
       "freeformAddress": "SE 35th Pl & SE Hawthorne Blvd, Portland, OR 97214",
       "countrySubdivisionName": "Oregon",
       "street": "SE Hawthorne Blvd"
     },
     "position": "45.51204,-122.62763"
   }
 ]
}
图8 反向地理编码响应

交叉路口选项在地址信息不准确或需要精确位置以应对紧急情况时尤其有用。让我们看看如何了解他们是如何到达这个确切位置的。

他们是怎么到那里的?

我们的下一个挑战是重建车辆从一个地点到另一个地点所走的路线。我们将使用路由API来解决这个问题。如果我们提交一个POST请求,我们可以包含一个支持点列表,允许我们根据车辆的行驶路径来重建路线。我们还可以包含开始和结束时间,以确定途中是否有任何延误。

我们将使用以下URL,然后传递一个包含支持点和其他关键参数的JSON体。以下是我们所知道的关于司机和他们所走路线的信息。

  • 司机从PDX机场(45.5868227,-122.5937596)出发,最终到达Blue Star Donut Shop(45.512077,-122.627832)。
  • 我们有一系列点,是车辆行驶过的纬度和经度值对。
https://api.tomtom.com/routing/1/calculateRoute/45.5868227,-122.5937596:45.512077,-122.627832/json?key=ReplaceWithYourAPIKeyHere
图9 重建带支持点的路线基础URL

请求体是JSON格式,所以我们将传递一个设置为application/jsonContent-Type头。我们将与请求一起传递的请求体如下所示。为了保持代码片段的简洁,我缩减了支持点列表。

{
 "supportingPoints": [
   {
     "latitude": 45.58355,
     "longitude": -122.58545
   },
   {
     "latitude": 45.52641,
     "longitude": -122.61544
   },
   {
     "latitude": 45.51287,
     "longitude": -122.62296
   },
   {
     "latitude": 45.51204,
     "longitude": -122.62782
   }
 ]
}
图10 传递一系列支持点以精确绘制路线

以下响应是使用此请求从Routes API获得的典型响应。

{
 "formatVersion": "0.0.12",
 "copyright": "Copyright 2018 TomTom International BV. ...",
 "privacy": "TomTom keeps information that tells us how ...",
 "routes": [
   {
     "summary": {
       "lengthInMeters": 12201,
       "travelTimeInSeconds": 1479,
       "trafficDelayInSeconds": 0,
       "departureTime": "2018-09-24T23:01:26-07:00",
       "arrivalTime": "2018-09-24T23:26:04-07:00"
     },
     "legs": [
       {
         "summary": {
           "lengthInMeters": 12201,
           "travelTimeInSeconds": 1479,
           "trafficDelayInSeconds": 0,
           "departureTime": "2018-09-24T23:01:26-07:00",
           "arrivalTime": "2018-09-24T23:26:04-07:00"
         },
         "points": [
           {
             "latitude": 45.58671,
             "longitude": -122.59387
           },
           {
             "latitude": 45.58638,
             "longitude": -122.59324
           },
           //Data points removed to reduce space
           {
             "latitude": 45.51287,
             "longitude": -122.62588
           },
           {
             "latitude": 45.51204,
             "longitude": -122.62783
           }
         ]
       }
     ],
     "sections": [
       {
         "startPointIndex": 0,
         "endPointIndex": 10,
         "sectionType": "TRAVEL_MODE",
         "travelMode": "other"
       },
       {
         "startPointIndex": 10,
         "endPointIndex": 213,
         "sectionType": "TRAVEL_MODE",
         "travelMode": "car"
       }
     ]
   }
 ]
}
图11 基于支持点重建的路线

完整的路线信息包括一组完整的点,您可以在地图上绘制出来。路线还包括一个摘要部分,提供路线距离、路线行驶时间以及基于交通的调整等详细信息。

出发时间和到达时间是可选参数,且互斥。如果您想根据特定出发时间绘制路线,或者需要按特定时间到达并需要知道最佳出发时间,这些参数将非常有用。

探索路线的更多细节

如果您有一个包含车辆速度读数的跟踪系统,那么您可以使用反向地理编码请求中的returnSpeedLimit参数,将这些读数与速度信息进行比较。我们将选择路线上的一个点,并将其传递给搜索API。

https://api.tomtom.com/search/2/reverseGeocode/45.531822,-122.596347.json?key=ReplaceWithYourAPIKeyHere&returnSpeedLimit=true
图12 带速度限制信息的反向地理编码示例URL

如果您查看下面的响应,您会发现除了地址信息之外,还有一个速度限制参数,指示了这段道路的速度限制。我们可以对路线上的每个点执行此查询,并以编程方式将其与车辆的速度数据进行比较,从而确定在前往目的地的途中是否发生了任何超速违规。

{
 "summary": {
   "queryTime": 109,
   "numResults": 1
 },
 "addresses": [
   {
     "address": {
       "routeNumbers": [
         "I-84",
         "US-30"
       ],
       "street": "I-84",
       "streetName": "I-84",
       "speedLimit": "55.00MPH",
       "countryCode": "US",
       "countrySubdivision": "OR",
       "countrySecondarySubdivision": "Multnomah",
       "municipality": "Portland",
       "postalCode": "97213",
       "country": "United States Of America",
       "countryCodeISO3": "USA",
       "freeformAddress": "I-84, Portland, OR 97213",
       "countrySubdivisionName": "Oregon"
     },
     "position": "45.531806,-122.596331"
   }
 ]
}
图13 带速度限制信息的响应

我们还可以传递车辆的配置参数,例如

  • 车辆发动机类型
  • 消耗信息 - 速度及其相应消耗率的成对集合。
  • 加速和减速效率
  • 车辆指标 - 重量、载货类型、最高速度

使用这些配置参数,API会返回有关预期燃油消耗的信息。您可以在 路由API文档 中了解这些参数。

您还可以添加车辆配置以获得更准确的路线规划。路线可以基于速度、距离或环保模式来决定。环保模式会考虑燃油消耗、车辆效率、交通和路线的坡度,以找到燃油/能源消耗最低的路线。

附加信息

如果您想了解TomTom API中可用选项的更多信息,可以访问在线文档或使用API探索器来尝试不同的参数,并了解它们是如何协同工作的。

© . All rights reserved.