使用 Google Maps JavaScript API 中的路线服务以前,首先要确保在为 Google Maps JavaScript API 设置的同一项目的 Google API Console 中启用 Google Maps Directions API。javascript
要查看已启用 API 的列表,请执行如下操做:css
对于路线服务,具备如下使用限额:html
不管有多少位用户共享同一项目,均以用户会话为单位施加速率限制。java
单位会话速率限制可防止将客户端服务用于批量请求。对于批量请求,请使用 Google Maps Directions API 网络服务。数据库
必须按照所介绍的适用于 Google Maps Directions API 的政策使用路线服务。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
包含路线查询结果,您能够自行处理该结果,也能够将其传递到 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>
<option