はじめに
以前にMaps関連のクラスを利用した小ネタを2つ紹介しましたが、ElevationSampler
というクラスが残っていました1 ので、自他称日本一低い山の標高を調べてみました。もちろん小ネタです。
目的
まず、何をもって山なのか、日本一低いの根拠は、などツッコミどころはありますが、Wikipediaやこちらの記事を参考に5山をリストアップしました。
- 日和山 宮城県仙台市(3m)
- 天保山 大阪府大阪市(4.5m)※二等三角点のある山としては日本一低い
- 蘇鉄山 大阪府堺市(7m)※一等三角点のある山としては日本一低い
- 大潟富士 秋田県南秋田郡大潟村(0m)※周囲がマイナス標高
- 弁天山 徳島県徳島市(6.1m)※自然の山としては日本一低い
ElevationSampler
を使って上記5山の標高を取得します。
ロジック
標高を取得するためには、まず、地名や施設名から緯度と経度を取得する必要があります。直接標高を取得することができないため、一度Maps.Gecoder
を経由して緯度経度リストを生成します。(念の為住所も取得しています)
const Sh = SpreadsheetApp.getActiveSheet()
const Rng = Sh.getRange('B2:D6') //サンプルのため既定値として設定
const Mts = Rng.getValues()
const latlng = [] //緯度経度格納用配列
Mts.forEach((Mt, i) => {
let res = Maps.newGeocoder().setLanguage('ja').geocode(Mt[0])
latlng.push([res.results[0].geometry.location.lat, res.results[0].geometry.location.lng])
Mts[i][2] = res.results[0].formatted_address
})
次に順次sampleLocation()
にてレスポンス2 を受け取り、標高を取得します。
// JSONサンプル
{
"results" : [
{
"elevation" : 1608.637939453125,
"location" : {
"lat" : 39.73915360,
"lng" : -104.98470340
},
"resolution" : 4.771975994110107
}
],
"status" : "OK"
}
latlng.forEach((p, i) => {
let res = Maps.newElevationSampler().sampleLocation(p[0], p[1])
Mts[i][1] = res.results[0].elevation
})
Rng.setValues(Mts)
Mts
をスプレッドシートに上書きして終了です。
最後に
以下、動作デモになります。
サンプルのため、status="OK"
が前提ですのでエラー処理はしていません。同様に地名も特定できるもの前提ですので、複数候補がある場合の処理は実装していません。
なお、取得結果は日和山 3m→2.2m、天保山 4.5m→3.8m、蘇鉄山 7m→7m、大潟富士 0m→-4.2m、弁天山 6.1m→1.8mとなり、事前に調査した公開データと異なります。多少の誤差はあるとしても、この辺りは何を基準にした公開データ、計測データなのかよくわかりませんね。おそらく純粋な標高データと大潟富士のような比高ということでしょうかね。この場で深堀りすることでもないので詳しい方がいらっしゃいましたらコメント頂けますと幸いです。
[参考]
- Class ElevationSampler | Apps Script | Google Developers
- Overview | Elevation API | Google Developers
- 最も低い山 - Wikipedia
- 日本の低山 TOP5
- 標高と海抜は何を表している?知ることが防災に - ウェザーニュース