Rで座標から標高を取得する

R
Published

November 27, 2024

標高を求めるプログラム

サーバサイドで経緯度から標高を求めるプログラム

2通りの方法でやってみます。

httrjsonliteを使用する

httrパッケージはweb API利用のために広く用いられてきたパッケージです。 現在は更新が停止されており、後述のhttr2への移行が推奨されています。 また、jsonliteはAPIで取得したJSONという形式のデータを扱いやすくするパッケージです。

もしインストールがまだの場合は、install.packageでインストールし、ライブラリを読み込みます。

install.packages(c("httr", "jsonlite"))
library(httr)
library(jsonlite)

座標を経度が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秒待つ
}

使い方は、引数に経度と緯度を指定するだけです。

result <- get_elevation(138.7275, 35.3606)
print(result$elevation)
[1] 3764.5
print(result$hsrc)
[1] "5m(レーザ)"

リスト形式で返ってきます。 elevationに標高、hsrcに取得ソースが入っています。 基本的にはelevationだけで十分ですね。

Back to top