google map 路線服務

入門指南

使用 Google Maps JavaScript API 中的路線服務以前,首先要確保在爲 Google Maps JavaScript API 設置的同一項目的 Google API Console 中啓用 Google Maps Directions API。javascript

要查看已啓用 API 的列表,請執行如下操做:css

  1. 轉至 Google API Console
  2. 點擊 Select a project 按鈕,而後選擇爲 Google Maps JavaScript API 設置的同一項目並點擊 Open
  3. 在 Dashboard 上的 API 列表中,尋找 Google Maps Directions API
  4. 若是在列表中看到該 API,則大功告成。若是列出該 API,請執行如下操做將其啓用:
    1. 在頁面頂部,選擇 ENABLE API 以顯示 Library 標籤。也可從左側菜單中選擇 Library
    2. 搜索 Google Maps Directions API,而後從結果列表中選擇它。
    3. 選擇 ENABLE。流程完成時,Google Maps Directions API 即會出如今 Dashboard 上的 API 列表中。

使用限額和政策

對於路線服務,具備如下使用限額:html

搭配標準計劃使用路線服務

  • 天天 2,500 次免費請求,按客戶端與服務器端查詢次數之和計算; 啓用計費可得到更高每日配額,按 0.50 美圓/1000 次額外請求計費,每日上限爲 100,000 次請求。
  • 每次請求最多 23 個路徑點,外加起點和終點。
  • 每秒 50 次請求,按客戶端與服務器端查詢次數之和計算。

搭配高級計劃使用路線服務

  • 100,000 個請求的每日免費共享配額(每 24 小時);根據每一年購買的 Maps API 額度提供的額外請求。
  • 每次請求最多容許 23 個路徑點,外加起點和終點。
  • 每一個項目每秒 不受限制 次客戶端請求。請注意,服務器端 API 有每秒 50 次請求的限制。

不管有多少位用戶共享同一項目,均以用戶會話爲單位施加速率限制。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:用於以 LatLnggoogle.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 中返回警告。

公交選項

適用於某一路線請求的選項會根據出行方式的不一樣而有所區別。請求公交路線時,將會忽略 avoidHighwaysavoidTollswaypoints[] 和 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
}

這些字段解釋以下:

  • departureTimedrivingOptions 對象字面量必須具備此項纔有效):用於以 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,您只需執行如下操做:

  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,
    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 value="los angeles, ca">Los Angeles</option>
</select>
</div>

查看示例 (directions-simple.html)

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

 
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,
    center: haight
  }
  map = new google.maps.Map(document.getElementById('map'), 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 == '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>

查看示例 (directions-travel-modes.html)

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,
    center: chicago
  }
  map = new google.maps.Map(document.getElementById('map'), 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: 'DRIVING'
  };
  directionsService.route(request, function(response, status) {
    if (status == 'OK') {
      directionsDisplay.setDirections(response);
    }
  });
}

在 HTML 正文中:

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

查看示例 (directions-panel.html)

DirectionsResult 對象

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

  • geocoded_waypoints[]:包含一個 DirectionsGeocodedWaypoint 對象數組,其中每一個對象均包含有關起點、終點和路徑點的地理編碼詳情
  • routes[]:包含一個 DirectionsRoute 對象數組。每條路線均表示一種從 DirectionsRequest 中所提供的起點到終點的方式。一般,對於任何給定請求,均只會返回一條路線,除非請求的 provideRouteAlternatives 字段設置爲 true(此狀況下,可能會返回多條路線)

通過地理編碼的路線路徑點

DirectionsGeocodedWaypoint 包含有關起點、終點和路徑點的地理編碼詳情。

