Google Maps JavaScript API v3The Google Directions API(ルート検索)
- The Google Directions APIについて〔ルート検索〕
- 指定した2地点間のルートを検索〔交通手段(travelMode)、ルート表示・非表示〕
- 都内のお買いものスポットをルート検索〔waypointsで経由地点指定〕
The Google Directions APIについて
ルート検索
2013/4/15
Google Maps JavaScript API v3 - Directions Service
Directionsサービスは、指定した出発地点から目的地点までのルート検索ができるサービス。 Google Maps APIのルートサービスからのルート検索結果をマップ上に描画できます。 結果のルート情報は、自身で表示することもできますが、DirectionsRendererオブジェクトを使うと簡単にHTML出力できます。
オプションで、交通手段や経由地点の指定も可能です。
指定した2地点間のルートを検索
交通手段(travelMode)、ルート表示・非表示
2013/4/15
originに出発地点、destinationに到着地点を指定すると、その間のルートを検索することができます。
ルート検索の出発地点と到着地点は、文字列(例:東京駅)、あるいはLatLngオブジェクト(例:new google.maps.LatLng(35.681382,139.766084))で指定します。
以下のサンプルでは、「東京駅」から「六本木ヒルズ」までルートを検索し、右カラムにルート検索結果を表示します。 出発地点A・到着地点Bのマーカーをドラッグすると、それぞれの地点を変更されます。
右カラムにあるボタンでルートの表示・非表示、プルダウンで交通手段(自動車、自転車、電車、徒歩)を切り替えられます。
交通手段は4種類あります。省略した場合はデフォルトのDRIVING(自動車)が適用されます。
TravelMode | 説明 |
---|---|
google.maps.DirectionsTravelMode.DRIVING | 自動車。 自転車専用道路と優先道路を使用した自転車ルート。 |
google.maps.DirectionsTravelMode.BICYCLING | 自動車。 自転車専用道路と優先道路を使用した自転車ルート。 |
google.maps.DirectionsTravelMode.TRANSIT | 電車。 公共交通機関を使用したルート。 |
google.maps.DirectionsTravelMode.WALKING | 徒歩。 歩行者専用道路と歩道を使用した徒歩ルート。 |
var request={ origin:startSpot, /* 出発地点 */ destination:endSpot, /* 到着地点 */ travelMode:mode /* トラベルモード */ }; directionsService.route(request, function(response, status) { if (status==google.maps.DirectionsStatus.OK) { directionsDisplay.setDirections(response); } });

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>設置サンプル - GMAPv3 - Directions - 2地点間のルート検索</title> <link rel="stylesheet" type="text/css" href="/content/css/gmapv3.css" /> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> $(function(){ var renderFLG=false; var directionsDisplay; var directionsService=new google.maps.DirectionsService(); var map,mode; var currentDirections=null; var startSpot="東京駅"; var endSpot="六本木ヒルズ"; initialize(); /* 地図初期化 */ function initialize() { var myOptions={ zoom:14, center: new google.maps.LatLng(35.670236,139.749832),//虎の門 mapTypeId: google.maps.MapTypeId.ROADMAP } /* 地図オブジェクト生成 */ map=new google.maps.Map(document.getElementById("map"), myOptions); if(!renderFLG) render(); calcRoute(startSpot,endSpot); } /* ルート検索結果を描画 */ function render(){ dbg("render:"+renderFLG); renderFLG=true; /* ルートをレンダリング */ directionsDisplay=new google.maps.DirectionsRenderer({ "map": map, "preserveViewport": true, "draggable": true }); /* 右カラムにルート表示 */ directionsDisplay.setPanel(document.getElementById("directions_panel")); /* 出発地点・到着地点マーカーが移動された時 */ google.maps.event.addListener(directionsDisplay, 'directions_changed',function() { currentDirections=directionsDisplay.getDirections(); var route=currentDirections.routes[0]; var s=""; for(var i=0; i<route.legs.length; i++) { var routeSegment=i+1; s+=route.legs[i].start_address+'to'; s+=route.legs[i].end_address+'\n'; s+=route.legs[i].distance.text; } dbg("directions_changed:"+s); }); } /* モード変更 */ $("#mode").bind("change",function(){ $(".button-group button").removeClass("active"); calcRoute(startSpot,endSpot); $("#show").addClass("active"); }); /* ルート算出 */ function calcRoute(startSpot,endSpot){ switch($("#mode").val()){ case "driving": mode=google.maps.DirectionsTravelMode.DRIVING; break; case "bicycling": mode=google.maps.DirectionsTravelMode.BICYCLING; break; case "transit": mode=google.maps.DirectionsTravelMode.TRANSIT; break; case "walking": mode=google.maps.DirectionsTravelMode.WALKING; break; } if(!renderFLG) render(); var request={ origin:startSpot, /* 出発地点 */ destination:endSpot, /* 到着地点 */ travelMode:mode /* 交通手段 */ }; /* ルート描画 */ directionsService.route(request, function(response, status) { if (status==google.maps.DirectionsStatus.OK) { dbg(response); directionsDisplay.setDirections(response); }else{ dbg("status:"+status); } }); } /* ルート表示・非表示切り替え */ $(".button-group button").click(function(e){ $(".button-group button").removeClass("active"); var id=$(this).attr("id"); if(id=="show"){ calcRoute(startSpot,endSpot); $(this).addClass("active"); }else{ $(this).addClass("active"); reset(); } }); /* ルート削除 */ function reset(){ currentDirections=null; directionsDisplay.setMap(null); renderFLG=false; } }); var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <style> #map { float:left; width:70%; height:100%; } #side { float:right; width:30%; height:100%; } #side .inner { padding:10px; overflow:auto; } </style> </head> <body> <h1>設置サンプル - GMAPv3 - Directions - 2地点間のルート検索</h2> <p>「東京駅」から「六本木ヒルズ」までルートを検索し、右カラムにルート検索結果を表示します。 出発地点A・到着地点Bのマーカーをドラッグすると、それぞれの地点を変更されます。右カラムにあるボタンでルートの表示・非表示、プルダウンでトラベルモード(自動車、自転車、電車、徒歩)を切り替えられます。</p> <div id="map"><!-- 地図の埋め込み表示 --></div> <div id="side"> <div class="inner"> <p> <label for="mode">モード:<select id="mode" name="mode"> <option value="driving" selected>DRIVING(自動車)</option> <option value="bicycling">BICYCLING (自転車)</option> <option value="transit">TRANSIT(電車)</option> <option value="walking">WALKING(徒歩)</option> </select></label> </p> <div class="button-group"> <button id="show" class="button active">ルート表示</button> <button id="hide" class="button">ルート非表示</button> </div> <div id="directions_panel" style="width:100%"></div> </div> </div><!-- #side --> <br clear="all" /> </body> </html>
都内のお買いものスポットをルート検索
waypointsで経由地点指定
2013/4/15
waypointsを指定すると、出発地点から目的地点までのルートに経由地点をマーカーでたてられます。
ZERO_RESULTS: リクエストした交通手段でのルート検索結果がない場合は、ZERO_RESULTSが返ります。 下記のサンプルでは、自転車ルートで検索すると「ZERO_RESULTS」が返ることがあります。
MAX_WAYPOINTS_EXCEEDED: 出発地点・到着地点に加えて、waypointsに指定できる経由地点は最大8か所までです。 つまり、マーカーは最大10か所立てられます。 それ以上指定すると、多すぎるよとMAX_WAYPOINTS_EXCEEDEDが返ります。 (Google Maps API for Businessでは23か所まで指定できるみたい)
以下のサンプルでは、東京駅から渋谷駅までの間にある、渋谷ヒカリエなど、メジャーな都内のお買いものスポットを経由地点としてwaypointsに指定してルートを検索してみました。 右カラムにあるボタンでルートの表示・非表示、プルダウンでトラベルモード(自動車、自転車、電車、徒歩)を切り替えられます。
各経由地点のルートのリンク押すと、その区間のルートのみ地図上に表示します。
var request={ waypoints:_waypts, /* 経由地点の配列(最大8か所) */ optimizeWaypoints:true, /* 経由地点最適化の有無 */ origin:curStartSpot, /* 出発地点 */ destination:curEndSpot, /* 到着地点 */ travelMode:mode /* 交通手段 */ };

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>設置サンプル - GMAPv3 - Directions - 2地点間のルート検索</title> <link rel="stylesheet" type="text/css" href="/content/css/gmapv3.css" /> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> $(function(){ /* waypts(最大8か所) */ var ary=[ "東京ソラマチ", "お台場", "東京ミッドタウン", "六本木ヒルズ", "赤坂サカス", "恵比寿ガーデンプレイス", "表参道ヒルズ", "渋谷ヒカリエ" ]; var waypts=[]; for (var i=0; i<ary.length; i++) { waypts.push({ location:ary[i], stopover:true }); } var renderFLG=false; var directionsDisplay; var directionsService=new google.maps.DirectionsService(); var map,mode; var oldDirections=[]; var currentDirections=null; var defaultStartSpot="東京駅"; var defaultEndSpot="品川駅"; var curStartSpot,curEndSpot; initialize(); /* 地図初期化 */ function initialize() { var myOptions={ zoom:12, center: new google.maps.LatLng(35.654071,139.749838),//芝公園 mapTypeId: google.maps.MapTypeId.ROADMAP } /* 地図オブジェクト生成 */ map=new google.maps.Map(document.getElementById("map"), myOptions); if(!renderFLG) render(); $("#roots").empty(); var s=""; for(var i=0; i<ary.length; i++){ if(i==0){ start=defaultStartSpot; end=ary[i]; }else if(i==(ary.length-1)){ start=ary[i]; end=defaultEndSpot; }else{ start=ary[i]; end=ary[i+1]; } s+="<li><a href='#' rel='"+start+"==="+end+"'>"+start+"==="+end+"</a></li>"; } $("#roots").empty().append(s); curStartSpot=defaultStartSpot; curEndSpot=defaultEndSpot; calcRoute(); } /* ルート検索結果を描画 */ function render(){ //dbg("render:"+renderFLG); renderFLG=true; /* ルートをレンダリング */ directionsDisplay=new google.maps.DirectionsRenderer({ "map": map, "preserveViewport": true, "draggable": true }); /* 右カラムにルート表示 */ directionsDisplay.setPanel(document.getElementById("directions_panel")); /* 出発地点・到着地点マーカーが移動された時 */ google.maps.event.addListener(directionsDisplay, 'directions_changed',function() { currentDirections=directionsDisplay.getDirections(); var route=currentDirections.routes[0]; var s=""; for(var i=0; i<route.legs.length; i++) { var routeSegment=i+1; s+=route.legs[i].start_address+'to'; s+=route.legs[i].end_address+'\n'; s+=route.legs[i].distance.text; } //dbg("directions_changed:"+s); }); } /* モード変更 */ $("#mode").bind("change",function(){ $(".button-group button").removeClass("active"); calcRoute(); $("#show").addClass("active"); }); /* ルート算出 */ function calcRoute(){ switch($("#mode").val()){ case "driving": mode=google.maps.DirectionsTravelMode.DRIVING; break; case "bicycling": mode=google.maps.DirectionsTravelMode.BICYCLING; break; case "transit": mode=google.maps.DirectionsTravelMode.TRANSIT; break; case "walking": mode=google.maps.DirectionsTravelMode.WALKING; break; } if(!renderFLG) render(); if(curStartSpot==defaultStartSpot && curEndSpot==defaultEndSpot){ console.log("全ルート"); //全ルート _waypts=waypts; }else{ //一部ルート _waypts=[]; } var request={ waypoints:_waypts, optimizeWaypoints:true, origin:curStartSpot, /* 出発地点 */ destination:curEndSpot, /* 到着地点 */ travelMode:mode /* 交通手段 */ }; /* ルート描画 */ directionsService.route(request, function(response, status) { dbg(response); if (status==google.maps.DirectionsStatus.OK) { directionsDisplay.setDirections(response); }else{ alert("その交通手段はリクエスト結果がありません\nstatus:"+status); } }); } /* 区間を選択した時 */ $("#roots").on("click","a",function(e){ var rel=$(this).attr("rel").split("==="); curStartSpot=rel[0]; curEndSpot=rel[1]; calcRoute(); return false; }); /* ルート表示・非表示切り替え */ $(".button-group button").click(function(e){ $(".button-group button").removeClass("active"); var id=$(this).attr("id"); if(id=="show"){ calcRoute(); $(this).addClass("active"); }else{ $(this).addClass("active"); reset(); } }); /* ルート削除 */ function reset(){ currentDirections=null; directionsDisplay.setMap(null); renderFLG=false; } }); var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <style> #map { float:left; width:70%; height:100%; } #side { float:right; width:30%; height:100%; } #side .inner { padding:10px; overflow:auto; } </style> </head> <body> <h1>設置サンプル - GMAPv3 - Directions - 2地点間のルート検索</h2> <p>都内のお買いものスポットのルートを検索し、右カラムにルート検索結果を表示します。マーカーをドラッグすると、それぞれの地点を変更されます。右カラムにあるボタンでルートの表示・非表示、プルダウンでトラベルモード(自動車、自転車、電車、徒歩)を切り替えられます。</p> <div id="map"><!-- 地図の埋め込み表示 --></div> <div id="side"> <div class="inner"> <p> <label for="mode">モード:<select id="mode" name="mode"> <option value="driving" selected>DRIVING(自動車)</option> <option value="bicycling">BICYCLING (自転車)</option> <option value="transit">TRANSIT(電車)</option> <option value="walking">WALKING(徒歩)</option> </select></label> </p> <div class="button-group"> <button id="show" class="button active">ルート表示</button> <button id="hide" class="button">ルート非表示</button> </div> <ol id="roots"> </ol> <div id="directions_panel" style="width:100%"></div> </div> </div><!-- #side --> <br clear="all" /> </body> </html>