とある目的地に対して、A地点、B地点それぞれから出発したときの所要時間の差を見たいという要望がありまして、
自動化する方法としてGoogle Maps PlatformのDirections APIを使ってみたのでその備忘録です。
API Keyの取得
公式ドキュメントに手順が書いてあります。
https://developers.google.com/maps/documentation/directions/get-api-key?hl=ja
GCPのコンソールで取得できます。
注意
Google Maps APIの料金体系が2018年6月に変わりまして、従量課金になっています。
他人に勝手にAPI Keyを使われると、「とんでもない金額になっていた。。。」なんてことになりかねません。
とはいえ、ブラウザでAPIを使う場合はKeyを隠すことができないと思われますので、リファラーの設定はきちんと行いましょう。
実装
いつものようにGASでコーディング
コード.gs
function directionsApiCall(start, end) { var api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; var mode = "driving"; var units = "metric"; var language = "ja"; var region = "ja"; var url = "https://maps.googleapis.com/maps/api/directions/json" + "?origin=" + start + "&destination=" + end + "&mode=" + mode + "&units=" + units + "&language=" + language + "®ion=" + region + "&key=" + api_key; var fetch = UrlFetchApp.fetch(url); return JSON.parse(fetch.getContentText()); }
各パラメータについて
公式ドキュメントはこちら
api_key
API Keyを入力してください
mode
交通手段を選択します。デフォルトはdriving(自動車経路)です。他にもwalkingやbicyclingなどがあります。
modeに関するドキュメント
units
単位系の選択ができます。日本で使う場合はメートル法一択(metric)ではないでしょうか。
region, language
地域の選択ができます。
使ってみましょう
上記の関数を使って、レスポンスの中身を見てみたいと思います。
コード.gs
function exec() { var start = "35.689753,139.700390"; var end = "35.633339,139.880317"; var result = directionsApiCall(start, end); // このresultをデバッグモードで覗き見てみるといいと思います。 }
レスポンスについて
中身についてはこんな感じ
{
geocoded_waypoints: {},
routes:{},
status:"OK"
}
status
ここがOKであれば、正常に値が取得できています
routes
実際の道順などが格納されています
geocoded_waypoints
ちょっとまだ中身については把握していませんが、あまり使わないと思うので割愛
routesの中身について
よく使う部分だけ抜粋して紹介します。
{
legs: [
{
distance: {}, // 出発地点から到着地点までの距離
duration: {}, // 出発地点から到着地点までの所要時間
steps: [], // 出発地点から到着地点までの道順
},
],
overview_polyline: {
points: "" // 出発地点から到着地点までの道順をGoogle Mapで表示するためのpolyline
}
}
overview_polylineのつまづきポイント
overview_polylineをGoogle Maps JavaScript APIで表示させようとした場合、まずエンコードされた文字列をデコードする必要があります。
https://developers.google.com/maps/documentation/utilities/polylineutility?hl=ja
その際に、バックスラッシュがエスケープ文字と認識されてしまい、期待通りのpolylineにならないことがあります。そのため、変数に格納する前に、以下のような形でバックスラッシュを更にエスケープしてあげる必要があります。
polyline.replace(/\\/g, "\\\\")
後は、、、
スプレッドシートで始点と終点の緯度経度を記述しておけば、自動で演算ができたりしますね。応用の方法についてはまた別の記事にて書きたいと思います。waypointsとか。