Rで座標から標高を取得する
R
2通りの方法でやってみます。
httr
とjsonlite
を使用する
httr
パッケージはweb API利用のために広く用いられてきたパッケージです。 現在は更新が停止されており、後述のhttr2
への移行が推奨されています。 また、jsonlite
はAPIで取得したJSONという形式のデータを扱いやすくするパッケージです。
もしインストールがまだの場合は、install.package
でインストールし、ライブラリを読み込みます。
座標を経度がlongitude
、緯度をlongitude
に入れてその標高を取得してみます。 例として富士山の座標を検索して入れてみました。
longitude <- 138.7275
latitude <- 35.3606
endpoint <- "https://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?"
parameters <- list(lon = longitude, lat = latitude, outtype = "JSON")
response <- GET(url = endpoint, query = parameters)
json_data <- content(response, "text", encoding = "UTF-8")
parsed_data <- fromJSON(json_data)
print(parsed_data)
$elevation
[1] 3764.5
$hsrc
[1] "5m(レーザ)"
3776mではないですが、しっかりとelevation
に標高が入っていることがわかります。 なお、hsrc
は標高データのデータソースです。
httr2
パッケージを使用する
httr2
パッケージを使用してみます。httr
の後継として開発が進んでおり、こちらへの移行が推奨されています。 パイプ演算子というggplot2
などでよく使用するような演算子を使用し、スマートなコードを書くことができるそうです。 私はあまり使わないため、通常通りの書き方で書いてみます。
#install.packages("httr2")
library(httr2)
1req <- request("https://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?")
2req <- req_url_query(req, !!!parameters, .multi = "explode")
3resp <- req_perform(req)
4resp <- resp_body_json(resp)
resp
- 1
-
request
関数にベースとなるURLを指定します - 2
-
req_url_query
関数でパラメータを指定します - 3
-
req_perform
関数でリクエストをサーバー側に送信します - 4
-
resp_body_json
関数で返ってきたJSON形式の値をリスト形式にして見やすくします
$elevation
[1] 3764.5
$hsrc
[1] "5m(レーザ)"
このコードを関数化しておき、簡単に使用できるようにしてみます。
get_elevation <- function(longitude, latitude) {
if (!require(httr2)) {
print("Install the required package httr2.")
install.packages("httr2")
}
require(httr2)
parameters <- list(lon = longitude, lat = latitude, outtype = "JSON")
req <- request("https://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?")
req <- req_url_query(req, !!!parameters, .multi = "explode")
resp <- req_perform(req)
resp <- resp_body_json(resp)
return(resp)
Sys.sleep(0.1) # サーバー負担の回避のため、1秒待つ
}
使い方は、引数に経度と緯度を指定するだけです。
[1] 3764.5
[1] "5m(レーザ)"
リスト形式で返ってきます。 elevation
に標高、hsrc
に取得ソースが入っています。 基本的にはelevation
だけで十分ですね。