GoogleMapのリストからまとめて緯度経度を取得してTableauで可視化しました

現在挑戦しているDATASaberの課題の一環で、TableauPublicへのViz投稿を行いました。
投稿したのは葛飾北斎の富嶽三十六景が描かれた場所を地図にプロットし、リスト化する。というものです(コチラ)


このように、Tableauでは住所や緯度経度といった地理データを使うことで非常に簡単に地図を使った可視化が可能です。
しかしながら今回のように自前で緯度経度データを準備する場合、GoogleMapから一つずつ緯度経度をコピーする作業は非常に面倒で、数が多いとTableauでの可視化の前に力尽きるかもしれません。

というわけで、地点をGoogleMapのリストに追加→リストをCSV出力→GASを使って緯度経度を一括取得という手順でサクッと情報を取得しTableauで可視化させました。せっかくなので記録に残したいと思います


GoogleMapのリストをCSV出力する

いきなりですが、この手順について非常に丁寧にまとめてある記事がNOTE上にありましたのでリンクを貼らせていただきます。
"key" - Google MAPの「自分のリスト」データをCSVに書き出す! -
https://note.com/key_curiosity/n/naeec8f1bf205?sub_rt=share_pw

ダウンロードしたCSVをスプレッドシートで開く

①でダウンロードしたCSVをスプレッドシートで開きます。
後述の手順でもGASを使いますし、スプレッドシート以外だと文字化けすることがありますのでスプレッドシートで開いて内容を確認してみましょう

URLの種類を確認する

GoogleマップのURLには大きく分けて2種類あります。

・「@緯度,経度」が含まれるURL → URLを直接解析可能
「place/」が含まれるURL → APIを利用しないと取得できない

「@緯度,経度」が含まれるURLの場合

URLがこのパターンであれば特別な操作は必要なく緯度経度が取り出せます

https://www.google.com/maps/@35.6894875,139.6917064,15z

この場合、35.6894875,139.6917064 が緯度・経度です。
分割関数を使えば一括処理も可能ですね。

「place/」が含まれるURL の場合

https://www.google.com/maps/place/%E7%B4%AB%E3%82%86%E3%81%8B%E3%82%8A%E3%81%AE%E9%A4%A8%EF%BC%88%E7%B4%AB%E5%BC%8F%E9%83%A8%E3%81%A8%E5%9B%BD%E5%BA%9C%E8%B3%87%E6%96%99%E9%A4%A8%EF%BC%89/data=!4m2!3m1!1s0x5ff8ad6d4a4974dd:0x30e0933ed5de86fe

このURLには緯度・経度の情報が直接含まれていません
Google Maps API を使用して、場所の詳細情報(緯度・経度)を取得する必要がありますので下記の手順に進みます

必要な準備

Google Maps APIを利用するため、Google Cloud Platform(GCP) でAPIキーを取得します。
APIキーの取得手順

  1. GCPコンソール を開く

  2. 新しいプロジェクトを作成(または既存のプロジェクトを選択)

  3. 「APIとサービス」 → 「ライブラリ」 を開く

  4. 「Places API」と「Geocoding API」 を有効化

  5. 「認証情報」 から APIキーを作成

  6. APIキーをコピー(スクリプト内で使用します)

GASスクリプトで緯度・経度を取得

スプレッドシートの設定

  • C列(C2以降)にGoogleマップのURL があることを確認

  • この設定では、D列に緯度、E列に経度 を出力します

スクリプト(Google Apps Script)を記述する

スプレッドシートで「拡張機能」→「Apps Script」を開き、以下のスクリプトをコピーして貼り付けて実行します
"YOUR_GOOGLE_MAPS_API_KEY"には先ほど取得したAPIキーを貼り付けてください

var API_KEY = "YOUR_GOOGLE_MAPS_API_KEY"; // ここにAPIキーを入力

function getLatLngFromPlace() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var urls = sheet.getRange("C2:C" + sheet.getLastRow()).getValues(); // C列のURL
  var output = [];
  
  urls.forEach(function(row) {
    var url = row[0];
    var placeId = extractPlaceId(url);
    if (placeId) {
      var latLng = getLatLngFromPlaceId(placeId);
      output.push([latLng.lat, latLng.lng]);
    } else {
      output.push(["N/A", "N/A"]); // Place ID が取得できない場合
    }
  });

  sheet.getRange("D2:E" + (output.length + 1)).setValues(output); // D列に緯度, E列に経度
}

// URLからPlace IDを取得
function extractPlaceId(url) {
  var regex = /!1s([^/]+)/;
  var match = url.match(regex);
  return match ? match[1] : null;
}

// Place IDから緯度経度を取得
function getLatLngFromPlaceId(placeId) {
  var url = "https://maps.googleapis.com/maps/api/place/details/json?place_id=" + placeId + "&key=" + API_KEY;
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());

  if (json.result && json.result.geometry && json.result.geometry.location) {
    return {
      lat: json.result.geometry.location.lat,
      lng: json.result.geometry.location.lng
    };
  }
  return { lat: "N/A", lng: "N/A" };
}

getLatLngFromPlace() を実行する

設定がうまくいけばD列に緯度、E列に経度が出力されているはずです。

Tableauで可視化する方法

Tableauでデータを取り込む

  1. Tableauを開く

  2. 「データ」→「新しいデータソース」→「テキストファイル」 を選択

  3. 先ほど編集したCSVファイルを選択

地図上にプロット

  1. [緯度(D列)] を「行」、[経度(E列)] を「列」にドラッグ

  2. 自動的に地図が表示される

  3. 「詳細」に「タイトル」をドラッグすると地点が表示される

最後に

いかがでしょうか。Tableauを使えばマップを使ったデータの可視化が非常に簡単にできる上に、GoogleMapとこの方法を組み合わせることでいくつもの地点のデータを簡単に収集することができます。
みなさんもぜひ活用してみてください。


いいなと思ったら応援しよう!