Google Maps V3 之 路線服務

概述

您可使用 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 的公平使用對每次加載地圖的總查詢次數設定上限。

適用於某一路線請求的選項會根據出行方式的不一樣而有所區別。在請求公交路線時,將會忽略 avoidHighwaysavoidTollswaypoints[] 和 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,您只需執行如下操做便可:

  1. 建立一個 DirectionsRenderer 對象。
  2. 對呈現程序調用 setMap(),以將其綁定到傳遞的地圖。
  3. 對呈現程序調用 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 value="los angeles, ca">Los Angeles</option> </select> </div>

 

如下示例顯示了從美國加州舊金山的海特 - 黑什伯裏區到海灘之間使用不一樣出行方式的路線:

var directionsDisplay; var directionsService = new google.maps.DirectionsService(); var map; var haight = new google.maps.LatLng(37.7699298, -122.4469157); var oceanBeach = new google.maps.LatLng(37.7683909618184, -122.51089453697205); function initialize() {   directionsDisplay = new google.maps.DirectionsRenderer();   var mapOptions = {     zoom: 14,     mapTypeId: google.maps.MapTypeId.ROADMAP,     center: haight   }   map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);   directionsDisplay.setMap(map); } function calcRoute() {   var selectedMode = document.getElementById("mode").value;   var request = {       origin: haight,       destination: oceanBeach,       // Note that Javascript allows us to access the constant       // using square brackets and a string value as its       // "property."       travelMode: google.maps.TravelMode[selectedMode]   };   directionsService.route(request, function(response, status) {     if (status == google.maps.DirectionsStatus.OK) {       directionsDisplay.setDirections(response);     }   }); }

在 HTML 主體中:

<div> <strong>Mode of Travel: </strong> <select id="mode" onchange="calcRoute();">   <option value="DRIVING">Driving</option>   <option value="WALKING">Walking</option>   <option value="BICYCLING">Bicycling</option>   <option value="TRANSIT">Transit</option> </select> </div>

DirectionsRenderer 不只可處理折線和任何關聯標記的顯示方式,也能夠將路線的文本顯示處理爲一系列路段。爲此,只需對 DirectionsRenderer 調用 setPanel() 便可向其傳遞<div>(用於顯示此信息)。這樣作還可確保顯示相應的版權信息,以及可能與該結果相關聯的任何警告。

該服務將使用瀏覽器的首選語言設置,或在加載 API JavaScript 時使用 language 參數所指定的語言來提供文本路線。(有關詳情,請參閱本地化。)對於公交路線,將按照相應公交站點所在的時區顯示時間。

如下示例與上面顯示的示例相同,但包含了一個用於顯示路線的 <div> 面板:

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);   directionsDisplay.setPanel(document.getElementById("directionsPanel")); } 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(response, status) {     if (status == google.maps.DirectionsStatus.OK) {       directionsDisplay.setDirections(response);     }   }); }

在 HTML 主體中:

<div id="map_canvas" style="float:left;width:70%; height:100%"></div> <div id="directionsPanel" style="float:right;width:30%;height 100%"></div>

DirectionsResult 對象

向 DirectionsService 發送路線請求後,您會收到一個包含了狀態代碼和結果(即 DirectionsResult 對象)的響應。DirectionsResult 是一個帶有如下單個字段的對象常量:

  • routes[] 包含一個 DirectionsRoute 對象數組。每條路線均表示一種從起點到終點(DirectionsRequest 中所提供)的方式。一般,除非請求的 provideRouteAlternatives 字段設爲 true(在這種狀況下,可能會返回多條路線),不然,該服務只會針對全部給定請求返回一條路線。

路線

舊版的 DirectionsTrip 對象已重命名爲 DirectionsRoute。請注意,如今路線是指從開始到結束的整個行程,而不是僅指整個行程中的一段路程。

DirectionsRoute 包含一個從指定起點到指定終點的結果。該路線可包含一段或多段路程(類型爲 DirectionsLeg),具體取決因而否指定了任何路標。除路線信息外,該路線還包含了必須向用戶顯示的版權和警告信息。

