この内容は、気象庁の台風情報を、ある時点において取得して、そのまま図示するための一連のコードを実行しています。基本は私の練習のためです。
詳しい情報、および速報については、上記リンクで必ず確認してください。
{rvest}を用いて上記Webページより必要なデータをスクレイピングします。
この後{leaflet}にて描画するために、データを処理します。未熟なため非常に汚く効率が悪いです。だれか教えてください。
{leaflet}にてプロットします。また必要に応じて事前にいくつかデータを準備してます。
必要なパッケージをインストールして実行すれば再現できます。ただし、実行時の時刻でデータを取得しますので、台風の中心位置は再現されません。
# 台風情報
library("dplyr")
library("rvest")
library("stringr")
library("leaflet")
trg <- html("http://www.jma.go.jp/jp/typh/") %>% html_table
tbl1 <- trg[[4]] # テーブルは4番目以降が台風に関するもので、こちらは台風17号
res17 <- data.frame(
timing = tbl1$X1 %>% str_subset("[0-9][0-9]日[0-9][0-9]時"),
lat = tbl1$X2 %>%
str_subset("北緯") %>%
str_extract("[0-9][0-9]\\.[0-9]度") %>%
str_replace("度","") %>%
as.numeric,
lon = tbl1$X2 %>%
str_subset("東経") %>%
str_extract("[0-9][0-9][0-9]\\.[0-9]度") %>%
str_replace("度","") %>%
as.numeric,
hpa = tbl1$X2 %>%
str_subset("hPa") %>%
str_replace("hPa","") %>%
as.numeric,
c_wspeed = tbl1 %>%
dplyr::filter(X1 == "中心付近の最大風速") %>%
dplyr::select(X2) %>%
dplyr::rename(c_wspeed=X2),
m_wspeed = tbl1 %>%
dplyr::filter(X1 == "最大瞬間風速") %>%
dplyr::select(X2) %>%
dplyr::rename(m_wspeed=X2)
)
tbl2 <- trg[[5]] # テーブルは4番目以降が台風に関するもので、こちらは台風18号
res18 <- data.frame(
timing = tbl2$X1 %>% str_subset("[0-9][0-9]日[0-9][0-9]時"),
lat = tbl2$X2 %>%
str_subset("北緯") %>%
str_extract("[0-9][0-9]\\.[0-9]度") %>%
str_replace("度","") %>%
as.numeric,
lon = tbl2$X2 %>%
str_subset("東経") %>%
str_extract("[0-9][0-9][0-9]\\.[0-9]度") %>%
str_replace("度","") %>%
as.numeric,
hpa = tbl2$X2 %>%
str_subset("hPa") %>%
str_replace("hPa","") %>%
as.numeric,
c_wspeed = tbl2 %>%
dplyr::filter(X1 =="中心付近の最大風速" | X1 == "最大風速") %>%
dplyr::select(X2) %>%
dplyr::rename(c_wspeed=X2),
m_wspeed = tbl2 %>%
dplyr::filter(X1 == "最大瞬間風速") %>%
dplyr::select(X2) %>%
dplyr::rename(m_wspeed=X2)
)
# 2つの台風のデータを結合して表示
res <- bind_rows(res17,res18,.id = "id")
res$id <- gsub("1","台風17号", res$id)
res$id <- gsub("2","台風18号", res$id)
knitr::kable(res)
| id | timing | lat | lon | hpa | c_wspeed | m_wspeed |
|---|---|---|---|---|---|---|
| 台風17号 | <07日15時の実況> | 25.0 | 164.2 | 955 | 40m/s(80kt) | 60m/s(115kt) |
| 台風17号 | <08日03時の予報> | 25.3 | 161.6 | 950 | 45m/s(85kt) | 60m/s(120kt) |
| 台風17号 | <08日15時の予報> | 26.2 | 158.7 | 940 | 45m/s(90kt) | 65m/s(130kt) |
| 台風17号 | <09日15時の予報> | 29.0 | 153.2 | 930 | 50m/s(95kt) | 70m/s(135kt) |
| 台風17号 | <10日15時の予報> | 32.5 | 148.9 | 940 | 45m/s(90kt) | 65m/s(130kt) |
| 台風18号 | <07日15時の実況> | 23.8 | 138.6 | 1000 | 18m/s(35kt) | 25m/s(50kt) |
| 台風18号 | <08日03時の予報> | 25.9 | 138.5 | 998 | 18m/s(35kt) | 25m/s(50kt) |
| 台風18号 | <08日15時の予報> | 28.5 | 138.4 | 996 | 20m/s(40kt) | 30m/s(60kt) |
| 台風18号 | <09日15時の予報> | 34.7 | 136.8 | 992 | 23m/s(45kt) | 35m/s(65kt) |
| 台風18号 | <10日15時の予報> | 37.7 | 133.6 | 1000 | 18m/s(35kt) | 25m/s(50kt) |
# leafletで描写
# カラーパレット作成
pal <- colorFactor(c("blue","darkblue"),domain = c("台風17号","台風18号"))
# ポップアップ作成
res <- dplyr::mutate(res, popup = paste(id,timing,paste("中心気圧",hpa, "hPa"),paste("最大風速",c_wspeed),paste("瞬間最大風速",m_wspeed),sep = "<br/>"))
# 説明用テキスト
text <- paste(paste(Sys.time(),"現在の情報です"),"点をクリックすると情報が出ます","詳細は<a href='http://www.jma.go.jp/jp/typh/'>気象庁の台風情報</a>を確認ください。",sep = "<br/>")
m <- leaflet::leaflet(res) %>%
addTiles() %>%
setView(lng = 139.0000, lat = 35.0000, zoom = 4) %>%
addCircleMarkers(
radius = 8,
color =~pal(id), fillOpacity = 0.2,
stroke = TRUE, popup = ~popup
) %>%
addLegend(position = "topright", pal = pal, values = ~id, title = "台風") %>%
addPopups(lng = 125.0000, lat = 42.0000, text,
option = popupOptions(closeButton = FALSE))
## Assuming 'lon' and 'lat' are longitude and latitude, respectively
m
台風がふたつあり、これを同時にプロットするのが意外に苦労しました。{leaflet}はレイヤー構造およびグループ分けができるのですが、いまいち使きれてないです。もうちょっと練習が必要です。