您可使用 DirectionsService
對象計算路線(使用各類交通方式)。此對象與 Google Maps API 路線服務進行通訊,該服務會接收路線請求並返回計算的結果。您能夠自行處理這些路線結果,也可使用 DirectionsRenderer
對象呈現這些結果。javascript
您能夠經過文本字符串(例如,「伊利諾斯州芝加哥市」或「澳大利亞新南威爾士州達爾文市」)或 LatLng
值的形式來指定路線的起點和終點。路線服務可使用一系列路標返回多段路線。路線能夠顯示爲一條在地圖上繪製路線的折線,此外,也能夠顯示爲 <div>
元素中的一些文字說明(例如,「右轉上中山南路」)。html
因爲 Google Maps API 須要調用外部服務器,所以對路線服務的訪問是異步進行的。爲此,您須要傳遞一個回調方法,以便在請求完成時執行。此回調方法將會對結果進行處理。請注意,路線服務可能會以單個 routes[]
數組的形式返回多個可能的行程。java
要在 V3 中使用路線,請建立一個類型爲 DirectionsService
的對象,並調用 DirectionsService.route()
向路線服務發起請求,同時向其傳遞一個 DirectionsRequest
對象常量(其中包含輸入字詞和一個用於在收到響應後執行的回調方法)。數據庫
DirectionsRequest
對象常量包含如下字段:canvas
{ 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
包含了路線查詢的結果,您能夠自行處理該結果,也能夠將其傳遞到 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> <option