DirectionsRoute 是一個包含如下字段的對象常量:

  • legs[],其中包含一組 DirectionsLeg 對象,每一個該對象均包含關於路線的一段路程(介於給定路線中的兩個位置之間)的信息。系統將會針對每一個指定的路標或終點顯示一段單獨的路程(沒有任何路標的路線將僅包含一個 DirectionsLeg)。每段路程均由一系列 DirectionStep 組成
  • waypoint_order,其中包含一個數組,該數組用於表示計算的路線中全部路標的順序。若是已向 DirectionsRequest 傳遞了 optimizeWaypoints: true,那麼此數組可能會包含通過更改的順序。
  • overview_path,其中包含一組 LatLng,用於表示所生成路線的近似(平滑)路徑。
  • bounds,其中包含一個 LatLngBounds,用於表示沿着此給定路線的折線的邊界。
  • copyrights,其中包含要爲該路線顯示的版權文本。若是您不使用提供的 DirectionsRenderer 對象,那麼必須自行處理和顯示此信息。
  • warnings[],其中包含要在顯示這些路線時顯示的一組警告。若是您不使用提供的 DirectionsRenderer 對象,那麼必須自行處理和顯示這些警告。

路線路程

舊版的 DirectionsRoute 對象已重命名爲 DirectionsLeg

DirectionsLeg 用於定義計算的路線中從起點到終點的一段行程路程。對於不包含任何路標的路線,將包含一段「路程」;但對於定義了一個或多個路標的路線,將包含一段或多段路程(與相關行程的特定路程相對應)。

DirectionsLeg 是一個包含如下字段的對象常量:

  • steps[],其中包含 DirectionsStep 對象數組,這些對象用於表示關於行程路程的各單獨路段的信息。
  • distance,用於經過採用如下形式的 Distance 對象來表示該路程包含的總距離:

    • value,用於表示距離(以米爲單位)
    • text,其中包含以字符串形式表示的距離,且默認狀況下以起點所使用的單位顯示。(例如,對於美國內的任何起點,都將使用英里。)您能夠在原始查詢中指定設置 UnitSystem,從而覆蓋此單位制。請注意,不管您使用哪一種單位制,distance.value 字段始終會包含一個以米爲單位表示的值。

    若是距離未知,那麼這些字段可能未定義。

  • duration,用於經過採用如下形式的 Duration 對象來表示該路程的總持續時間:

    • value,用於表示持續時間(以秒爲單位)。
    • text,其中包含以字符串形式表示的持續時間。

    若是持續時間未知,那麼這些字段可能未定義。

  • arrival_time,其中包含此路程的預計到達時間。該屬性只針對公交路線返回。返回的結果採用 Time 對象的形式,其中包含如下 3 個屬性:
    • value,以 JavaScript Date 對象形式指定的時間。
    • text,以字符串形式指定的時間。時間按照相關公交站點所在的時區來顯示。
    • time_zone,其中包含該站點的時區。該值就是 IANA 時區數據庫中定義的時區名稱,例如「America/New_York」。
  • departure_time,其中包含以 Time 對象形式指定的此路程的預計出發時間。departure_time 只適用於公交路線。
  • start_location,其中包含該路程起點的 LatLng。因爲路線網絡服務會使用距起點和終點最近的交通選項(一般爲道路)計算不一樣位置間的路線,所以在道路不靠近該路程提供的起點等狀況下,start_location 可能與該起點不一樣。
  • end_location,其中包含該路程終點的 LatLng。因爲 DirectionsService 會使用距起點和終點最近的交通選項(一般爲道路)計算不一樣位置間的路線,所以在道路不靠近該路程提供的終點等狀況下,end_location 可能與該終點不一樣。
  • start_address,其中包含便於用戶理解的該路程起點地址(一般爲街道地址)。
  • end_address,其中包含便於用戶理解的該路程終點地址(一般爲街道地址)。

路線路段