DirectionsGeocodedWaypoint 是一個帶有如下字段的對象字面量:

  • geocoder_status:表示地理編碼操做所產生的狀態代碼。此字段可能包含如下值:
    • "OK" 表示未出現任何錯誤;已成功解析地址,而且至少返回了一個地理編碼。
    • "ZERO_RESULTS" 表示地理編碼成功,但未返回任何結果。若是向地理編碼器傳遞了一個不存在 address,就可能會發生這種狀況。
  • partial_match 表示雖然地理編碼器可以匹配所請求的地址的一部分,但它未能返回原始請求的精確匹配項。您不妨檢查一下原始請求中是否有拼寫錯誤和/或地址不完整的狀況。

    對於請求中所傳遞的行政區劃內不存在的街道地址,最常發生部分匹配的狀況。當請求與同一行政區劃中的兩個或更多位置相匹配時,也可能會返回部分匹配。例如,「21 Henr St, Bristol, UK」將返回 Henry Street 和 Henrietta Street 這兩項部分匹配結果。請注意,若是請求中包含拼寫錯誤的地址組成部分,地理編碼服務可能會建議一個備選地址。以這種方式觸發的建議也將標記爲部分匹配。

  • place_id:是地點的惟一標識符,可與其餘 Google API 結合使用。例如,您能夠將 place_id 與Google Places API 庫結合使用,以獲取某家當地商家的詳細信息,例如電話號碼、營業時間、用戶評價及更多信息。請參閱地點 ID 概覽
  • types[]:是一個表示所返回結果的類型 的數組。此數組包含一組標記(可能爲零個或多個),用於標識結果中所返回特徵的類型。例如,「芝加哥」的地理編碼返回「locality」,這代表「芝加哥」是一個城市,而且還返回「political」,這代表它是一個政治實體。

路線

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

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

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

  • legs[]:其中包含一個 DirectionsLeg 對象數組,每一個對象均包含關於路線的一段路程(介於給定路線中的兩個位置之間)的信息。指定的每一個路徑點或目的地都有單獨的段與之對應。(沒有任何路徑點的路線將僅包含一個 DirectionsLeg)。每段路程均由一系列 DirectionStep 組成
  • waypoint_order 包含一個數組,用於指示所計算路線內全部路徑點的順序。若是已向 DirectionsRequest 傳遞 optimizeWaypoints: true,那麼此數組可能會包含通過更改的順序
  • overview_path:其中包含一個 LatLng 數組,用於表示所生成路線的近似(平滑處理)路徑
  • overview_polyline:其中包含單個 points 對象,用於儲存以通過編碼的折線表示的路線。此折線是所生成路線的近似(平滑處理)路徑
  • bounds:其中包含一個 LatLngBounds,用於表示沿着此給定路線的折線的邊界
  • copyrights 包含須要爲該路線顯示的版權文本。若是您不使用所提供的 DirectionsRenderer 對象,則必須自行處理和顯示此信息
  • warnings[]:其中包含要在顯示這些路線時顯示的一組警告。若是您不使用所提供的 DirectionsRenderer 對象,則必須自行處理和顯示這些警告
  • fare:其中包含此路線的總交通費用(即總票價)。此屬性只針對公交請求返回,且僅適用於全部公交路程均有票價信息的路線。這些信息包括:
    • currencyISO 4217 幣種代碼,表示票價所採用的幣種
    • value:總票價(以上面指定的幣種爲單位)

路線路程

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

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

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

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

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

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

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

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

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

  • duration_in_traffic:表示考慮當前交通情況條件下此路程的總持續時間。只有在知足全部下列條件時,纔會返回 duration_in_traffic

    • 請求包含有效的 Google Maps APIs Premium Plan 客戶端 ID。
    • 請求不包括停靠路徑點也就是說,它不包括 stopover 爲 true 的路徑點。
    • 請求專用於駕車路線:mode 設置爲 driving
    • departureTime 做爲 drivingOptions 字段的一部分包含在請求中。
    • 能夠得到所請求路線的交通情況

    duration_in_traffic 包含如下字段:

    • value:表示持續時間(以秒爲單位)
    • text:其中包含以可人工讀取形式表示的持續時間
  • arrival_time:其中包含此路程的預計到達時間。該屬性只針對公交路線返回。結果以 Time 對象形式返回,具備如下三個屬性:
    • value:以 JavaScript Date 對象指定的時間
    • text:以字符串形式指定的時間。時間以公共交通車站的時區顯示。
    • time_zone 包含該站的時區。該值就是 IANA 時區數據庫中定義的時區名稱,例如「America/New_York」
  • departure_time:其中包含以 Time 對象指定的此路程的預計出發時間。只會爲公共交通路線提供 departure_time
  • start_location:其中包含以 LatLng 形式表示的此路程起點。因爲路線 Web 服務會使用距起點和終點最近的交通選項(一般爲道路)計算不一樣位置間的路線,所以,start_location 可能與爲該路程提供的起點不一樣,例如,若是道路不靠近起點,這兩個值就有所不一樣
  • end_location:其中包含以 LatLng 形式表示的此路程終點。因爲 DirectionsService 會使用距起點和終點最近的交通選項(一般爲道路)計算不一樣位置間的路線,所以end_location 可能與爲該路程提供的終點不一樣,例如,若是道路不靠近終點,這兩個值就有所不一樣
  • start_address:其中包含以可人工讀取形式表示的該路程起點地址(一般爲街道地址)
  • end_address:其中包含以可人工讀取形式表示的該路程終點地址(一般爲街道地址)

