LoginSignup
7

More than 3 years have passed since last update.

posted at

updated at

住所を地理的座標へ変換するツールを作成しました(Googleマップ+Googleスプレッドシート+Google Geocoding API)

目的

Google Apps ScriptとGoogle Maps Platformの勉強のため、GoogleスプレッドシートとGoogle Maps PlatformGeocoding APIを用いて、住所を地理的座標へ変換するツールを作成してみました。

<2019/09/27追記>
※なお、Geocoding APIは、数千件程度~最大4万件の住所データであれば、1か月の無料枠内で遊ぶことができます。
※4万件を超えるような大量の住所データをジオコーディングする場合は、東京大学空間情報科学研究センターがオープンソースとして提供するジオコーダDAMS(Distributed Address Matching System)等のオンプレミスな環境で実行する方法があります。

Geocoding API

  • 今回は、Google Maps Platformの中でも「プレイス」に分類される「Geocoding API」を使用しています。
  • Geocoding APIは、住所を地理的座標に変換したり、地理的座標から住所を特定したりできます。

Google Apps Script

  • Google Apps Scriptは、Google社が提供するJavaScriptベースのプログラミング言語であり、クラウドサーバ上で動作します。
  • Gmail、Googleスプレッドシート、Googleカレンダー、Googleドライブ、Google翻訳などのGoogleが提供する数々のアプリケーション群をプログラミングにより操作可能です。

実行環境

この記事ではGoogle Apps Scriptを使っています。
コードを実行するためにはGoogle Maps PlatformのAPIキーが必要です。

※Google Maps Platform APIキーの取得・発行についてはこちらを参照してください。
https://www.zenrin-datacom.net/business/gmapsapi/api_key/index.html

前提条件

住所

地理的座標に変換する住所は、道の駅133駅(中部地方)を対象としました。
道の駅

実行方法

入力設定

  • Googleスプレッドシートに住所を入力します。
  • 住所はB列に入力してください。
  • A列、C列、D列の入力内容は任意です。
  • シート名は「address」に変更してください。
  • 実行結果はE列、F列、G列に出力されます。 キャプチャ.PNG

実行

  • Googleスプレッドシートのツール>スクリプトエディタを開いて、下記のソースを貼り付け、「関数を選択」を「Main」にしてスクリプトを実行してください。

  • Googleスプレッドシートへのアクセス権の確認画面が出ますので許可してください。

gas1.gs
//基本的な設定
//**********************************************************************************************
// APIKEYを設定する
var APIKEY = "APIキーを入力する" // APIキー
//**********************************************************************************************

var Address;        // 住所
var ArrAddressLst;  // 住所リスト
var LastRow;        // 最終行

//**********************************************************************************************
// Main関数
// GeocodingAPIを実行する関数
//**********************************************************************************************
function Main() {

  // 住所を設定する
  setaddress();

  // 戻り値を格納する配列
  var ArrRes = [];
  for (var i = 0; i <= LastRow-2; i++) {

    // GeocodingAPI関数による住所と緯度経度の取得
    var data = GeocodingAPI(ArrAddressLst[i][0], APIKEY);

    // 戻り値を配列に格納する
    ArrRes[i] = [];
    ArrRes[i][0] = data[0]; // formatted_address
    ArrRes[i][1] = data[1]; // lat
    ArrRes[i][2] = data[2]; // lng

  }

  // 結果をスプレッドシートに出力する
  var bk = SpreadsheetApp.getActiveSpreadsheet();  // アクティブなスプレッドシートを取得する
  var sh = bk.getSheetByName('address');           // addressシートを取得する

  for (var i = 0; i <= LastRow-2; i++) {
    // 値をセルに入力する
    sh.getRange(i + 2, 5).setValue(ArrRes[i][0]);  // formatted_address
    sh.getRange(i + 2, 6).setValue(ArrRes[i][1]);  // lat
    sh.getRange(i + 2, 7).setValue(ArrRes[i][2]);  // lng
  }

}

//**********************************************************************************************
// 住所を設定する関数
//**********************************************************************************************
function setaddress() {
  // addressシートの内容を配列に格納する
  var bk = SpreadsheetApp.getActiveSpreadsheet();             // アクティブなスプレッドシートを取得する
  var sh = bk.getSheetByName('address');                      // addressシートを取得する
  LastRow = sh.getLastRow();                                  // 最終行を取得する
  // var colLst = sh.getLastColumn();                            // 最終列を取得する

  Logger.log(LastRow);

  // データを配列に格納する
  // Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
  ArrAddressLst = sh.getRange(2, 2, LastRow-1, 1).getValues();

  Logger.log(ArrAddressLst);

}

//**********************************************************************************************
// GeocodingAPI関数
//**********************************************************************************************
function GeocodingAPI(Address, APIKEY){
  // URLを作成する
  var url = "https://maps.googleapis.com/maps/api/geocode/json?language=ja" + 
            "&address=" + Address + 
            "&sensor=false" +
            "&key=" + APIKEY;

  Logger.log(url);

  // HTTPリクエストを行う
  var res  = UrlFetchApp.fetch(url,{muteHttpExceptions:true});
  Logger.log(res); 

  // HTTPレスポンスを文字列として取得、JSON形式の文字列を解析してオブジェクトとして返す
  var json = JSON.parse(res.getContentText()); 
  Logger.log(json);

  if (json["status"] == "OK") {
    var json_formatted_address = json["results"][0]["formatted_address"];
    var json_lat = json["results"][0]["geometry"]["location"]["lat"];
    var json_lng = json["results"][0]["geometry"]["location"]["lng"];

    // 「日本、」「郵便番号」を除外
    var formatted_address = json_formatted_address.split(' ');

    return [formatted_address[1],json_lat,json_lng];

  }
}

実行結果

  • 実行結果はE列、F列、G列に出力されます。
  • E列~G列がGeocodingAPIによりHTTPレスポンスとして受け取った結果になります。
  • E列が住所(formatted_address)になります(formatted_addressに含まれる「日本」や「郵便番号」は除外しています)。
  • F列が緯度(lat)、G列(lng)が経度になります。 キャプチャ2.PNG

留意事項

参考書

詳解! GoogleAppsScript完全入門 ~GoogleApps & G Suiteの最新プログラミングガイド~
Developer Guide(Geocoding API)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7