京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【R言語とオープンデータ】アメリカ地質調査所が提供する世界中の地震データを地図表示してみた件 〜初心者でもできるオープンデータを使った世界地図の簡単プロット〜

はじめに

R言語を使った、オープンデータと地図可視化というテーマで記事執筆してみました。

オープンデータとしては、 アメリカ地質調査所が提供する、世界中の地震データを活用させてもらいました。 このオープンデータは、CSVデータのURL指定で簡単なスクレイピングで取得できるので楽ちんで利用できます。

オープンデータの関連記事

skume.net

アメリカ地質調査所、および同研究所が提供する世界で発生した地震データのスプレッドシート

 

アメリカ地質調査所(USGS)は、 アメリカ合衆国政府の科学研究機関の一つで、 水文科学、生物学、地質学、地理学の4つの主要な科学分野についての ナチュラル・ハザードを対象とする調査研究を幅広く行なっているらしいです。

今回、USGSが提供している地震データのスプレッドシートを利用させてもらいます。

同研究所HPの「Real-time Notifications, Feeds, and Web Services」 の「Spreadsheet Format」項目から地震データが得られます。

earthquake.usgs.gov

過去何日かと、どの程度のマグニチュード(M)範囲の地震データを取得するかで、 対象データのURLが変わってきます。

以下に、各地震データのURLを示します。

過去1日地震データのスプレッドシートURL

Past Day URL
Significant Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_day.csv
M4.5+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_day.csv
M2.5+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.csv
M1.0+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_day.csv
All Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.csv

過去7日地震データのスプレッドシート

Past 7 Days URL
Significant Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_week.csv
M4.5+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_week.csv
M2.5+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.csv
M1.0+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_week.csv
All Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.csv

過去30日地震データのスプレッドシート

Past 30 Days URL
Significant Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.csv
M4.5+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_month.csv
M2.5+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv
M1.0+ Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_month.csv
All Earthquakes https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.csv

 

今回、過去30日のM4.5+の地震データを使用することにします。

スプレッドシートには、 発生日時、緯度・軽度、マグニチュードに加えて、 関連するメタデータも付随しています。

leafletパッケージを使って、地震データを地図上に表示させる

実行環境

以下のMac/RStudioの実行環境で行なっています。

#RStudioターミナル上のR環境
R version 4.1.2 (2021-11-01) -- "Bird Hippie"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin17.0 (64-bit)

関連パッケージのインストール

地図表示には、leafletパッケージを用いています。

Leafletは、インタラクティブマップ表示のための人気のJavaScriptライブラリの1つで、Leaflet for RはR環境で簡単に使えるように設計されています。

The New York Times や The Washington Post から GitHub や Flickr まで、 またOpenStreetMap や Mapbox、CartoDB などの GIS 専門サイトでも使用されています。

インストール方法はCRANとGitHubからの選べる2タイプです。

#CRANパッケージのインストール(安定版)
install.packages("leaflet")
library(leaflet)

##GitHubパッケージのインストール(開発版)
install.packages("devtools")
devtools::install_github("rstudio/leaflet")
library(leaflet)

#その他パッケージ
install.packages("htmltools")
library(htmltools)

今回は、CRANパッケージの方を使用しました。

USGSの地震スプレッドシート(csvダイル)を読み込み

上記の通り、過去30日のM4.5+地震のCSVデータを使います。

地震データの緯度・経度の位置情報をもとに、 地震の発生場所を地図上にプロットして、各メタデータもポップアップできるようにします。

要するに、 世界のどこで、どの程度の地震が発生したのかを地図上に可視化してみます。

さて、R環境で実行していきます。

#地震データのURL定義
csv_path <- "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_month.csv"

#CSV読み込み
Earthquakes <- read.table(file=csv_path, header = T, sep = ",")

#ヘッダー表示
head(Earthquakes)

#                      time latitude longitude   depth mag magType nst gap  dmin  rms net
#1 2022-08-16T08:34:12.247Z -22.4001  170.3261  34.758 5.0      mb  37 115 2.671 1.18  us
#2 2022-08-16T07:13:09.474Z  10.2714  125.5214  78.941 4.6      mb  49 116 3.182 1.14  us
#3 2022-08-16T07:09:48.807Z -54.8013  158.5708  10.000 5.2      mb  27  93 0.377 0.67  us
#4 2022-08-16T07:02:09.836Z -21.6775 -178.5008 438.673 4.5      mb  64  91 3.113 0.65  us
#5 2022-08-16T03:46:26.016Z -31.3193 -177.8050  10.000 4.7      mb  20 151 2.053 0.97  us
#6 2022-08-16T03:44:36.298Z  13.2068  -89.5779  59.953 4.6     mwr  38 193 0.462 0.57  us
#          id                  updated                            place       type
#1 us6000ib98 2022-08-16T08:53:12.040Z southeast of the Loyalty Islands earthquake
#2 us6000ib8x 2022-08-16T07:58:07.066Z 8 km SSW of Tubajon, Philippines earthquake
#3 us6000ib8t 2022-08-16T07:52:45.069Z          Macquarie Island region earthquake
#4 us6000ib8s 2022-08-16T07:41:25.040Z                      Fiji region earthquake
#5 us6000ib81 2022-08-16T04:17:21.040Z          Kermadec Islands region earthquake
#6 us6000ib7v 2022-08-16T05:58:35.878Z                      El Salvador earthquake
#  horizontalError depthError magError magNst   status locationSource magSource
#1           11.41      5.995    0.094     38 reviewed             us        us
#2           10.96      7.416    0.066     69 reviewed             us        us
#3            7.60      1.869    0.122     22 reviewed             us        us
#4           12.56      6.868    0.057     90 reviewed             us        us
#5           11.91      1.968    0.126     19 reviewed             us        us
#6            5.96      5.740    0.071     19 reviewed             us        us

