LoginSignup
7
6

More than 1 year has passed since last update.

住所からGPS座標を、逆にGPS座標から住所を求める JXA(JavaScript for Automation)

Last updated at Posted at 2020-02-24

概要

 住所から、そこのGPS座標(ジオタグ)を提供するWebサービスと、逆にGPS座標から住所名を提供するサービスがありますね。
 Google Maps の API などがありますが、無償で利用できるものとして、次の2つを選択しました。

住所やランドマーク名をGPS座標に変換するサービス

 Geocoding.jp
 住所だけでなく、ランドマーク名で、GPS座標が XML 形式で提供されます。

GPS座標から住所を求める

 農研機構の簡易逆ジオコーディングサービス
(従来の「https://www.finds.jp/」 は、2020年4月1日から完全に https://aginfo.cgk.affrc.go.jp/index.html.ja に移行するとのことですが、既にこのURLが使えるようになっています。)
 GPS座標を渡すと、住所が JSON 形式で提供されます。

【追記 2023/4/17】 上記のサイトは閉鎖されました。
 このため、Google Maps と Yahoo! を使う方法を別記事 に記載しました。

ソース

 このソースは OS X の「スクリプトエディタ.app」の JavaScript で書いています。
これをスクリプトエディタで新規に JavaScript としてコピペして、ユーザーディレクトリ、ライブラリー、script フォルダーに保存しておくと、メニューバーのスクリプトアイコンから直接起動できて便利です。

住所やランドマークからGPS座標を求める JavaScript

adrs2gps_java.scpt
// 住所等から緯度、軽度を求める
// https://www.geocoding.jp/ のサービスを利用
// 戻り値は XML 形式

var app = Application.currentApplication()
app.includeStandardAdditions = true

var baseURL = 'https://www.geocoding.jp/api/?q='

var adr = app.displayDialog("住所またはランドマーク名を入力", {defaultAnswer: ""}).textReturned
var ascAdr = encodeURIComponent(adr)
var URL = baseURL + ascAdr

var ans = app.doShellScript('curl -s ' + URL)

if (ans.indexOf('error') > 0) {
	app.displayDialog('該当する住所が見つかりませんでした。')
	} else {
	var jyuusho = ans.split('<address>')[1].split('</address>')[0]
	var ido = ans.split('<lat>')[1].split('</lat>')[0]
	var keido = ans.split('<lng>')[1].split('</lng>')[0]
	app.displayDialog(jyuusho + 'の緯度,経度は\r' + ido + ', ' + keido + ' です。\r緯度,経度をクリップボードにコピーします。')
	app.setTheClipboardTo(ido + ',' + keido)
}


GPS座標から住所を求める JavaScript

gps2adrs_java.scpt
// 緯度、軽度から住所を求める
// https://www.finds.jp/ → https://aginfo.cgk.affrc.go.jp/ws/rgeocode.php のサービスを利用
// 2020/4/1 以降は「https://aginfo.cgk.affrc.go.jp/ws/rgeocode.php」に完全移行
// 戻り値は JSON 形式

var app = Application.currentApplication()
app.includeStandardAdditions = true

var baseURL = '"https://aginfo.cgk.affrc.go.jp/ws/rgeocode.php?json\&'
var latlon = app.displayDialog("緯度,経度を入力", {defaultAnswer: ""}).textReturned
var lat = latlon.split(',')[0]
var lon = latlon.split(',')[1]
var URL = baseURL + 'lat=' + lat + '\&lon=' + lon + '"'
var ans = app.doShellScript('curl -s ' + URL)
var jsonData = JSON.parse(ans)
var adrs = ''
switch (jsonData['status']) {
	case 400: app.displayDialog("データを取得できませんでした。"); break;
	case 200:
	case 202:
		var pname = jsonData['result']['prefecture']['pname']
		if (pname !== undefined) adrs = adrs + pname
		var mname = jsonData['result']['municipality']['mname']
		if (mname !== undefined) adrs = adrs + mname
		try {var locals = jsonData['result']['local'] }
		catch(e) {}
		if (locals !== undefined) {
			for (local in locals) {
				var adrs = adrs + locals[local]['section']
				var adrs = adrs + locals[local]['homenumber']
			}
		}	
		try {var azas = jsonData['result']['aza']}
		catch(e) {}
		if (azas !== undefined) {
			for (aza in azas) {
				adrs = adrs + azas[aza]['name']
			}
		}
		app.displayDialog(lat + ', ' + lon + 'の住所\r' + adrs + '\nをクリップボードにコピーします。')
		app.setTheClipboardTo(adrs)
}

【追記 2023/4/17】 [農研機構の簡易逆ジオコーディングサービス]のサイトは閉鎖されました。
 このため、Google Maps と Yahoo! を使う方法を別記事:(https://qiita.com/ynomura/items/8524e489c17b053f3c6d) に記載しましたので、そちらをご覧ください。

7
6
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
7
6