AngularJSを使ってGoogleマップ(7)ルートサービスを使って簡単な徒歩ルートを表示する

ルートサービスを使って、出発地から目的地への徒歩ルートを表示させてみます。

出発地と目的地をSelectボックスで選択すると2地点間の徒歩ルートを地図上に表示するサンプルコードを作ってみます。
 
(1)サンプルコード
 デモ表示へ
①HTML本文

<div ng-controller="MyCtrl">
  <div class="row">
    <div class="col-sm-6">
      <google-map 
        id="map-canvas"
        center="map.center"
        zoom="map.zoom"
        draggable="true"
        options="map.options"
        control="map.control"
      >
      </google-map>
    </div>
    <div class="col-sm-6">
      <form class="form-horizontal" role="form">
        <div class="form-group">
          <label class="col-sm-2 control-label">出発地</label>
          <div class="col-sm-8">
            <select class="form-control" ng-model="routePoints.start" 
                    ng-options="route.name for route in map.routes.start">
            </select>
          </div>
        </div>
        <div class="form-group">
          <label class="col-sm-2 control-label">目的地</label>
          <div class="col-sm-8">
            <select class="form-control" ng-model="routePoints.end" 
                    ng-options="route.name for route in map.routes.end">
            </select>
          </div>
        </div>
        <button ng-click="calcRoute(routePoints)" type="submit" class="btn btn-default">送信</button>
      </form>
    </div>
  </div>
</div>

②スクリプト(js/map7.js)

var mapApp = angular.module('googleMapApp', ['google-maps','ui.bootstrap']);

mapApp.controller("MyCtrl", function ($scope) {

  angular.extend($scope, {
    map: {
      center: {
        latitude: 35.681382,
        longitude: 139.766084
      },
      options: {
        maxZoom: 20,
        minZoom: 3
      },
      zoom: 16,
      control: {},
      routes: {
        start: [
          {name:'東京駅', latlng:'35.6813177190391,139.76609230041504'},
          {name:'大手町駅', latlng:'35.684228393108306,139.76293802261353'}
        ],
        end: [
          {name:'大手門', latlng:'35.68567497604782,139.7612428665161'},
          {name:'二重橋前', latlng:'35.67947017023017,139.75772380828857'}
        ]
      }
    },
    routePoints: {
      start: {},
      end: {}
    }
  });
  $scope.routePoints.start = $scope.map.routes.start[0];
  $scope.routePoints.end = $scope.map.routes.end[0];

  var directionsDisplay = new google.maps.DirectionsRenderer();

  $scope.calcRoute = function (routePoints) {
    var directionsService = new google.maps.DirectionsService();
    directionsDisplay.setMap($scope.map.control.getGMap());
    var start = routePoints.start.latlng;
    var end = routePoints.end.latlng;
    var request = {
      origin: start,
      destination: end,
      travelMode: google.maps.TravelMode.WALKING
    };
    directionsService.route(request, function(response, status) {
      if (status == google.maps.DirectionsStatus.OK) {
        directionsDisplay.setDirections(response);
      }
    });
    return;
  };
});

③CSS

@import url('bootstrap/css/bootstrap.css');
.angular-google-map-container {
  height: 400px;
}

(2)サンプルコードの内容
 
1)出発地、目的地を指定するフォーム(HTML、スクリプト)
 
①ブートストラップ3でレイアウトを設定
 
<div class=”form-group”>、<select class=”form-control”>など。
 
②AngularJSの”ng-options”を使ってselectタグとそれに紐づくoptionタグを生成
 
<select class=”form-control” ng-model=”routePoints.end”
 ng-options=”route.name for route in map.routes.end”>
</select>
 
・スクリプト内の”routes.end”配列からデータを読み出し、optionタグを生成。
 
・Selectタグで選択された値は、”routePoints.end”に保持されてスクリプトに渡される。
 
・Selectタグの初期表示される項目を設定
 
それぞれの配列の最初の値を初期表示させる。
$scope.routePoints.start = $scope.map.routes.start[0];
$scope.routePoints.end = $scope.map.routes.end[0];
 
※詳細は、API Reference / ng / directive / select https://docs.angularjs.org/api/ng/directive/select 参照
 
③フォームの送信ボタンクリックで、ルート計算実行
 
<button ng-click=”calcRoute(routePoints)” type=”submit” class=”btn btn-default”>送信</button>
 
 
2)ルートサービスの使用方法(スクリプト)
 
①ルート計算の条件(出発地、目的地、徒歩/電車などのモード)を設定
 
フォームのSelectボックスで指定された値を取得し、ルート計算の条件を設定
 
var start = routePoints.start.latlng;
var end = routePoints.end.latlng;
var request = {
 origin: start,
 destination: end,
 travelMode: google.maps.TravelMode.WALKING
};
 
②ルートを計算
 
上記①の条件を引数に指定してDirectionsServiceオブジェクトのroute()メソッドを実行。
 
directionsService.route(request, function(response, status) {
 if (status == google.maps.DirectionsStatus.OK) {
  directionsDisplay.setDirections(response);
 }
});
 
※directionsService.routeの書式
directionsService.route(request:DirectionsRequest, callback:function(DirectionsResult, DirectionsStatus))
 
③ルートの計算結果を表示
 
上記②のdirectionsService.routeメソッドのコールバック関数内で処理。
 
ルート計算のステータスを上記コードの”status”(DirectionsStatusオブジェクト)を使って確認し、OKだったらルート結果を地図上に表示。
 
ルート計算の結果は、上記コードの”response”(DirectionsResultオブジェクト)に保持されていて、DirectionsRendererオブジェクトを使って表示。
 
AngularJS、Googleマップの他の記事の目次

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です