路線路段

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

使用「路線」服務搜索公交路線時,路段數組會以 transit 對象形式包含其餘公交專屬信息。若是路線包含多種交通方式,那麼將在 steps[] 數組中提供針對步行或行車路段的詳細路線。例如,步行分段將包括從開始位置和結束位置開始的路線:「步行前往 Innes Ave & Fitch St」。該路段會在 steps[] 數組中包含上述路線的詳細步行路線,例如:「朝西北方向走」、「左轉進入 Arelious Walker」和「左轉進入 Innes Ave」。

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

  • instructions:其中包含以文本字符串表示的該路段相關說明
  • distance:其中包含該路段與下一個路段之間的距離,以 Distance 對象表示。(請參閱上面 DirectionsLeg 中的說明。)若是距離未知,那麼此字段可能未定義
  • duration:其中包含走完此路段到達下一個路段預計所需的時間,以 Duration 對象表示。(請參閱上面 DirectionsLeg 中的說明。)若是持續時間未知,該字段可能處於未定義狀態。
  • start_location:其中包含以通過地理編碼的 LatLng 形式表示的此路段起點
  • end_location:其中包含以 LatLng 形式表示的此路段終點
  • polyline:其中包含一個 points 對象,用於儲存以通過編碼的折線形式表示的路段。該多段線是分段的近似(平滑)路徑。
  • 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:其中包含公交機構的 URL
    • phone 包含公共交通運營機構的電話號碼

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

  • url:其中包含由公交機構提供的該公交線路的 URL
  • icon:其中包含與該線路相關聯的圖標的 URL。大多數城市都會使用因交通工具類型而異的通用圖標。某些公交線路(例如紐約地鐵系統)具備該線路專用的圖標
  • color:其中包含該公交線路站牌上經常使用的顏色。顏色以十六進制字符串形式指定,例如:#FF0033
  • text_color:其中包含該線路站牌上經常使用的文字顏色。顏色以十六進制字符串形式指定
  • vehicle:其中包含 Vehicle 對象,具備如下屬性:
    • name:其中包含該線路上交通工具的名稱。例如:「地鐵」。
    • type:其中包含該線路所用交通工具的類型。有關受支持值的完整列表,請參閱交通工具類型文檔
    • icon:其中包含一般與該交通工具類型相關聯的圖標的 URL
    • 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 對象,則必須顯示提供行程結果的公交機構的名稱和 URL。

下例繪製了到紐約市某些遊覽勝地的步行路線。咱們會檢查路線的 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,
    center: manhattan
  }
  map = new google.maps.Map(document.getElementById('map'), 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: '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 == "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>

查看示例 (directions-complex.html)

在路線中使用路徑點

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

waypoint 包含如下字段:

  • location(必填):用於指定路徑點的地址
  • stopover(可選):用於表示此路徑點是路線上的實際停靠點 (true),仍是隻是經過指定位置的路線首選項 (false)。停靠點默認設置爲 true

默認狀況下,「路線」服務會按所提供路徑點的給定順序計算通過這些路徑點的路線。或者,您也能夠在 DirectionsRequest 中傳遞 optimizeWaypoints: true,以便讓「路線」服務可以以更有效的順序從新排列這些路徑點,從而對提供的路線進行優化。(此優化用於求解旅行推銷員問題。)行程時間是主要因素而且通過了優化,但在決定哪一條路線最高效時,也可將距離、轉彎次數以及許多其餘因素考慮在內。全部路徑點都必須是停靠點,以便「路線」服務優化它們的路線。

若是您指示「路線」服務對路徑點的順序進行優化,那麼它將在 DirectionsResult 對象中的 waypoint_order 字段內返回優化後的順序。

下例使用各類起點、終點和路徑點計算橫跨美國的越野路線。(要選擇多個路徑點,請按住 Ctrl 並點擊選擇列表中的相應項目。)請注意,咱們會對分別爲各條路線起點和終點提供文本的 routes.start_address 和 routes.end_address 進行檢查。

 
function initMap() {
  var directionsService = new google.maps.DirectionsService;
  var directionsDisplay = new google.maps.DirectionsRenderer;
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 6,
    center: {lat: 41.85, lng: -87.65}
  });
  directionsDisplay.setMap(map);

  document.getElementById('submit').addEventListener('click', function() {
    calculateAndDisplayRoute(directionsService, directionsDisplay);
  });
}