DirectionsStep 是路線中的最小單元,其中包含用於介紹相應行程中的某個特定說明的單個路段。例如,「在西四街左轉」。這個路段不只介紹了說明,同時也包含有關此路段到下個路段的距離和持續時間信息。例如,一個指示「併入 I-80 West」的路段可能包含距離「37 英里」和持續時間「40 分鐘」的信息,指示下一個路段距離此路段有 37 英里/40 分鐘。

使用路線服務搜索公交路線時,路段數組中會另外包含 transit 對象形式的專門針對公交的信息。若是路線包含多種交通方式,那麼針對步行或行車路段的詳細路線將在steps[] 數組中提供。例如,某個步行路段會包含從起點和終點位置開始的路線:「步行至中山路和人民路」。該路段會在 steps[] 數組中包含上述路線的詳細步行路線,例如:「向西北方向走」、「左轉上解放路」和「左轉上中山路」。

DirectionsStep 是一個包含如下字段的對象常量:

  • instructions,其中包含文本字符串形式的該路段。
  • distance,其中包含該路段與下一個路段之間的距離,以 Distance 對象的形式表示(請參閱上面 DirectionsLeg 中的說明)。若是距離未知,那麼此字段可能未定義。
  • duration,其中包含走完此路段到下一個路段預計所需的時間,以 Duration 對象的形式表示(請參閱上面 DirectionsLeg 中的說明)。若是持續時間未知,那麼此字段可能未定義。
  • start_location,其中包含此路段起點的通過地理編碼的 LatLng
  • end_location,其中包含此路段終點的 LatLng
  • steps[],屬於 DirectionsStep 對象常量,其中包含公交路線中步行或行車路段的詳細路線。子路段只適用於公交路線。
  • travel_mode,其中包含此路段中使用的 TravelMode。公交路線中可包含步行路線與公交路線的組合。
  • path,其中包含 LatLngs 數組,用於描述此路段的路程。
  • transit,其中包含專門針對公交的信息,例如出發和到達時間以及公交線路的名稱。

專門針對公交的信息

公交路線會返回與其餘交通方式無關的額外信息。這些額外屬性是經過 TransitDetails 對象展現的,返回的形式爲 DirectionsStep 的屬性。經過 TransitDetails 對象,您能夠訪問以下所述的 TransitStopTransitLineTransitAgency 和 VehicleType 的更多信息。

公交詳情

TransitDetails 對象包含如下屬性:

  • arrival_stop,其中包含用於表示到達站點的 TransitStop 對象,具備如下屬性:
    • name,用於表示公交站點的名稱。例如:「聯合廣場」。
    • location,用於以 LatLng 的形式表示公交站點的位置。
  • departure_stop,其中包含用於表示出發站點的 TransitStop 對象。
  • arrival_time,其中包含指定爲 Time 對象的到達時間,具備如下三個屬性:
    • value,以 JavaScript Date 對象形式指定的時間。
    • text,以字符串形式指定的時間。時間按照相關公交站點所在的時區來顯示。
    • time_zone,其中包含該站點的時區。該值就是 IANA 時區數據庫中定義的時區名稱,例如「America/New_York」。
  • departure_time,其中包含指定爲 Time 對象的出發時間。
  • headsign,用於指定在這條公交線路上出行的路線,與交通工具或出發站點上的標識同樣。這一般是終點站。
  • headway(若是適用),用於指定目前從同一站點出發的預計間隔時間(以秒爲單位)。例如當 headway 值爲 600 時,若是您錯過了一班公交,那麼預計須要 10 分鐘才能等到下一班。
  • line,其中包含 TransitLine 對象常量,該對象常量中包含了此路段中所用公交路線的相關信息。TransitLine 提供了該路線的名稱和運營方,以及 TransitLine 參考文檔中所述的其餘屬性。
  • num_stops,其中包含此路段中的站點數量。該數量包含到達站點,但不含出發站點。例如,若是您的路線是從站點 A 出發,途經站點 B 和 C,最終到達站點 D,那麼 num_stops 將返回 3。

公交線路

