LoginSignup
4
2

More than 5 years have passed since last update.

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

Posted at

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

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

紹介記事

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

【図1 - 取得前】
image.png

【図2 - 取得後】
image.png

実際のコード

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));
    }
  }
}
4
2
0

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
  3. You can use dark theme
What you can do with signing up
4
2