汽车导航用户体验

本文档是对旧版文章的更新,旧版文章使用的是旧版 GMP API。此内容已更新为 2023-2024 年推出的新版 Places API 和 2023 年推出的 Routes API。

通常,当用户驾车前往某个地图注点 (POI) 时,他们实际上需要导航到附近的位置,例如停车场或入口。想象一下,一位司机需要前往机场或购物中心。前往机场时,司机试图到达航站楼或下车点,而不是机场建筑群的中心。同样,对于驾车出行的用户来说,购物中心旁边的停车场可能是更好的选择。在这种情况下,在开发应用或服务来引导驾驶员时,请先找到他们要前往的位置,然后为驾驶员提供该位置附近的可选目的地。通过这种方法,您可以利用 Google Maps Platform 提供的位置数据,只需进行少量但巧妙的开发工作,即可为客户提供更好的服务,并表明您重视他们的时间。

系统图

我们将展示如何按顺序或组合使用新版 Places API 和 Routes API,以确定目的地附近的合适停车位置。此解决方案旨在消除不确定性,避免在驾车接近最终目的地时多次互动寻找停车位。下面通过两个示例详细说明如何实现这些用例。

示例 1 - 没有停车场的旅游景点

选择一个不直接与路边相连的位置,以便必须单独检索路线,目的地是巴黎的巴黎圣母院,起点是巴黎东站 (48.87697775149635, 2.3592247806755564)。

巴黎东站

司机从巴黎圣母院以北约 16 分钟路程的车站出发。巴黎圣母院是岛上的著名旅游景点,可通过桥梁进入,附近有一些单行道,没有大型停车场,因此这应该是一个有趣的挑战。

1. Places API 请求

此示例 Places API 请求使用文本搜索来查找巴黎圣母院。如需了解详情,请参阅开发者文档。这些示例中的“$APIKEY”是您在 Google Cloud 控制台中为 Google Maps Platform Places API 和 Routes API 启用的 API 密钥。如需更详细的说明,请参阅 Google Maps Platform 使用入门文档。

新版 Places API 请求采用新格式。响应字段不再固定,作为开发者,您必须在标头中定义字段掩码。文档中定义了 fieldmask 的用法。

curl -X POST --data @notre_dame.json \
-H 'Content-Type: application/json' -H "X-Goog-Api-Key: $APIKEY" \
-H 'X-Goog-FieldMask: places.id,places.displayName,places.formattedAddress,places.location' \
'https://places.googleapis.com/v1/places:searchText'

使用“notre_date.json”内容作为搜索参数:

{
   "textQuery": "Notre Dame, Paris",
   "languageCode": "en"
}

上述请求的响应会给出以下纬度和经度坐标:

{
  "places": [
    {
      "id": "ChIJATr1n-Fx5kcRjQb6q6cdQDY",
      "formattedAddress": "6 Parvis Notre-Dame - Pl. Jean-Paul II, 75004 Paris, France",
      "location": {
        "latitude": 48.852968200000007,
        "longitude": 2.3499021
      },
      "displayName": {
        "text": "Cathédrale Notre-Dame de Paris",
        "languageCode": "en"
      }
    }
  ]
}

如您所见,这些坐标确实指向巴黎圣母院。

巴黎圣母院入口照片 圣母院区域地图

作为开发者或服务提供商,最好自动提示驾驶员“正在寻找巴黎圣母院附近的停车位吗?”,或者如果驾驶员开的是电动汽车,您可能需要搜索充电站。用户体验会因设备和屏幕而异,但在这种情况下,可以考虑使用在短时间后消失的细微对话框文本。如需查找巴黎圣母院附近的停车场,请使用 Places API 进行附近搜索,类型为“parking”和“electric_vehicle_charging_station”,半径为 500 米。以下示例会将结果偏向于巴黎圣母院 500 米范围内的停车区域。

curl -X POST -d '{
  "includedTypes": ["parking", "electric_vehicle_charging_station"],
  "maxResultCount": 10,
  "rankPreference": "DISTANCE",
  "locationRestriction": {
    "circle": {
      "center": {
        "latitude": 48.852968200000007,
        "longitude": 2.3499021},
      "radius": 500.0
    }
  }
}' \
-H 'Content-Type: application/json' -H "X-Goog-Api-Key: $APIKEY" \
-H "X-Goog-FieldMask: places.displayName,places.location" \
https://places.googleapis.com/v1/places:searchNearby

第一个结果是位于 48.854981, 2.350629 的充电站,不过当您运行此示例时,结果可能会有所不同。在下一部分中,我们将在发出 Routes API 请求时使用此位置。

2. Routes API 请求

如需查找从该车站到巴黎圣母院附近充电站的路线,您需要发出 Routes API 请求。只需设置起点和终点参数即可。如需了解更多选项,请参阅开发者文档。