TransitLine 對象包含如下屬性:

  • name,其中包含該公交線路的全名。例如:「7 號大道快線」或「14 路跨市區線」。
  • short_name,其中包含該公交線路的簡稱。這一般是線路編號,例如「2」或「M 14」。
  • agencies,其中包含 TransitAgency 類型數組。每一個 TransitAgency 對象均提供此線路運營方的相關信息,其中包含如下屬性:
    • name,其中包含公交機構的名稱。
    • url,其中包含公交機構的網址。
    • phone,其中包含公交機構的電話號碼。

    若是您要手動呈現公交路線,而不是使用 DirectionsRenderer 對象,那麼必須顯示提供行程結果的公交機構的名稱和網址。

  • url,其中包含由公交機構提供的該公交線路的網址。
  • icon,其中包含與該線路相關聯的圖標的網址。大多數城市都會使用根據交通工具類型而變化的通用圖標。某些公交線路(例如紐約地鐵系統)具備該線路專用的圖標。
  • color,其中包含該公交線路站牌上經常使用的顏色。顏色以十六進制字符串形式指定,例如:#FF0033。
  • text_color,其中包含該線路站牌上經常使用的文字顏色。顏色以十六進制字符串形式指定。
  • vehicle,其中包含 Vehicle 對象,具備如下屬性:
    • name,其中包含該線上交通工具的名稱。例如:「地鐵」。
    • type,其中包含該線路所用交通工具的類型。有關支持值的完整列表,請參閱交通工具類型文檔。
    • icon,其中包含一般與該交通工具類型相關聯的圖標的網址。
    • local_ icon,其中包含與該交通工具類型本地關聯的圖標的網址。

交通工具類型

VehicleType 對象包含如下屬性:

定義
VehicleType.RAIL 鐵路。
VehicleType.METRO_RAIL 輕軌交通。
VehicleType.SUBWAY 地下輕軌。
VehicleType.TRAM 地上輕軌。
VehicleType.MONORAIL 單軌。
VehicleType.HEAVY_RAIL 重軌。
VehicleType.COMMUTER_TRAIN 通勤鐵路。
VehicleType.HIGH_SPEED_TRAIN 高速列車。
VehicleType.BUS 公共汽車。
VehicleType.INTERCITY_BUS 長途客車。
VehicleType.TROLLEYBUS 無軌電車。
VehicleType.SHARE_TAXI 合乘出租車也屬於一種公共汽車,可以在其路線上的任意地方上下乘客。
VehicleType.FERRY 渡船。
VehicleType.CABLE_CAR 一種一般在陸上依靠纜線運行的交通工具。空中纜車能夠算做 VehicleType.GONDOLA_LIFT 類型。
VehicleType.GONDOLA_LIFT 空中纜車。
VehicleType.FUNICULAR 一種由纜線拉上陡坡的交通工具。索道纜車一般由兩個車體組成,彼此做爲對方的平衡重物。
VehicleType.OTHER 其餘全部交通工具均會返回該類型。

檢查 DirectionsResults

您能夠在解析任何路線響應時,檢查和使用 DirectionsResults 組件,其中包括 DirectionsRouteDirectionsLegDirectionsStep 和 TransitDetails

重要提示:若是您要手動呈現公交路線,而不是使用 DirectionsRenderer 對象,那麼必須顯示提供行程結果的公交機構的名稱和網址。

如下示例繪製了到紐約市某個遊覽勝地的步行路線。咱們會檢查路線的 DirectionsStep,以便爲各個路段添加標記,而後經過該路段的說明文本將信息附加到 InfoWindow

因爲咱們要計算的是步行路線,所以也會在單個 <div> 面板中向用戶顯示任何警告。

