なぜか3年ごとに同様の記事を書いている気がするが、以前の記事を書いてから Google Maps の無料扱いが微妙に変化して、以前の API-Key では動作しなくなっていて、新たに API-Key の取得もちょっと面倒だった。
3年前の投稿記事
今度は、Open streat map のサービスを利用
Open streat map についてはこちらを
https://openstreetmap.jp/
API-Key を取得することなく使えるので、敷居は低い。このプロジェクトに感謝します。
さっそくソースコードを
JXA(JavaScript for Automation)のコードはこちら。
//
// 緯度、軽度から住所を求める
//
// 戻り値は JSON 形式
var app = Application.currentApplication();
app.includeStandardAdditions = true;
var latlon = app.displayDialog("緯度,経度を入力", {defaultAnswer: ""}).textReturned;
var lat = latlon.split(',')[0].trim();
var lon = latlon.split(',')[1].trim();
var url = `"https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lon}&zoom=18&addressdetails=1&accept-language=ja"`;
var ans = app.doShellScript('curl -s ' + url);
var data = JSON.parse(ans);
var a = data.address;
// 日本の住所体系に合わせた並びに
var parts = [
a.province || a.prefecture || "",
a.county || "",
a.city || a.town || a.village || a.suburb || "",
a.quarter || a.neighbourhood || a.road || ""
];
var joined = parts.join("").trim();
var adrs = joined || data.display_name.split(',')[0];
app.displayDialog(latlon + 'の住所\r' + adrs + '\nをクリップボードにコピーします。')
app.setTheClipboardTo(adrs)
使い方
上記のソースコードを「スクリプトエディタ」の新規のスクリプトにコピペする。
この時、スクリプトの種類を AppleScript ではなく、JavaScript にする。
あとは、保存して実行するだけ。
ダイアログが出たら、緯度と経度をカンマ区切りで入力する。
(入力例)

「OK」ボタンを押すと、結果が出力されます。

結果として盛岡市役所付近の住所が表示されました。
「OK」ボタンを押すと、住所の部分だけクリップボードにコピーされます。
ソースの簡単な解説
Open streat map から返ってくる値は、JSON 形式なので、"display_name" キーにはまとまった形式があるが、項目順が日本の形式とは逆順になっている(カンマ区切りテキスト)。
これを取り出して逆順にする方法もあるのだが、「道路名」まで付いてくることが多い。
Street map というくらいなので、仕方がないので、個別に取り出すようにしている。
ただし、"quarter" も "neighbourhood" のどちらも無いときには道路名を表示するようにしていますが、不要ならその部分 "a.road ||" を削除してお使いください。
なんなら、"display_name" を使うように改造もできます。
コメント歓迎
これで、API-Kay を取得するという面倒なことをせずに逆ジオコーディングが利用できます。
このような素晴らしい環境を提供してくれている Open streat map に支援しましょう。
お気づきの点や、誤りの指摘など歓迎します。