libro
www.tuyano.com
Google Apps Scriptプログラミング [中級編]

Googleマップを利用する (8/8)

作成:2012-05-13 10:58
更新:2012-05-13 10:58

■ルート検索を利用する

Googleマップでは、「ルート検索」が行えます。これも、実はGoogle Apps Scriptから利用できるのです。といっても、既に述べたように、リアルタイムに更新される動的な地図は利用できません。得られるのは、ルート検索した結果のデータです。

データにはルートの細々とした情報がまとめられていますので、ここから必要なデータを取り出し、例えば静止画マップにパスとして書きだして表示させる、といったことはもちろん可能です。ただし、得られるデータは非常に複雑な形をしているので、この解析をしっかりやらないといけません。ではルート検索のメソッドを整理しておきましょう。

・DirectionFinderオブジェクトを作成する
変数 = Maps.newDirectionFinder();

・スタート地点を設定する
《DirectionFinder》.setOrigin( 緯度 , 経度 );

・ゴール地点を設定する
《DirectionFinder》.setDestination(緯度 , 経度 );

・ルートを検索する
変数 = 《DirectionFinder》.getDirections();

これで、2つの地点を結ぶルートを検索し、そのデータをとり出すことができます。問題は、得られるデータです。このgetDirectionsで得られるデータは、ざっと整理すると以下のような形になっています。
{
    routes=[
        {
            bounds={
                southwest={ 緯度 , 経度 },
                northeast={ 緯度 , 経度 }
            },
            summary=サマリー,
            copyrights=コピーライト,
            waypoint_order=[],
            legs=[
                {
                    distance={text=距離, value=値},
                    duration={text=時間, value=値},
                    end_location={ 緯度 , 経度 },
                    start_address=住所,
                    end_address=住所,                
                    start_location={ 緯度 , 経度 },
                    via_waypoint=[],
                    steps=[
                        {
                            distance={text=距離, value=値},
                            duration={text=時間, value=値},
                            html_instructions=説明テキスト,
                            end_location={lng=緯度, lat=経度},
                            polyline={points=配列},
                            start_location={lng=緯度, lat=経度},
                            travel_mode=モード
                        },
                        ……必要なだけデータを記述……
                    ],
                 },
                ……必要なだけデータが並ぶ……
            ]
        }
    ],
    status=ステータス
}

オブジェクト内にはroutesというプロパティがあり、そこにルート情報が配列としてまとめられています。legsに各地点の情報がまたオブジェクト配列としてまとめられ、更にその中にあるsteps内に、各ステップごとの情報がオブジェクト配列としてまとめられています。

基本的な処理手順としては、まずroutes配列からオブジェクトを取り出し、その中のlegs配列からオブジェクトを取り出し、その中のsteps配列からオブジェクトを取り出し、必要なデータを見つけて処理する――という、三重にネストされた繰り返し処理となるでしょう。

これは、実際にやってみても何が何だかよくわからないかも知れません。簡単な利用例を下のリストにあげておきます。実行するとスプレッドシート側で2つの地名を尋ねてきます。これらを入力すると、シートのA1セルに、2点のルートを既述したマップのURLが書き出されます。これをクリックして開いてみると、マップが作成されているはずです。

一つ補足が必要なのは、パスを追加していくところの処理でしょう。ここではbeginPathし、繰り返し内でaddPathし、繰り返しを抜けたところでclosePathする、といったやり方をしています。この繰り返し内でのaddPath部分ですが、このようになっていますね。
var path = Maps.decodePolyline(step.polyline.points);
map.addPath(path);
steps配列内のオブジェクトにはpolylineという値があり、そのpointsでパスのデータが得られます。

ここではそれを引数に指定して「Maps.decodePolyline」というメソッドを呼び出しています。addPathには、位置の値を指定する他に「encoded polyline」と呼ばれるものを引数にして折れ線を追加することができます。decodePolylineで位置情報からencoded polylineを生成し、addPathすることができます。

後は、やっていることは簡単ですので、データの構造を考えながら何をどうやっているのか考えてみてください。ルートの形状や各地点の住所地名などを利用できるようになれば、ルートを利用した独自のサービスも設計できそうですね。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

function showDirection(){
  // 2つの地名を入力
  var getname1 = Browser.inputBox("地名", 
      "1つ目の地名を入力:", Browser.Buttons.OK_CANCEL);
  var getname2 = Browser.inputBox("地名", 
      "2つ目の地名を入力:", Browser.Buttons.OK_CANCEL);
  var map = Maps.newStaticMap().setSize(400, 300)
      .setLanguage('ja')
      .setMapType(Maps.StaticMap.Type.HYBRID);
  // Geoコーディングし位置を取得
  var start = Maps.newGeocoder().setRegion("ja").setLanguage("ja").geocode(getname1);
  var end = Maps.newGeocoder().setRegion("ja").setLanguage("ja").geocode(getname2);
  var startpoint = start.results[0].geometry.location;
  var endtpoint = end.results[0].geometry.location;
  // DirectionFinderを作成
  var directions = Maps.newDirectionFinder()
      .setOrigin(startpoint.lat,startpoint.lng)
      .setDestination(endtpoint.lat,endtpoint.lng)
      .getDirections();
  // パスの設定をし、パスの描画を開始
  map.setPathStyle(5, Maps.StaticMap.Color.GREEN, null);
  map.beginPath();
  for (var i in directions.routes) {
    for (var j in directions.routes[i].legs) {
      for (var k in directions.routes[i].legs[j].steps) {
        var step = directions.routes[i].legs[j].steps[k];
        var path = Maps.decodePolyline(step.polyline.points);
        map.addPath(path);
      }
    }
  }
  map.endPath();
  // 2点のマーカーを表示
  map.setMarkerStyle(Maps.StaticMap.MarkerSize.MID,Maps.StaticMap.Color.RED,"A");
  map.addMarker(getname1);
  map.setMarkerStyle(Maps.StaticMap.MarkerSize.MID,Maps.StaticMap.Color.BLUE,"B");
  map.addMarker(getname2);
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var url = map.getMapUrl();
  sheet.getRange("a1").setValue(url);
}

※関連コンテンツ

「Google Apps Scriptプログラミング [中級編]」に戻る