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

相关文章
相关标签/搜索