地図プロットの作成には、実際に、 2列目のlatitude(緯度)、3列目のlongitude(経度)、5列目のmag(マグニチュード)、place(場所)などのメタデータを使っていきます。

地震データの地図表示 (1) clusterOptions無しで作図する

leafletパッケージで地図プロットを描く際に、 マーカーのclusterOptionsのON/OFFで結構見た目が変わってしまいます。

そこで、それぞれの条件で、マップ表示を作成することにしました。

まずは、clusterOptionsが「OFF」の場合で実行していきます。

#地図の下準備
#head(Earthquakes)
Earthquakes <- Earthquakes[rev(order(Earthquakes$mag)),]
map <- leaflet::leaflet(Earthquakes) %>% addTiles()

#取得時間: addControl用のタイトルhtml作成
tim <- base::substr(Earthquakes[rev(order(Earthquakes$time)),][1,1], 
                    start=1, stop=16)
title <- tags$p(tags$style("p {color: black; font-size:12px}"), tags$b(tim))

##ラベル作成
Lab <- paste0("日時: ", Earthquakes$time, "<br>",
              "場所: ", Earthquakes$place, "<br>",
              "マグニチュード: ", Earthquakes$mag, "<br>",
              "深さ: ", Earthquakes$depth)

#マーカーサイズ(1)
size1 <- (2^Earthquakes$mag)*600

#カラーパレット
pal <- leaflet::colorNumeric(palette="Reds", domain=Earthquakes$mag)

#地図作成: clusterOptions無し
map1 <- map %>% 
    addProviderTiles(providers$OpenMapSurfer) %>% 
    addCircles(lng=~longitude,lat=~latitude,
                     radius=size1, color=~pal(Earthquakes$mag), weight=1, 
                     stroke = TRUE, fillOpacity = 0.4, 
                     popup = Lab,
                     label =  ~as.character(mag),
                     labelOptions = labelOptions(noHide = F, direction = 'center', textOnly = T)) %>% 
     addMiniMap(position="bottomright", width = 75, height = 75) %>% 
     addLegend(position='topright', pal=pal, values=~Earthquakes$mag, title="mag", opacity = 0.6) %>% 
    addControl(title, position = "bottomleft" )

#地図表示
map1

#地図の保存
htmlwidgets::saveWidget(map1, "./map1.html", selfcontained = F)

地震データの地図表示 (1)の出力例

図下のURLをクリックするとhtmlマップが表示され、ズームイン・ズームアウトもできます。

https://kumes.github.io/Blog/R_map_leaflet/map1.html

バヌアツあたりの拡大マップです。

地震データの地図表示 (2) clusterOptions有りで作図する

続いて、clusterOptionsが「ON」の場合で実行していきます。

#マーカーサイズ(2)
size2 <- (2^Earthquakes$mag)/2

#地図作成: clusterOptions有り
map2 <- map %>% 
    addProviderTiles(providers$OpenMapSurfer) %>% 
    addCircleMarkers(lng=~longitude,lat=~latitude,
                     radius=size2, color="#09f", weight=1,
                     clusterOptions = markerClusterOptions(),
                     popup=Lab,
                     label =  ~as.character(mag),
                     labelOptions = labelOptions(noHide = T, direction = 'center', textOnly = T)
                     ) %>% 
    addMiniMap(position="bottomright", width = 75, height = 75) %>% 
    addControl(title, position = "bottomleft" )

#地図表示
map2

#地図の保存
htmlwidgets::saveWidget(map2, "./map2.html", selfcontained = F)

地震データの地図表示 (2)の出力例

図下のURLをクリックするとhtmlマップが表示され、ズームイン・ズームアウトもできます。

https://kumes.github.io/Blog/R_map_leaflet/map2.html

日本の関東地方を拡大してみました。

地震マップ可視化の自作関数化

以下の実行で、上記と同じマップが得られます。

#ブラウザでRコードを見る
browseURL("https://gist.github.com/kumeS/47785a19a29e0f943b0a3ea695ddf8cf")

#自作関数のソース
source("https://gist.githubusercontent.com/kumeS/47785a19a29e0f943b0a3ea695ddf8cf/raw/db58c921e62863b45566758c6afed61395512f4c/Earthquakes.map.R")

#Type=1: 地図作成でclusterOptions無し
Earthquakes.map(Type=1)

#Type=2: 地図作成でclusterOptions有り
Earthquakes.map(Type=2)

#Type=3: 地図作成 old-version
Earthquakes.map(Type=3)

まとめ

今回、R環境下で地図を描く時に便利なツールとして、 leafletパッケージを紹介しました。 地震データ以外のオープンデータと組み合わせることで、 様々なシーンで活用できそうです。

また、kazutanさんの公開ページや公式ドキュメントも見ると、色々と参考になります。

参考資料

rstudio.github.io

kazutan.github.io

stackoverflow.com