本文是对旧版文章的更新,该文章使用了旧版 GMP API。此内容已更新为 2023-24 年推出的新版 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。有关 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 响应通常包含多条路线建议。如需在响应中包含路线数据,请在 fieldmask 中定义“routes.legs”。每条路线都包含多个“路段”,而这些路段又包含多个“步数”,用于显示行驶距离和坐标。如需查找驾车可到达的最终坐标,请使用您所选路线中最后一段路程的最后一步的“endLocation”字段。"latitude": 48.854937299999996, "longitude": 2.3505841999999997
这个位置可能看起来不是首选,但当您查看地图或 Google 街景时,会发现这个位置距离巴黎圣母院非常近,步行约 6-7 分钟即可到达。
从充电站停车位到巴黎圣母院的步行路线
示例 1 的摘要
如您所见,为汽车寻找停车区只需进行几次 API 调用,然后向司机显示建议。这样可以节省用户的时间,因为他们不必在单行道上绕行,也不必在拥挤的旅游景点中寻找停车位。总结来说,我们发出了以下 API 请求:
- 用于查找巴黎圣母院坐标的 Places API 文本搜索请求
- Places API 附近搜索,用于查找距离这些坐标 500 米范围内的电动汽车充电站停车区
- 用于查找前往充电站的路线的 Routes API 请求
示例 2 - 在大型机场引导前往航站楼
再举一个例子,假设司机要前往一个包含多个地点、POI 或潜在下车点的大区域。司机从英国温布利球场 (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, "longitude": -0.48967890000000003)。
示例 2 的摘要
与上一个示例类似,为驾驶员提供改进的指导所需的开发工作量非常小,但驾驶员节省的时间却可以衡量。我们执行了以下请求:
- 一个 Places API 自动补全(新)请求,用于查找希思罗机场 5 号航站楼
- 从温布利到 5 号航站楼的路线的 Routes API 请求
此示例仅展示了新 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 解决方案工程师