Google Maps V3 之 路线服务

概述

您可以使用 DirectionsService 对象计算路线(使用各种交通方式)。此对象与 Google Maps API 路线服务进行通信,该服务会接收路线请求并返回计算的结果。您可以自行处理这些路线结果,也可以使用 DirectionsRenderer 对象呈现这些结果。

您可以通过文本字符串(例如,“伊利诺斯州芝加哥市”或“澳大利亚新南威尔士州达尔文市”)或 LatLng 值的形式来指定路线的起点和终点。路线服务可以使用一系列路标返回多段路线。路线可以显示为一条在地图上绘制路线的折线,此外,也可以显示为 <div> 元素中的一些文字说明(例如,“右转上中山南路”)。

路线请求

由于 Google Maps API 需要调用外部服务器,因此对路线服务的访问是异步进行的。为此,您需要传递一个回调方法,以便在请求完成时执行。此回调方法将会对结果进行处理。请注意,路线服务可能会以单个 routes[] 数组的形式返回多个可能的行程。

要在 V3 中使用路线,请创建一个类型为 DirectionsService 的对象,并调用 DirectionsService.route() 向路线服务发起请求,同时向其传递一个 DirectionsRequest 对象常量(其中包含输入字词和一个用于在收到响应后执行的回调方法)。

DirectionsRequest 对象常量包含以下字段:

{
  origin: LatLng | String,   destination: LatLng | String,   travelMode: TravelMode,   transitOptions: TransitOptions,   unitSystem: UnitSystem,   waypoints[]: DirectionsWaypoint,   optimizeWaypoints: Boolean,   provideRouteAlternatives: Boolean,   avoidHighways: Boolean,   avoidTolls: Boolean   region: String }

下面对这些字段进行了说明:

  • origin(必填),用于指定计算路线时所用的起始地点。该值可以指定为 String(例如“伊利诺斯州芝加哥市”),也可以指定为 LatLng 值。
  • destination(必填),用于指定计算路线时所用的结束地点。该值可以指定为 String(例如“伊利诺斯州芝加哥市”),也可以指定为 LatLng 值。
  • travelMode(必填),用于指定计算路线时所用的交通方式。下面的出行方式中指明了有效值。
  • transitOptions(可选),用于指定仅适用于其中 travelMode 为 google.maps.TravelMode.TRANSIT 的请求的值。下面的公交选项中说明了有效值。
  • unitSystem(可选),用于指定显示结果时所用的单位制。您可在下面的单位制中指定有效的值。

  • waypoints[](可选),用于指定 DirectionsWaypoint 数组。路标可使路线经过指定地点,从而更改路线。您可将路标指定为带有如下字段的一个对象常量:

    • location,用于以 LatLng 或要进行地理编码的 String 的形式指定路标的位置。
    • stopover(布尔值),用于表示路标是否为路线上的车站(可将该路线一分为二)。

    (有关路标的详情,请参阅下面的在路线中使用路标。)

  • optimizeWaypoints(可选),用于指定可对使用提供的 waypoints 的路线进行优化,以提供尽可能最短的路线。如果该值为 true,那么路线服务将在 waypoints 字段中返回重新排序的 waypoint_order。(有关详情,请参阅下面的在路线中使用路标。)
  • provideRouteAlternatives(可选),用于在设为 true 时指定路线服务可在响应中提供多条备用路线。请注意,提供备用路线可能会增加服务器的响应时间。
  • avoidHighways(可选),用于在设为 true 时表示计算的路线应避开主要公路(如果可能)。
  • avoidTolls(可选),用于在设为 true 时表示计算的路线应避开收费道路(如果可能)。
  • region(可选),用于指定代码,该区域代码已指定为 ccTLD(“顶级域”)双字符值。(有关详情,请参阅下面的区域偏向。)

DirectionsRequest 示例如下所示:

{
  origin: "Chicago, IL",   destination: "Los Angeles, CA",   waypoints: [     {       location:"Joplin, MO",       stopover:false     },{       location:"Oklahoma City, OK",       stopover:true     }],   provideRouteAlternatives: false,   travelMode: TravelMode.DRIVING,   unitSystem: UnitSystem.IMPERIAL }

出行方式

计算路线时,您需要指定要使用的交通方式。目前支持以下出行方式:

  • google.maps.TravelMode.DRIVING默认),用于表示使用道路网络的标准行车路线。
  • google.maps.TravelMode.BICYCLING,用于请求经过骑行道和优先街道的骑行路线。
  • google.maps.TravelMode.TRANSIT,用于请求经过公交路线的路线。
  • google.maps.TravelMode.WALKING,用于请求经过步行街和人行道的步行路线。

请查阅 Google 地图覆盖范围电子表格,确定某个国家/地址支持的路线范围。如果您对该路线类型不适用的区域请求路线,响应将会返回DirectionsStatus="ZERO_RESULTS"。

步行路线有时可能不包含畅通无阻的步行街,因此,如果您未使用默认的 DirectionsRenderer,那么步行路线将会在您应显示的 DirectionsResult 中返回警告。

公交选项

公交服务目前属于“实验性”服务。在此阶段中,我们会设定速率限制以防止 API 滥用。我们最终会基于 API 的公平使用对每次加载地图的总查询次数设定上限。

适用于某一路线请求的选项会根据出行方式的不同而有所区别。在请求公交路线时,将会忽略 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>

转载于:https://www.cnblogs.com/yuzhongwusan/p/8027766.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值