curl -X POST -d '{
  "origin":{
    "location":{
      "latLng":{
        "latitude": 48.87697775149635,
        "longitude": 2.3592247806755564
      }
    }
  },
  "destination":{
    "location":{
      "latLng":{
       "latitude": 48.854981,
        "longitude": 2.350629
      }
    }
  },
  "travelMode": "DRIVE",
  "routingPreference": "TRAFFIC_AWARE",
  "departureTime": "2024-05-16T15:01:23.045123456Z",
  "computeAlternativeRoutes": false,
  "routeModifiers": {
    "avoidTolls": false,
    "avoidHighways": false,
    "avoidFerries": false
  },
  "languageCode": "en-US",
  "units": "METRIC"
}' \
-H 'Content-Type: application/json' -H "X-Goog-Api-Key: $APIKEY" \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.legs,routes.polyline.encodedPolyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

Routes API 响应通常包含多条路线建议。如需在响应中包含路线数据,请在字段掩码中定义“routes.legs”。每条路线都由多个“路段”组成,这些路段包含多个“步骤”,用于显示行程距离和坐标。如需查找汽车可到达的最终坐标,请使用所选路线中最后一个路段的最后一步的“endLocation”字段。"latitude": 48.854937299999996, "longitude": 2.3505841999999997

这个位置可能看起来不是首选,但如果您查看地图或 Google 街景,就会发现这个位置距离巴黎圣母院非常近,步行只需大约 6-7 分钟。

前往圣母大学的路线

从充电站停车位到巴黎圣母院的步行路线

示例 1 摘要

如您所见,只需进行几次 API 调用,即可为汽车找到停车区域,并向驾驶员显示建议。这可以为用户节省时间,因为他们无需在单行道上绕行,也无需在拥挤的旅游景点寻找停车位。总结一下,我们发出了以下 API 请求:

  • 用于查找巴黎圣母院坐标的 Places API 文本搜索请求
  • 通过 Places API 附近搜索功能,查找这些坐标 500 米范围内设有电动汽车充电站的停车区
  • 用于查找前往充电站的路线的 Routes API 请求

示例 2 - 引导用户前往大型机场的航站楼

希思罗机场地图

再举一个例子,假设司机试图到达一个包含多个地点、地图注点或潜在下车点的大型区域。司机从英国温布利球场 (51.557263604707224, -0.2794575145680608) 出发,尝试前往伦敦希思罗机场 5 号航站楼。

新版 Places API 自动补全功能的一大优势在于,能够将主要类型定义为搜索条件,并结合 API 预测子场所作为潜在搜索结果。在这种情况下,这意味着搜索机场和停车场也会返回航站楼或停车场。您可以在文档中找到要包含或排除的类型的完整列表。

curl -X POST -d '{
  "input": "Heathrow",
  "includedPrimaryTypes": ["airport", "parking"]
}' \
-H 'Content-Type: application/json' -H "X-Goog-Api-Key: $APIKEY" \
https://places.googleapis.com/v1/places:autocomplete

上述查询会返回航站楼以及这些航站楼中各个下车点的列表。从结果列表中,我们可以找到“伦敦希思罗机场 5 号航站楼”及其地点 ID:

"place_id" : "ChIJo21hnPxxdkgRksRL0KQRWII",

使用“placeId”参数,我们可以告知 Routes API,我们尝试到达的是某个地点,而不是任意坐标。

curl -X POST -d '{
  "origin":{
    "location":{
      "latLng":{
        "latitude": 51.557263604707224,
        "longitude": -0.2794575145680608
      }
    }
  },
  "destination":{
    "placeId": "ChIJo21hnPxxdkgRksRL0KQRWII"
  },
  "travelMode": "DRIVE",
  "routingPreference": "TRAFFIC_AWARE",
  "departureTime": "2024-05-16T15:01:23.045123456Z",
  "computeAlternativeRoutes": false,
  "languageCode": "en-US",
  "units": "METRIC"
}' \
-H 'Content-Type: application/json' -H "X-Goog-Api-Key: $APIKEY" \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.legs,routes.polyline.encodedPolyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

同样,如上一个示例所示,通过读取 JSON 响应中的所有步骤,您将找到行程的最后一部分以及终点位置的纬度和经度坐标(51.4714348,“经度”:-0.48967890000000003)。

5 号航站楼街景

示例 2 的摘要

与上一个示例一样,为司机提供改进的路线指引所需的开发工作量非常小,而司机节省的时间却可以衡量。我们发出了以下请求:

  • 用于查找希思罗机场 5 号航站楼的 Places API 自动补全(新版)请求
  • 向 Routes API 发出的 API 请求,用于获取从温布利到 5 号航站楼的路线

此示例仅展示了 Places API 新功能的一小部分。不妨看看一些新地点类型,例如简易机场和国际机场。

总结

如您所见,为驾车出行的客户提供优质服务所需的开发工作量相当小,您可以展示您是如何考虑客户需求的。

在开发过程中,您可以使用许多可用的库和工具来帮助您为客户构建服务。请查看我们公开提供的 Google Maps Platform GitHub 代码库。

后续操作

GMP 使用入门:https://developers.google.com/maps/get-started

建议的进一步阅读材料

Places API 自动补全(新版)文档: https://developers.google.com/maps/documentation/places/web-service/place-autocomplete

Routes API 文档: https://developers.google.com/maps/documentation/routes

贡献者

主要作者:Mikko Toivanen | Google Maps Platform 解决方案工程师