【Google AppSheet備忘録】Automation編3:Yahoo 位置情報APIを使った逆ジオコーディング

AppSheet

AppSheetで撮影した写真から緯度経度を取得し、Yahoo!のリバースジオコーダAPIで逆ジオコーディングを行い、撮影場所の住所やランドマーク情報を自動で記録・地図表示できる仕組みを作ったときの備忘録です。
このページでは、Apps Scriptのコードと、AppSheet側の設定Yahoo APIの使い方を中心に記録しています。

スポンサーリンク

この記事でやること

  • AppSheetで撮影と同時に緯度経度を自動取得
  • 取得した位置情報をApps Script経由でYahoo!位置情報APIに送信
  • 返ってきた住所とランドマーク情報をアプリに反映
  • AppSheetのマップビューで撮影地点を可視化

使ったもの

項目内容
AppSheetフォーム入力・位置情報取得・Automation実行
Yahoo!リバースジオコーダAPI位置座標 → 住所取得
Yahoo!ローカルサーチAPI位置座標 → 周辺施設情報
Apps ScriptAPIの呼び出しとレスポンス処理

Apps Scriptのコード

function getAddressFromYahoo(lat, lng) {
  var appId = PropertiesService.getScriptProperties().getProperty("APP_ID");
  var url = "https://map.yahooapis.jp/geoapi/V1/reverseGeoCoder" +
            "?lat=" + lat +
            "&lon=" + lng +
            "&appid=" + appId +
            "&output=json";

  try {
    var response = UrlFetchApp.fetch(url); // APIリクエストを送信
    var json = JSON.parse(response.getContentText()); // レスポンスをJSON形式で解析

    if (json.Feature && json.Feature.length > 0) {
      Logger.log(json.Feature[0].Property.Address);
      return json.Feature[0].Property.Address; // 住所を取得
    } else {
      return "住所が取得できません";
    }
  } catch (e) {
    Logger.log("エラー: " + e.message); // エラーをログに記録
    return "エラーが発生しました";
  }
}

function getNearestPlaceFromYahoo(lat, lng, dist) {
  var appId = PropertiesService.getScriptProperties().getProperty("APP_ID");
  var url = "https://map.yahooapis.jp/search/local/V1/localSearch" +
            "?appid=" + appId +
            "&lat=" + lat +
            "&lon=" + lng +
            "&dist=" + dist +
            "&output=json" +
            "&sort=geo"; // 距離順でソート

  try {
    var response = UrlFetchApp.fetch(url); // APIリクエストを送信
    var json = JSON.parse(response.getContentText()); // レスポンスをJSON形式で解析

    if (json.Feature && json.Feature.length > 0) {
      var nearestPlace = json.Feature[0]; // 距離順にソートされているため、最初の要素が一番近い場所
      Logger.log(json.Feature[0].Name);
      return json.Feature[0].Name
    } else {
      return "検索結果が見つかりませんでした";
    }
  } catch (e) {
    Logger.log("エラー: " + e.message); // エラーをログに記録
    return "エラーが発生しました";
  }
}

※ Yahoo! APIのClient ID(アプリケーションID)は事前に取得して、スクリプトプロパティに保存しておく必要があります。

AppSheet側の設定

AppSheetでは、写真の撮影と同時に緯度経度を自動取得し、その情報を使ってBotからApps Script関数を実行する構成にしています。

① テーブルのカラム構成

カラム名Type内容・式
IDText= UNIQUEID()(主キー)
日時DateTime= NOW()(写真撮影日時)
写真Imageフォームからアップロード
位置情報LatLong= HERE()(写真撮影時の現在地)
緯度Decimal= LAT([位置情報])
経度Decimal= LONG([位置情報])
住所AddressAPIのレスポンスを格納
ランドマークTextAPIのレスポンスを格納
日付Date= Date([日時])(カレンダー表示用)

②データの設定位置情報はLATLONG型の列にHERE()で取得。

仮想列を作成しLAT、LONG関数で緯度と経度に分割

③ トリガー

AppSheetで写真と位置情報が入力されたときに自動でBotが発動。

④ Function

BotからApps Scriptを呼び出す。住所取得とランドマーク取得は別関数で。引数に経度と緯度を渡す

関数例:

getAddressFromYahoo(Lat([位置情報]), Long([位置情報]))
getNearestPlaceFromYahoo(Lat([位置情報]), Long([位置情報]), 1.0)

⑤結果の保存

スクリプトの返り値を「住所」列と「ランドマーク名」列に保存


呼び出す構成にしておくことで、住所と施設名の両方を別々に取得・保存できるようにしています。

この記事ではまったこと

  • 「逆ジオコーディング」という言葉を知らなかった
    → 住所 → 緯度経度が「ジオコーディング」、その逆が「逆ジオコーディング」
  • YahooデベロッパーズネットワークでのAPIキー取得がやや手間だった(申請ページの場所や手順がわかりづらい)
  • ローカルサーチAPIのdistパラメータが必須だったことに注意が必要
  • distの単位はkmなので、500m以内の検索には0.5を指定する必要あり
  • 最終的に「一番近い場所を1件だけ返す」ことで精度も実用性もクリアできた

その他注意点

  • Yahoo APIの使用回数制限: 無料枠では1アプリケーションあたり1日最大5,000回(APIごとに異なる)まで。アクセス頻度が高い場合は注意。
  • 商用利用制限: 多くのYahoo APIは商用利用不可、または事前申請が必要。 公開アプリや有償サービスでの利用時は、Yahoo!デベロッパーズサイトを必ず確認。

まとめ

この記事では、AppSheetで撮影した写真に緯度経度を自動付与し、Yahoo! APIでその場の住所とランドマークを取得する仕組みを紹介しました。
マップ表示まで自動化できたことで、旅行の思い出や現地の記録がより豊かなものになりました。

アプリとしての完成形(例:旅行記録アプリなど)は、以下書籍で出版中です。

導入手順も詳しく書いていますので、ぜひ手に取って見てください。

コメント

タイトルとURLをコピーしました