本文档是对一篇使用旧版 GMP API 的旧文章的更新。此内容已更新为 2023-24 年发布的新版 Places API 和 2023 年发布的 Routes API。
通常,当用户驾车前往地图注点 (POI) 时,他们实际上需要导航到附近的地点,例如停车场或接入点。假设一位司机需要前往机场或购物中心。前往机场时,司机会尝试前往航站楼或下车点,而不是机场大楼的中心。同样,对于开车的用户来说,购物中心旁边的停车场可能是一个更好的选择。在这种情况下,开发用于引导驾驶员的应用或服务时,请先查找他们要去的地点,然后为驾驶员提供该地点附近的可选目的地。通过这种方法,您只需利用 Google Maps Platform 提供的位置数据进行少量但精明的开发工作,即可为客户提供更好的服务,并向他们展示您珍惜他们的时间。
我们将介绍如何依次或组合使用新版 Places API 和 Routes API,确定在目的地附近停车的合适位置。此解决方案旨在消除不确定性,并减少在靠近最终目的地时驾车寻找停车位时进行的多次互动。下面两个示例详细介绍了如何实现这些用例。
示例 1 - 没有停车场的旅游景点
选择一个与路边不直接相连的位置,以便必须单独检索路线,目的地是巴黎的圣母院,我们将使用东站火车站 (48.87697775149635, 2.3592247806755564) 作为起点。
车辆会在距离巴黎圣母院北部约 16 分钟车程的车站出发。巴黎圣母院是位于一个岛屿上的著名旅游景点,可通过桥梁抵达,其中有一些单行道,附近没有大型停车场,因此这应该是一个有趣的挑战。
- Places API 请求
此 Places API 请求示例使用文本搜索功能查找了 Notre Dame。如需了解详情,请参阅开发者文档。这些示例中的“$APIKEY”是您在 Google Cloud 控制台中为已启用的 Google Maps Platform 地点和路线 API 设置的 API 密钥。如需更详细的说明,请参阅 Google Maps Platform 使用入门文档。
新的 Places API 请求采用了新格式。响应字段不再固定,作为开发者,您必须在标头中定义字段掩码。文档中定义了字段掩码的使用方式。
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"
}
}
]
}
如您所见,这些坐标确实指向了巴黎圣母院。
作为开发者或服务提供商,您不妨自动提示司机“在巴黎圣母院附近寻找停车位?”;如果司机驾驶的是电动车,您可能需要搜索充电站。用户体验因设备和屏幕而异,但在这种情况下,不妨考虑使用短时间后消失的细微对话框文本。如需查找巴黎圣母院附近的停车场,请使用类型为“parking”和“electric_vehicle_charging_station”的半径为 500 米的 Places API 附近搜索。以下示例会将结果偏向于巴黎圣母院 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 请求,请在该部分中使用此位置。
- **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 请求:
- 用于查找 Notre Dame 坐标的 Places API 文本搜索请求
- 使用 Places API 附近搜索功能,查找距离这些坐标 500 米范围内设有电动汽车充电站的停车场
- 用于查找充电站路线的 Routes API 请求
示例 2 - 引导到大型机场中的航站楼
再举一个例子,假设司机正尝试前往一个包含多个地点、地图注点或可能的下车点的大区域。司机将从英国温布利球场 (51.557263604707224, -0.2794575145680608) 出发,前往伦敦希思罗机场 5 号航站楼。
新版 Places API 自动补全功能的一大优势在于,您可以将主要类型定义为搜索条件,并结合使用 API 来预测子门店作为潜在搜索结果。在本例中,这意味着搜索机场时也会返回航站楼。您可以在文档中找到要包含或排除的类型的完整列表。
curl -X POST -d '{
"input": "Heathrow",
"includedPrimaryTypes": ["airport"]
}' \
-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)。
示例 2 的摘要
与上一个示例一样,为驱动程序提供改进版指南所需的开发工作量非常小,并且可以衡量为驱动程序节省的时间方面的好处。我们执行了以下请求:
- 用于查找希思罗机场 5 号航站楼的 Places API 自动补全(新)请求
- 用于获取从 Wembley 到 5 号航站楼的路线的 Routes API 请求
此示例仅介绍了 Places API 新功能的冰山一角。查看一些新地点类型,例如简易机场和国际机场。
总结
如您所见,为乘车的客户提供优质服务所需的开发工作量非常小,您可以展示自己是如何考虑客户需求的。
出于开发目的,您可以使用许多可用的库和工具来帮助您为客户构建服务。请查看我们的公开 Google 地图平台 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 地图平台解决方案工程师