function calculateAndDisplayRoute(directionsService, directionsDisplay) {
  var waypts = [];
  var checkboxArray = document.getElementById('waypoints');
  for (var i = 0; i < checkboxArray.length; i++) {
    if (checkboxArray.options[i].selected) {
      waypts.push({
        location: checkboxArray[i].value,
        stopover: true
      });
    }
  }

  directionsService.route({
    origin: document.getElementById('start').value,
    destination: document.getElementById('end').value,
    waypoints: waypts,
    optimizeWaypoints: true,
    travelMode: 'DRIVING'
  }, function(response, status) {
    if (status === '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>';
      }
    } else {
      window.alert('Directions request failed due to ' + status);
    }
  });
}
 
<div id="map"></div>
<div id="right-panel">
<div>
<b>Start:</b>
<select id="start">
  <option value="Halifax, NS">Halifax, NS</option>
  <option value="Boston, MA">Boston, MA</option>
  <option value="New York, NY">New York, NY</option>
  <option value="Miami, FL">Miami, FL</option>
</select>
<br>
<b>Waypoints:</b> <br>
<i>(Ctrl+Click or Cmd+Click for multiple selection)</i> <br>
<select multiple id="waypoints">
  <option value="montreal, quebec">Montreal, QBC</option>
  <option value="toronto, ont">Toronto, ONT</option>
  <option value="chicago, il">Chicago</option>
  <option value="winnipeg, mb">Winnipeg</option>
  <option value="fargo, nd">Fargo</option>
  <option value="calgary, ab">Calgary</option>
  <option value="spokane, wa">Spokane</option>
</select>
<br>
<b>End:</b>
<select id="end">
  <option value="Vancouver, BC">Vancouver, BC</option>
  <option value="Seattle, WA">Seattle, WA</option>
  <option value="San Francisco, CA">San Francisco, CA</option>
  <option value="Los Angeles, CA">Los Angeles, CA</option>
</select>
<br>
  <input type="submit" id="submit">
</div>
<div id="directions-panel"></div>
</div>
 
#right-panel {
  font-family: 'Roboto','sans-serif';
  line-height: 30px;
  padding-left: 10px;
}

#right-panel select, #right-panel input {
  font-size: 15px;
}

#right-panel select {
  width: 100%;
}

#right-panel i {
  font-size: 12px;
}
 
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
#map {
  height: 100%;
  float: left;
  width: 70%;
  height: 100%;
}
#right-panel {
  margin: 20px;
  border-width: 2px;
  width: 20%;
  height: 400px;
  float: left;
  text-align: left;
  padding-top: 0;
}
#directions-panel {
  margin-top: 10px;
  background-color: #FFEE77;
  padding: 10px;
}
 
 <!-- Replace the value of the key parameter with your own API key. -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap">
</script>
 
function initMap() {
  var directionsService = new google.maps.DirectionsService;
  var directionsDisplay = new google.maps.DirectionsRenderer;
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 6,
    center: {lat: 41.85, lng: -87.65}
  });
  directionsDisplay.setMap(map);

  document.getElementById('submit').addEventListener('click', function() {
    calculateAndDisplayRoute(directionsService, directionsDisplay);
  });
}

function calculateAndDisplayRoute(directionsService, directionsDisplay) {
  var waypts = [];
  var checkboxArray = document.getElementById('waypoints');
  for (var i = 0; i < checkboxArray.length; i++) {
    if (checkboxArray.options[i].selected) {
      waypts.push({
        location: checkboxArray[i].value,
        stopover: true
      });
    }
  }

  directionsService.route({
    origin: document.getElementById('start').value,
    destination: document.getElementById('end').value,
    waypoints: waypts,
    optimizeWaypoints: true,
    travelMode: 'DRIVING'
  }, function(response, status) {
    if (status === '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>';
      }
    } else {
      window.alert('Directions request failed due to ' + status);
    }
  });
}

