주소를 지리적 좌표로 변환하는 도구를 만들었습니다(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 키의 취득・발행에 대해서는 이쪽을 참조해 주세요.
    htps //w w. 젠린 다다코 m. 네 t/부시넷 s/g마 p사피/아피_케 y/그리고 x. HTML

    전제 조건



    주소



    지리적 좌표로 변환하는 주소는, 미치노에키 133역(중부 지방)을 대상으로 했습니다.
    미치노에키

    실행 방법



    입력 설정


  • Google 스프레드시트에 주소를 입력합니다.
  • 주소는 B 열에 입력하십시오.
  • A열, C열, D열의 입력 내용은 임의입니다.
  • 시트 이름을 "address"로 변경하십시오.
  • 실행 결과는 E, F, G 열로 출력됩니다.


  • 실행


  • 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)이 경도가 됩니다.


  • 유의사항


  • Geocoding API는 1개월 $200분의 무료 크레딧 범위에서 최대 40,000개 호출
  • ※무료 프레임을 넘어 API를 사용하면 과금되므로 주의해 주세요(>_<)

  • 참고서



    자세히 알아보기! GoogleAppsScript 완전 입문 ~ GoogleApps & G Suite의 최신 프로그래밍 가이드 ~
    개발자 가이드(Geocoding API)

    좋은 웹페이지 즐겨찾기