概述
您可以使用 DirectionsService
对象计算路线(使用各种交通方式)。此对象与 Google Maps API 路线服务进行通信,该服务会接收路线请求并返回计算的结果。您可以自行处理这些路线结果,也可以使用 DirectionsRenderer
对象呈现这些结果。
您可以通过文本字符串(例如,“伊利诺斯州芝加哥市”或“澳大利亚新南威尔士州达尔文市”)或 LatLng
值的形式来指定路线的起点和终点。路线服务可以使用一系列路标返回多段路线。路线可以显示为一条在地图上绘制路线的折线,此外,也可以显示为 <div>
元素中的一些文字说明(例如,“右转上中山南路”)。
路线请求
由于 Google Maps API 需要调用外部服务器,因此对路线服务的访问是异步进行的。为此,您需要传递一个回调方法,以便在请求完成时执行。此回调方法将会对结果进行处理。请注意,路线服务可能会以单个 routes[]
数组的形式返回多个可能的行程。
要在 V3 中使用路线,请创建一个类型为 DirectionsService
的对象,并调用 DirectionsService.route()
向路线服务发起请求,同时向其传递一个 DirectionsRequest
对象常量(其中包含输入字词和一个用于在收到响应后执行的回调方法)。
DirectionsRequest
对象常量包含以下字段:
{
origin: LatLng | String,
destination: LatLng | String,
travelMode: TravelMode,
transitOptions: TransitOptions,
unitSystem: UnitSystem,
waypoints[]: DirectionsWaypoint,
optimizeWaypoints: Boolean,
provideRouteAlternatives: Boolean,
avoidHighways: Boolean,
avoidTolls: Boolean
region: String
}
下面对这些字段进行了说明:
origin
(必填),用于指定计算路线时所用的起始地点。该值可以指定为String
(例如“伊利诺斯州芝加哥市”),也可以指定为LatLng
值。destination
(必填),用于指定计算路线时所用的结束地点。该值可以指定为String
(例如“伊利诺斯州芝加哥市”),也可以指定为LatLng
值。travelMode
(必填),用于指定计算路线时所用的交通方式。下面的出行方式中指明了有效值。transitOptions
(可选),用于指定仅适用于其中travelMode
为google.maps.TravelMode.TRANSIT
的请求的值。下面的公交选项中说明了有效值。-
unitSystem
(可选),用于指定显示结果时所用的单位制。您可在下面的单位制中指定有效的值。 -
waypoints[]
(可选),用于指定DirectionsWaypoint
数组。路标可使路线经过指定地点,从而更改路线。您可将路标指定为带有如下字段的一个对象常量:location
,用于以LatLng
或要进行地理编码的String
的形式指定路标的位置。stopover
(布尔值),用于表示路标是否为路线上的车站(可将该路线一分为二)。
(有关路标的详情,请参阅下面的在路线中使用路标。)
optimizeWaypoints
(可选),用于指定可对使用提供的waypoints
的路线进行优化,以提供尽可能最短的路线。如果该值为true
,那么路线服务将在waypoints
字段中返回重新排序的waypoint_order
。(有关详情,请参阅下面的在路线中使用路标。)provideRouteAlternatives
(可选),用于在设为true
时指定路线服务可在响应中提供多条备用路线。请注意,提供备用路线可能会增加服务器的响应时间。avoidHighways
(可选),用于在设为true
时表示计算的路线应避开主要公路(如果可能)。avoidTolls
(可选),用于在设为true
时表示计算的路线应避开收费道路(如果可能)。region
(可选),用于指定代码,该区域代码已指定为 ccTLD(“顶级域”)双字符值。(有关详情,请参阅下面的区域偏向。)
DirectionsRequest
示例如下所示:
{
origin: "Chicago, IL",
destination: "Los Angeles, CA",
waypoints: [
{
location:"Joplin, MO",
stopover:false
},{
location:"Oklahoma City, OK",
stopover:true
}],
provideRouteAlternatives: false,
travelMode: TravelMode.DRIVING,
unitSystem: UnitSystem.IMPERIAL
}
出行方式
计算路线时,您需要指定要使用的交通方式。目前支持以下出行方式:
google.maps.TravelMode.DRIVING
(默认),用于表示使用道路网络的标准行车路线。google.maps.TravelMode.BICYCLING
,用于请求经过骑行道和优先街道的骑行路线。google.maps.TravelMode.TRANSIT
,用于请求经过公交路线的路线。google.maps.TravelMode.WALKING
,用于请求经过步行街和人行道的步行路线。
请查阅 Google 地图覆盖范围电子表格,确定某个国家/地址支持的路线范围。如果您对该路线类型不适用的区域请求路线,响应将会返回DirectionsStatus
="ZERO_RESULTS
"。
步行路线有时可能不包含畅通无阻的步行街,因此,如果您未使用默认的 DirectionsRenderer
,那么步行路线将会在您应显示的 DirectionsResult
中返回警告。
公交选项
公交服务目前属于“实验性”服务。在此阶段中,我们会设定速率限制以防止 API 滥用。我们最终会基于 API 的公*使用对每次加载地图的总查询次数设定上限。
适用于某一路线请求的选项会根据出行方式的不同而有所区别。在请求公交路线时,将会忽略 avoidHighways
、avoidTolls
、waypoints[]
和 optimizeWaypoints
选项。您可以通过 TransitOptions
对象常量指定专门针对公交的路线选项。
公交路线具有时效性。只有对于未来的时间才会返回路线。
TransitOptions
对象常量包含以下字段:
{
departureTime: Date,
arrivalTime: Date
}
下面对这些字段进行了说明:
departureTime
(可选),用于以Date
对象的形式指定期望出发时间。如果指定了arrivalTime
,就会忽略departureTime
。如果未对departureTime
或arrivalTime
指定任何值,则默认采用当前时间。arrivalTime
(可选),用于以Date
对象的形式指定期望到达时间。如果指定了到达时间,就会忽略出发时间。
公交 DirectionsRequest
的示例如下所示:
{
origin: "Hoboken NJ",
destination: "Carroll Gardens, Brooklyn",
travelMode: google.maps.TravelMode.TRANSIT,
transitOptions: {
departureTime: new Date(1337675679473)
},
unitSystem: google.maps.UnitSystem.IMPERIAL
}
单位制
默认情况下,使用起点所在国家或地区的单位制计算和显示路线。(注意:以纬度/经度坐标而不是地址表示的起点始终默认采用公制单位。)例如,将以英里显示从“伊利诺斯州芝加哥市”到“安大略省多伦多市”的路线结果,而以公里显示反向路线结果。您可以使用以下某个 UnitSystem
值在请求中显式设置一个单位制,从而覆盖此单位制:
UnitSystem.METRIC
,用于指定使用公制。以公里为单位显示距离。UnitSystem.IMPERIAL
,用于指定使用英制。以英里为单位显示距离。
注意:此单位制设置仅会影响向用户显示的文字。路线结果也包括始终以米为单位表示的距离值,但这些值不向用户显示。
路线的区域偏向
Google Maps API Directions Service 将返回受到您从中载入 JavaScript 启动的域(区域或国家/地区)影响的地址结果。(由于大多数用户都会加载http://maps.google.com/
,因此对于美国用户而言,这就设置了一个隐式域。)如果您是从其他的支持域加载该引导程序的,那么所获得的结果将会受到该域的影响。例如,当加载 http://maps.google.com/
(美国)与加载 http://maps.google.es/
(西班牙)时,搜索“San Francisco”可能会从应用返回不同的结果。
您还可以使用 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
过多。允许的路标数目上限为 8 个,此外还包括起点和终点。Maps API for Business 客户可使用 23 个路标,此外还包括起点和终点。公交路线不支持路标。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,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: chicago
}
map = new google.maps.Map(document.getElementById("map_canvas"), 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: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(result, status) {
if (status == google.maps.DirectionsStatus.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>