GASでリバースジオコーディングしてみた


今回はタイトル通り、
GASを使ってリバースジオコーディングする方法を紹介します!
GoogleMapsはクレジットカードが手間だったのでこの方法を試してみました。

以下様々なGASの記事を紹介してます!
https://bzbot.work/

紹介記事

今回紹介している記事は以下です!
https://bzbot.work/2019/02/22/gas-reversegeocoder/

【図1 - 取得前】

【図2 - 取得後】

実際のコード

GAS
//*** http://express.heartrails.com/api.html 路線
//*** http://express.heartrails.com/api/xml?method=getStations&x=139.645683&y=35.443591 sampleAPIレスポンス


//*** http://geoapi.heartrails.com/api.html 緯度経度
//*** http://geoapi.heartrails.com/api/xml?method=searchByGeoLocation&x=139.77456498&y=35.68381981 sampleAPIレスポンス

var sheet = SpreadsheetApp.getActiveSheet();
function getGeocode(){
  var getflg = sheet.getRange(2,2).getValue();
  var test = Browser.msgBox("" + getflg + "」で実行しますか?", "続けますか", Browser.Buttons.OK_CANCEL);
  if (test == 'ok') {
    //緯度経度の最終行を取得して、配列で取得
    var lr = sheet.getLastRow();
    var y = sheet.getRange(4, 1, lr).getValues();
    var x = sheet.getRange(4, 2, lr).getValues();
    var getflg = sheet.getRange(2,2).getValue();

    for(var i = 0; i <= lr-4; i++) {
        var lat = y[i];
        var lon = x[i];
        Logger.log(lat);
        Logger.log(lon);

        //分岐処理(エリアか駅情報か)
        if (getflg === "エリア"){
          //エリア取得Call(引数に緯度経度をトス) ;
          getArea(lat,lon,i)
        }else{
          //駅情報取得Call(引数に緯度経度をトス)  
          getStation(lat,lon,i);
        } 
    }
    if (test == 'cancel') {
      Browser.msgBox("キャンセルを押しました");
    }  
  }

function getArea(y,x,i) {

var url = "http://geoapi.heartrails.com/api/xml?method=searchByGeoLocation&x="+x+"&y="+y; 
  var response = UrlFetchApp.fetch(url);
  //  Logger.log(response.getContentText()); //レスポンス確認用
  var xml = XmlService.parse(response.getContentText());
  var entries = xml.getRootElement().getChildren("location");
  var err = xml.getRootElement().getChildren("error");
  var err_num = Number(err);
    if (err_num === 0.0){
      sheet.getRange(4 + i,3).setValue(entries[0].getChildText("prefecture")); 
      sheet.getRange(4 + i,4).setValue(entries[0].getChildText("city"));
      sheet.getRange(4 + i,5).setValue(entries[0].getChildText("town"));
    }
}


function getStation(y,x,i) {

var url = "http://express.heartrails.com/api/xml?method=getStations&x="+x+"&y="+y; 
  var response = UrlFetchApp.fetch(url);
  //  Logger.log(response.getContentText()); //レスポンス確認用
  // 名前空間
  var namespace = XmlService.getNamespace("urn:heartrails:express");
  var xml = XmlService.parse(response.getContentText());
  var entries = xml.getRootElement().getChildren("station",namespace);
  var err_num = Number(entries);
    if (err_num !== 0.0){
      sheet.getRange(4 + i,6).setValue(entries[0].getChildText("name",namespace)); 
      sheet.getRange(4 + i,7).setValue(entries[0].getChildText("line",namespace));
      sheet.getRange(4 + i,8).setValue(entries[0].getChildText("distance",namespace));
    }
  }
}