查看示例 (directions-waypoints.html)

路徑點的限額和限制

執行如下使用限額和限制:

  • 在 Google Maps JavaScript API 中使用路線服務時容許的路徑點數上限爲 23,外加起點和終點。對 Google Maps Directions API 網絡服務的限額相同。
  • 對於 Google Maps Directions API 網絡服務,容許客戶使用 23 個路徑點,外加起點和終點。
  • 容許 Google Maps APIs Premium Plan 客戶使用 23 個路徑點,外加起點和終點。
  • 公交路線不支持路徑點。

可拖動方向

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

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

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

如下代碼顯示的行程起點爲澳大利亞西海岸的 Perth,終點爲東海岸的 Sydney。該代碼會監控 directions_changed 事件,以便更新該行程的所有路程的總距離。

 
function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 4,
    center: {lat: -24.345, lng: 134.46}  // Australia.
  });

  var directionsService = new google.maps.DirectionsService;
  var directionsDisplay = new google.maps.DirectionsRenderer({
    draggable: true,
    map: map,
    panel: document.getElementById('right-panel')
  });

  directionsDisplay.addListener('directions_changed', function() {
    computeTotalDistance(directionsDisplay.getDirections());
  });

  displayRoute('Perth, WA', 'Sydney, NSW', directionsService,
      directionsDisplay);
}

function displayRoute(origin, destination, service, display) {
  service.route({
    origin: origin,
    destination: destination,
    waypoints: [{location: 'Adelaide, SA'}, {location: 'Broken Hill, NSW'}],
    travelMode: 'DRIVING',
    avoidTolls: true
  }, function(response, status) {
    if (status === 'OK') {
      display.setDirections(response);
    } else {
      alert('Could not display directions due to: ' + status);
    }
  });
}

function computeTotalDistance(result) {
  var total = 0;
  var myroute = result.routes[0];
  for (var i = 0; i < myroute.legs.length; i++) {
    total += myroute.legs[i].distance.value;
  }
  total = total / 1000;
  document.getElementById('total').innerHTML = total + ' km';
}
 
<div id="map"></div>
<div id="right-panel">
  <p>Total Distance: <span id="total"></span></p>
</div>
 
#right-panel {
  font-family: 'Roboto','sans-serif';
  line-height: 30px;
  padding-left: 10px;
}

#right-panel select, #right-panel input {
  font-size: 15px;
}

#right-panel select {
  width: 100%;
}

#right-panel i {
  font-size: 12px;
}
 
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
#map {
  height: 100%;
  float: left;
  width: 63%;
  height: 100%;
}
#right-panel {
  float: right;
  width: 34%;
  height: 100%;
}
.panel {
  height: 100%;
  overflow: auto;
}
 
 <!-- Replace the value of the key parameter with your own API key. -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap">
</script>
 
function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 4,
    center: {lat: -24.345, lng: 134.46}  // Australia.
  });

  var directionsService = new google.maps.DirectionsService;
  var directionsDisplay = new google.maps.DirectionsRenderer({
    draggable: true,
    map: map,
    panel: document.getElementById('right-panel')
  });

  directionsDisplay.addListener('directions_changed', function() {
    computeTotalDistance(directionsDisplay.getDirections());
  });

  displayRoute('Perth, WA', 'Sydney, NSW', directionsService,
      directionsDisplay);
}

function displayRoute(origin, destination, service, display) {
  service.route({
    origin: origin,
    destination: destination,
    waypoints: [{location: 'Adelaide, SA'}, {location: 'Broken Hill, NSW'}],
    travelMode: 'DRIVING',
    avoidTolls: true
  }, function(response, status) {
    if (status === 'OK') {
      display.setDirections(response);
    } else {
      alert('Could not display directions due to: ' + status);
    }
  });
}

function computeTotalDistance(result) {
  var total = 0;
  var myroute = result.routes[0];
  for (var i = 0; i < myroute.legs.length; i++) {
    total += myroute.legs[i].distance.value;
  }
  total = total / 1000;
  document.getElementById('total').innerHTML = total + ' km';
}

查看示例 (directions-draggable.html)

 

 

來源:https://developers.google.com/maps/documentation/javascript/directions?hl=zh-CN#Waypoints

相關文章
相關標籤/搜索