座標に関する表記方法として、大きく分けて次のものがある。
- DMS (Degree Minute Second, 緯度経度を度分秒(60進数)を使って表す。ex. 153°59′11″, 24°16′59″)
- DEG (Degree, 緯度経度を10進数の度のみを使って表す。ex. 133.9350, 34.66167)
参考) http://www7a.biglobe.ne.jp/~allegory/dms-deg.html
変換する方法がはっきりしていて、わかりやすいのでさまざまなプログラミング言語で変換の方法が書かれている。
が、Rではどうなのだろう。関数はあるのかしらんと思って調べてみたところ、 {celestial}
パッケージに変換のための関数が用意されていた。それぞれの方法で変換を試みる。
説明のために次のようなデータを用意する。
df_jp <- data.frame(address = c("Tokyo, Japan",
"Okayama, Japan",
"Sapporo, Japan",
"Okinawa, Japan"),
stringsAsFactors = FALSE) %>%
ggmap::mutate_geocode(address)
dplyr::tbl_df(df_jp) %>% kable(format = "markdown")
address | lon | lat |
---|---|---|
Tokyo, Japan | 139.6917 | 35.68950 |
Okayama, Japan | 133.9350 | 34.66167 |
Sapporo, Japan | 141.3469 | 43.06417 |
Okinawa, Japan | 127.8014 | 26.33583 |
library(celestial)
パッケージを読み込んで準備完了。
DEGからDMS
deg2dms(df_jp$lat, type = "cat", sep = "dms")
## [1] "+35d41m22.20s" "+34d39m42.01s" "+43d03m51.01s" "+26d20m08.99s"
# spe 引数で度分秒の区切り文字を指定する
deg2hms(df_jp$lon, type = "cat")
## [1] "09:18:46.01" "08:55:44.40" "09:25:23.27" "08:31:12.33"
変換した値を新たな列として加える。
df_jp %<>% dplyr::mutate(lon_dms = deg2hms(lon, type = "cat"),
lat_dms = deg2dms(lat, type = "cat", sep = "dms"))
DMSからDEG
先ほど同様、変換した値を新規列とする。
df_jp %<>% dplyr::mutate(lon_deg = hms2deg(lon_dms, sep = ":"),
lat_deg = dms2deg(lat_dms, sep = "dms"))
kable(df_jp, format = "markdown")
address | lon | lat | lon_dms | lat_dms | lon_deg | lat_deg |
---|---|---|---|---|---|---|
Tokyo, Japan | 139.6917 | 35.68950 | 09:18:46.01 | +35d41m22.20s | 139.6917 | 35.68950 |
Okayama, Japan | 133.9350 | 34.66167 | 08:55:44.40 | +34d39m42.01s | 133.9350 | 34.66167 |
Sapporo, Japan | 141.3469 | 43.06417 | 09:25:23.27 | +43d03m51.01s | 141.3470 | 43.06417 |
Okinawa, Japan | 127.8014 | 26.33583 | 08:31:12.33 | +26d20m08.99s | 127.8014 | 26.33583 |