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

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

#### 住所やランドマーク名をGPS座標に変換するサービス
　[Geocoding.jp](https://www.geocoding.jp)
　住所だけでなく、ランドマーク名で、GPS座標が XML 形式で提供されます。

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

:::note alert
【追記 2023/4/17】　上記のサイトは閉鎖されました。
　このため、Google Maps と Yahoo! を使う方法を[別記事](https://qiita.com/ynomura/items/8524e489c17b053f3c6d) に記載しました。
:::

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

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

```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
``` 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)
}

```

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