入门指南
使用 Google Maps JavaScript API 中的路线服务之前,首先要确保在为 Google Maps JavaScript API 设置的同一项目的 Google API Console 中启用 Google Maps Directions API。
要查看已启用 API 的列表,请执行以下操作:
- 转至 Google API Console。
- 点击 Select a project 按钮,然后选择为 Google Maps JavaScript API 设置的同一项目并点击 Open。
- 在 Dashboard 上的 API 列表中,寻找 Google Maps Directions API。
- 如果在列表中看到该 API,则大功告成。如果未列出该 API,请执行以下操作将其启用:
- 在页面顶部,选择 ENABLE API 以显示 Library 标签。也可从左侧菜单中选择 Library。
- 搜索 Google Maps Directions API,然后从结果列表中选择它。
- 选择 ENABLE。流程完成时,Google Maps Directions API 即会出现在 Dashboard 上的 API 列表中。
使用限额和政策
配额
对于路线服务,具有以下使用限额:
搭配标准计划使用路线服务
- 每天 2,500 次免费请求,按客户端与服务器端查询次数之和计算; 启用计费可获得更高每日配额,按 0.50 美元/1000 次额外请求计费,每日上限为 100,000 次请求。
- 每次请求最多 23 个路径点,外加起点和终点。
- 每秒 50 次请求,按客户端与服务器端查询次数之和计算。
搭配高级计划使用路线服务
- 100,000 个请求的每日免费共享配额(每 24 小时);根据每年购买的 Maps API 额度提供的额外请求。
- 每次请求最多允许 23 个路径点,外加起点和终点。
- 每个项目每秒 不受限制 次客户端请求。请注意,服务器端 API 有每秒 50 次请求的限制。
无论有多少位用户共享同一项目,均以用户会话为单位施加速率限制。
单位会话速率限制可防止将客户端服务用于批量请求。对于批量请求,请使用 Google Maps Directions API 网络服务。
政策
必须按照所介绍的适用于 Google Maps Directions API 的政策使用路线服务。
路线请求
由于 Google Maps API 需要调用外部服务器,因此访问“路线”服务是异步进行的。为此,您需要传递一个在完成请求后执行的回调方法。此回调方法会对结果进行处理。请注意,“路线”服务可能会以独立 routes[]
数组形式返回多个可能的行程。
要使用 Google Maps JavaScript API 中的路线服务,需要创建一个 DirectionsService
类型的对象,并调用 DirectionsService.route()
向“路线”服务发起请求,同时向其传递一个 DirectionsRequest
对象字面量,后者包含输入字词和一个在收到响应后立即执行的回调方法。
DirectionsRequest
对象字面量包含以下字段:
{
origin: LatLng | String | google.maps.Place,
destination: LatLng | String | google.maps.Place,
travelMode: TravelMode,
transitOptions: TransitOptions,
drivingOptions: DrivingOptions,
unitSystem: UnitSystem,
waypoints[]: DirectionsWaypoint,
optimizeWaypoints: Boolean,
provideRouteAlternatives: Boolean,
avoidHighways: Boolean,
avoidTolls: Boolean,
region: String
}
这些字段解释如下:
origin
(必填):用于指定计算路线时所用的起始地点。该值可以指定为String
(例如“伊利诺斯州芝加哥市”)、LatLng
值或google.maps.Place
对象。如果使用google.maps.Place
对象,您可以指定一个地点 ID、一个查询字符串或一个LatLng
地点。您可以从 Google Maps JavaScript API 中的地理编码服务、地点搜索服务和地点自动完成服务检索地点 ID。如需查看使用来自“地点自动完成”的地点 ID 的示例,请参阅地点自动完成和路线。destination
(必填):用于指定计算路线时所用的结束地点。其选项与上面所述origin
字段的选项相同travelMode
(必填):用于指定计算路线时所用的交通方式。有效值见下文出行方式部分所述transitOptions
(可选):用于指定仅适用于travelMode
为TRANSIT
的请求的值。有效值见下文公交选项部分所述drivingOptions
(可选):用于指定仅适用于travelMode
为DRIVING
的请求的值。有效值见下文行车选项部分所述-
unitSystem
(可选):用于指定显示结果时所用的单位制。有效值见下文单位制部分所述 -
waypoints[]
(可选):用于指定DirectionsWaypoint
数组。路径点通过使路线经过指定位置来改变路线。您可将路径点指定为带有如下所示字段的一个对象字面量:location
:用于以LatLng
、google.maps.Place
对象或将进行地理编码的String
形式指定路径点位置stopover
:一个布尔值,表示路径点是路线上的一个停留点,可将路线一分为二
(如需了解有关路径点的详细信息,请参阅下文的在路线中使用路径点。)
optimizeWaypoints
(可选):用于指明,可通过按更高效的顺序重新安排路径点,对使用提供的waypoints
的路线进行优化。如果该值设置为true
,那么“路线”服务将在waypoint_order
字段中返回重新排序的waypoints
。(有关详细信息,请参阅下文在路线中使用路径点部分。)provideRouteAlternatives
(可选):设置为true
时,指明“路线”服务可在响应中提供多条备用路线。请注意,提供备选路线可能会增加服务器的响应时间。avoidHighways
(可选):设置为true
时,表示计算的路线应避开主要公路(如果可能)。avoidTolls
(可选):设置为true
时,表示计算的路线应避开收费道路(如果可能)。region
(可选):用于以 ccTLD(“顶级域”)双字符值形式指定地区代码。(如需了解详细信息,请参阅下面的地区偏向。)
注:durationInTraffic
字段现已弃用。以前,我们建议 Google Maps APIs Premium Plan 客户使用此字段指明结果包含的持续时间是否应考虑当前交通状况。现在,您应改为使用 drivingOptions
字段。
下面是 DirectionsRequest
示例:
{
origin: 'Chicago, IL',
destination: 'Los Angeles, CA',
waypoints: [
{
location: 'Joplin, MO',
stopover: false
},{
location: 'Oklahoma City, OK',
stopover: true
}],
provideRouteAlternatives: false,
travelMode: 'DRIVING',
drivingOptions: {
departureTime: new Date(/* now, or future date */),
trafficModel: 'pessimistic'
},
unitSystem: google.maps.UnitSystem.IMPERIAL
}
出行模式
计算路线时,您需要指定要使用的交通方式。目前支持以下出行方式:
DRIVING
(默认方式):表示使用道路网的标准驾车路线。BICYCLING
:请求经由自行车道和首选街道的骑行路线。TRANSIT
:请求经由公共交通线路的路线。WALKING
:请求经由步道和人行道的步行路线。
请查阅 Google 地图覆盖范围数据,确定某个国家/地区支持的路线范围。如果您对该路线类型不适用的区域请求路线,响应将会返回 DirectionsStatus
="ZERO_RESULTS
"。
步行路线有时可能不包含畅通无阻的步道,因此,如果您未使用默认的 DirectionsRenderer
,那么步行路线将会在您应显示的 DirectionsResult
中返回警告。
公交选项
适用于某一路线请求的选项会根据出行方式的不同而有所区别。请求公交路线时,将会忽略 avoidHighways
、avoidTolls
、waypoints[]
和 optimizeWaypoints
选项。您可以通过 TransitOptions
对象字面量指定公交专属路线选项。
公交路线具有时效性。只有对于未来的时间才会返回路线。
TransitOptions
对象字面量包含以下字段:
{
arrivalTime: Date,
departureTime: Date,
modes[]: TransitMode,
routingPreference: TransitRoutePreference
}
这些字段解释如下:
arrivalTime
(可选):用于以Date
对象的形式指定期望到达时间。如果指定了到达时间,就会忽略出发时间departureTime
(可选):用于以Date
对象的形式指定期望出发时间。如果指定了arrivalTime
,则departureTime
将被忽略。如果未对departureTime
或arrivalTime
指定任何值,则默认采用当前时间modes[]
(可选):一个包含一个或多个TransitMode
对象字面量的数组。只有在请求中包含 API 密钥时才会包括该字段。每个TransitMode
均指定一个首选的公交方式。允许使用以下值:BUS
:表示计算的路线应首选公共汽车出行。RAIL
:表示计算的路线应首选火车、有轨电车、轻轨和地铁出行。SUBWAY
:表示计算的路线应首选地铁出行。TRAIN
:表示计算的路线应首选火车出行。TRAM
:表示计算的路线应首选有轨电车和轻轨出行。
routingPreference
(可选):用于指定公交路线首选项。可以利用该选项影响返回的选项,而不是接受 API 选择的默认最佳路线。只有当请求包括 API 密钥时,才能指定此字段。允许使用以下值:FEWER_TRANSFERS
:表示计算的路线应首选换乘次数有限的路线。LESS_WALKING
:表示计算的路线应首选步行距离有限的路线。
下面是针对公交方式的 DirectionsRequest
示例:
{
origin: 'Hoboken NJ',
destination: 'Carroll Gardens, Brooklyn',
travelMode: 'TRANSIT',
transitOptions: {
departureTime: new Date(1337675679473),
modes: ['BUS'],
routingPreference: 'FEWER_TRANSFERS'
},
unitSystem: google.maps.UnitSystem.IMPERIAL
}
行车选项
您可以通过 DrivingOptions
对象指定行车路线的行程选项。如果您想在 DirectionsRequest
中包含 drivingOptions
字段,则必须在加载 API 时提供一个 Google Maps APIs Premium Plan 客户端 ID。
DrivingOptions
对象包含以下字段:
{
departureTime: Date,
trafficModel: TrafficModel
}
这些字段解释如下:
departureTime
(drivingOptions
对象字面量必须具有此项才有效):用于以Date
对象指定期望出发时间。其值必须设置为当前时间或未来某个时间,而不能是过去的时间。(API 会将所有日期都转换为 UTC,以确保无论时区如何,均提供一致处理。)对于 Google Maps APIs Premium Plan 客户,如果您在请求中包含departureTime
,则 API 会根据该时间内的预期交通状况,返回最佳路线,并且在响应中包含预计交通时间 (duration_in_traffic
)。如果您没有指定出发时间(即:请求中没有包含drivingOptions
),则返回的路线通常是不考虑交通状况条件下的较佳路线。trafficModel
(可选):用于指定计算交通时间时所用的假设条件。此设置影响响应中duration_in_traffic
字段中返回的值,该字段包含根据历史*均值预测的交通时间。默认设置为bestguess
。允许使用以下值:bestguess
(默认值)表示返回的duration_in_traffic
应为在同时考虑已知历史交通状况和实时交通状况的情况下对出行时间做出的最佳估计。departureTime
越接*当前时间,实时交通状况就越重要pessimistic
表示返回的duration_in_traffic
应在大多数日期长于实际出行时间,但在交通状况特别糟糕的日期,可能偶尔会发生超过该值的情况。optimistic
表示返回的duration_in_traffic
应在大多数日期短于实际出行时间,但在交通状况特别理想的日期,可能偶尔会发生小于该值的情况。
下面是针对行车路线的 DirectionsRequest
示例:
{
origin: 'Chicago, IL',
destination: 'Los Angeles, CA',
travelMode: 'DRIVING',
drivingOptions: {
departureTime: new Date(Date.now() + N), // for the time N milliseconds from now.
trafficModel: 'optimistic'
}
}
单位制
默认情况下,使用起点所在国家或地区的单位制来计算和显示路线。(注:以纬度/经度坐标而不是地址表示的起点始终默认采用公制单位。)例如,从“伊利诺斯州芝加哥市”到“安大略省多伦多市”的路线结果将以英里显示,而反向路线结果以公里显示。您可以使用以下某个 UnitSystem
值在请求中显式设置一个单位制来重写此单位制:
UnitSystem.METRIC
:用于指定使用公制单位。以公里为单位显示距离UnitSystem.IMPERIAL
:用于指定使用英制单位。以英里为单位显示距离
注:此单位制设置仅会影响向用户显示的文本。路线结果还包括始终以米为单位表示的距离值,但这些值不向用户显示。
路线的区域偏向
Google Maps API Directions Service 返回的地址结果受到您从中载入 JavaScript 引导程序的域(国家或地区)的影响。(由于大多数用户都会加载 https://maps.google.com/
,因此对于美国用户而言,这就设置了一个隐式域。)如果您是从其他的支持域加载该引导程序的,那么所获得的结果将会受到该域的影响。例如,搜索“San Francisco”时,加载 https://maps.google.com/
(美国)的应用与加载 http://maps.google.es/
(西班牙)的应用可能会返回不同的结果。
您还可以使用 region
参数将“路线”服务设置为返回偏向特定区域的结果。此参数采用一个以 IANA 语言 region
子标记指定的区域代码。大多数情况下,这些标记会直接映射到 ccTLD(“顶级域”)双字符值,例如“co.uk”中的“uk”。某些情况下,region
标记也支持 ISO-3166-1 代码,该代码有时会与 ccTLD 值有所不同(例如,“GB”表示“Great Britain”)。
请查阅 Google 地图覆盖范围数据,确定某个国家/地区支持的路线范围。
呈现路线
如果使用 route()
方法向 DirectionsService
发起路线请求,则必须传递一个在该服务请求完成后执行的回调。此回调将在响应中返回 DirectionsResult
和 DirectionsStatus
代码。
路线查询状态
DirectionsStatus
可能会返回以下值:
OK
:表示响应包含一个有效的DirectionsResult
NOT_FOUND
表示请求的起点、目的地或路径点中指定的至少其中一个位置无法接受地理编码。ZERO_RESULTS
表示在起点与目的地之间未找到路线。MAX_WAYPOINTS_EXCEEDED
:表示DirectionsRequest
中提供的DirectionsWaypoint
字段过多。请参阅下文有关路径点限制的内容。INVALID_REQUEST
:表示提供的DirectionsRequest
无效。出现该错误代码的最常见原因包括:请求中缺少起点或终点;或者公交请求中包括路径点OVER_QUERY_LIMIT
:表示网页在允许的时间段内发送的请求过多REQUEST_DENIED
:表示不允许网页使用路线服务UNKNOWN_ERROR
表示由于服务器发生错误而无法处理路线请求。如果您重试一次,请求可能会成功
您应该在处理结果前检查此值,确保路线查询返回的结果有效。
显示 DirectionsResult
DirectionsResult
包含路线查询结果,您可以自行处理该结果,也可以将其传递到 DirectionsRenderer
对象,该对象会自动处理将该结果显示在地图上。
要使用 DirectionsRenderer
显示 DirectionsResult
,您只需执行以下操作:
- 创建一个
DirectionsRenderer
对象 - 对呈现程序调用
setMap()
,以将其绑定到传递的地图 - 对呈现程序调用
setDirections()
,以向其传递上述DirectionsResult
。呈现程序是一个MVCObject
,它会自动检测其属性发生的任何变化,并在其关联路线更改时更新地图
下例计算了 66 号公路上两个地点之间的路线,其中起点和终点由下拉列表中给定的 "start"
和 "end"
值设置。DirectionsRenderer
处理指定位置之间折线的显示,并将标记放在起点、终点和所有路径点(如适用)上。
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
var chicago = new google.maps.LatLng(41.850033, -87.6500523);
var mapOptions = {
zoom:7,
center: chicago
}
map = new google.maps.Map(document.getElementById('map'), mapOptions);
directionsDisplay.setMap(map);
}
function calcRoute() {
var start = document.getElementById('start').value;
var end = document.getElementById('end').value;
var request = {
origin: start,
destination: end,
travelMode: 'DRIVING'
};
directionsService.route(request, function(result, status) {
if (status == 'OK') {
directionsDisplay.setDirections(result);
}
});
}
在 HTML 正文中:
<div>
<strong>Start: </strong>
<select id="start" onchange="calcRoute();">
<option value="chicago, il">Chicago</option>
<option value="st louis, mo">St Louis</option>
<option value="joplin, mo">Joplin, MO</option>
<option value="oklahoma city, ok">Oklahoma City</option>
<option value="amarillo, tx">Amarillo</option>
<option value="gallup, nm">Gallup, NM</option>
<option value="flagstaff, az">Flagstaff, AZ</option>
<option value="winona, az">Winona</option>
<option value="kingman, az">Kingman</option>
<option value="barstow, ca">Barstow</option>
<option value="san bernardino, ca">San Bernardino</option>
<option value="los angeles, ca">Los Angeles</option>
</select>
<strong>End: </strong>
<select id="end" onchange="calcRoute();">
<option value="chicago, il">Chicago</option>
<option value="st louis, mo">St Louis</option>
<option value="joplin, mo">Joplin, MO</option>
<option value="oklahoma city, ok">Oklahoma City</option>
<option value="amarillo, tx">Amarillo</option>
<option value="gallup, nm">Gallup, NM</option>
<option value="flagstaff, az">Flagstaff, AZ</option>
<option value="winona, az">Winona</option>
<option value="kingman, az">Kingman</option>
<option value="barstow, ca">Barstow</option>
<option value="san bernardino, ca">San Bernardino</option>