var map; var directionsDisplay; var directionsService; var stepDisplay; var markerArray = []; function initialize() {   // Instantiate a directions service.   directionsService = new google.maps.DirectionsService();   // Create a map and center it on Manhattan.   var manhattan = new google.maps.LatLng(40.7711329, -73.9741874);   var mapOptions = {     zoom: 13,     mapTypeId: google.maps.MapTypeId.ROADMAP,     center: manhattan   }   map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);   // Create a renderer for directions and bind it to the map.   var rendererOptions = {     map: map   }   directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions)   // Instantiate an info window to hold step text.   stepDisplay = new google.maps.InfoWindow(); } function calcRoute() {   // First, clear out any existing markerArray   // from previous calculations.   for (i = 0; i < markerArray.length; i++) {     markerArray[i].setMap(null);   }   // Retrieve the start and end locations and create   // a DirectionsRequest using WALKING directions.   var start = document.getElementById("start").value;   var end = document.getElementById("end").value;   var request = {       origin: start,       destination: end,       travelMode: google.maps.TravelMode.WALKING   };   // Route the directions and pass the response to a   // function to create markers for each step.   directionsService.route(request, function(response, status) {     if (status == google.maps.DirectionsStatus.OK) {       var warnings = document.getElementById("warnings_panel");       warnings.innerHTML = "" + response.routes[0].warnings + "";       directionsDisplay.setDirections(response);       showSteps(response);     }   }); } function showSteps(directionResult) {   // For each step, place a marker, and add the text to the marker's   // info window. Also attach the marker to an array so we   // can keep track of it and remove it when calculating new   // routes.   var myRoute = directionResult.routes[0].legs[0];   for (var i = 0; i < myRoute.steps.length; i++) {       var marker = new google.maps.Marker({         position: myRoute.steps[i].start_point,         map: map       });       attachInstructionText(marker, myRoute.steps[i].instructions);       markerArray[i] = marker;   } } function attachInstructionText(marker, text) {   google.maps.event.addListener(marker, 'click', function() {     stepDisplay.setContent(text);     stepDisplay.open(map, marker);   }); }

在 HTML 主體中:

<div> <strong>Start: </strong> <select id="start">   <option value="penn station, new york, ny">Penn Station</option>   <option value="grand central station, new york, ny">Grand Central Station</option>   <option value="625 8th Avenue New York NY 10018">Port Authority Bus Terminal</option>   <option value="staten island ferry terminal, new york, ny">Staten Island Ferry Terminal</option>   <option value="101 E 125th Street, New York, NY">Harlem - 125th St Station</option> </select> <strong>End: </strong> <select id="end" onchange="calcRoute();">   <option value="260 Broadway New York NY 10007">City Hall</option>   <option value="W 49th St & 5th Ave, New York, NY 10020">Rockefeller Center</option>   <option value="moma, New York, NY">MOMA</option>   <option value="350 5th Ave, New York, NY, 10118">Empire State Building</option>   <option value="253 West 125th Street, New York, NY">Apollo Theatre</option>   <option value="1 Wall St, New York, NY">Wall St</option> </select> <div>

在路線中使用路標

如 DirectionsRequest 中所述,您也能夠在使用路線服務計算步行、騎行或行車路線時指定路標(類型爲 DirectionsWaypoint)。路標不適用於公交路線。路標可以讓您經過其餘位置計算路線,而在這種狀況下,返回的路線會通過給定的路標。

容許的路標數目上限爲 8 個,此外還包括起點和終點。Maps API for Business 客戶可以使用 23 個路標,此外還包括起點和終點。公交路線不支持路標。

waypoint 包含如下字段:

  • location(必填),用於指定路標的地址。
  • stopover(可選),用於表示此路標是不是路線上的實際停留點 (true),或者僅爲經過指定位置的路線首選項 (false)。默認狀況下,中途停留爲 true

默認狀況下,路線服務會按所提供路標的給定順序計算通過這些路標的路線。或者,您也能夠在 DirectionsRequest 中傳遞 optimizeWaypoints: true,以便以更有效的順序從新排列這些路標,從而讓路線服務對提供的路線進行優化。(此優化用於解決旅行推銷員問題。)全部路標都必須中途停留,以便路線服務優化它們的路線。

若是您指示路線服務對路標的順序進行優化,那麼該順序將返回在 DirectionsResult 對象中的 optimized_waypoints_order 字段內。

如下示例使用各類起點、終點和路標計算跨美國的跨國家/地區路線。(要選擇多個路標,請在選擇列表項時按住 Ctrl 的同時點擊。)請注意,咱們會對分別爲各條路線起點和終點提供文本的 routes.start_address 和 routes.end_address 進行檢查。

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: 6,     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 waypts = [];   var checkboxArray = document.getElementById("waypoints");   for (var i = 0; i < checkboxArray.length; i++) {     if (checkboxArray.options[i].selected == true) {       waypts.push({           location:checkboxArray[i].value,           stopover:true       });     }   }   var request = {       origin: start,       destination: end,       waypoints: waypts,       optimizeWaypoints: true,       travelMode: google.maps.TravelMode.DRIVING   };   directionsService.route(request, function(response, status) {     if (status == google.maps.DirectionsStatus.OK) {       directionsDisplay.setDirections(response);       var route = response.routes[0];       var summaryPanel = document.getElementById("directions_panel");       summaryPanel.innerHTML = "";       // For each route, display summary information.       for (var i = 0; i < route.legs.length; i++) {         var routeSegment = i+1;         summaryPanel.innerHTML += "<b>Route Segment: " + routeSegment + "</b><br />";         summaryPanel.innerHTML += route.legs[i].start_address + " to ";         summaryPanel.innerHTML += route.legs[i].end_address + "<br />";         summaryPanel.innerHTML += route.legs[i].distance.text + "<br /><br />";       }     }   }); }

可拖動路線

若是顯示的騎行、步行或行車路線能夠拖動,用戶就可使用 DirectionsRenderer 動態修改該路線:只需點擊並拖動地圖上的結果路徑,便可選擇和更改路線。要表示呈現程序容許顯示可拖動路線,請將該程序的 draggable 屬性設爲 true。公交路線沒法設爲可拖動。

若是路線能夠拖動,那麼用戶能夠選中已呈現的結果路徑上的任意點(或路標),而後將指示的部分移動到新的位置。系統會動態更新 DirectionsRenderer,以顯示通過修改的路徑。鬆開鼠標後,系統會向地圖添加一個過渡路標(表示爲一個白色小標記)。選中並移動某段路徑將會更改該路線的路程,而選中並移動路標標記(包括起點和終點)將會更改通過該路標的路線的路程。

因爲可拖動路線是在客戶端進行修改並呈現的,所以您可能須要監控並處理 DirectionsRenderer 上的 directions_changed 事件,以便在用戶修改了所顯示的路線時得到通知。

如下代碼顯示了從悉尼到新南威爾士州內地的往返行程。該代碼會監控 directions_changed 事件,以便更新該行程的所有路程的總距離。

var rendererOptions = {   draggable: true }; var directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);; var directionsService = new google.maps.DirectionsService(); var map; var australia = new google.maps.LatLng(-25.274398, 133.775136); function initialize() {   var mapOptions = {     zoom: 7,     mapTypeId: google.maps.MapTypeId.ROADMAP,     center: australia   };   map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);   directionsDisplay.setMap(map);   directionsDisplay.setPanel(document.getElementById("directionsPanel"));   google.maps.event.addListener(directionsDisplay, 'directions_changed', function() {     computeTotalDistance(directionsDisplay.directions);   });   calcRoute(); } function calcRoute() {   var request = {     origin: "Sydney, NSW",     destination: "Sydney, NSW",     waypoints:[{location: "Bourke, NSW"}, {location: "Broken Hill, NSW"}],     travelMode: google.maps.TravelMode.DRIVING   };   directionsService.route(request, function(response, status) {     if (status == google.maps.DirectionsStatus.OK) {       directionsDisplay.setDirections(response);     }   }); } function computeTotalDistance(result) {   var total = 0;   var myroute = result.routes[0];   for (i = 0; i < myroute.legs.length; i++) {     total += myroute.legs[i].distance.value;   }   total = total / 1000.   document.getElementById("total").innerHTML = total + " km"; }

 

 

 

 原文:http://blog.csdn.net/manbufenglin/article/details/8651637

相關文章
相關標籤/搜索