昨日、Tokyo.Rでrayshader入門というタイトルでLTしてきました。 これはその中のスライドの1枚ですが、つくりながら「ラスタデータ系のパッケージなんでこんないっぱいあるの??」と思ったので、ざっくり調べたことと感想をメモっておきます。
r-spatial と rspatial
ちょっと遠回りな話から始めますが、R の GIS 系の GitHub organization には r-spatial と rspatial の2つがあることをご存知でしょうか? これは、それぞれ別のグループによって作られたものです。ざっくり、r-spatial には sf や mapview や stars などの最近できたパッケージがあり、rspatial には主に raster と terra がある、というイメージです。
これらは過去に統合を議論されたこともあるようですが、別に敵対しているわけではないものの、それぞれ別々に開発しているものなので別々にしておいた方が楽だよね、ということでそのままになっています。
I find the best metaphor for the R community that of an ecosystem. There's collaboration, chaos, and competition. (Why is the raster package hosted under "rspatial"? · Issue #25 · r-spatial/discuss · GitHub)
そして、こうした状況は r-spatial と rspatial に限ったものではなく、たとえば rgdal とか rgeos は GitHub 上にはなくR-forge で開発が行われています。 それぞれ微妙に機能がかぶっていたりしますが、別々の場所で開発されているので役割分担もなかなか難しいようです。 以下の issue は「パッケージがたくさんあってどれを選べばいいのかユーザーは悩むので、 geo 版の tidyverse をつくるぞ!」というものですが、 けっきょく結論は出ないままクローズされています。
まあ多様性という観点ではいいことだと思うんですが、ユーザーとしては実際どのパッケージを選べばいいか悩みますよね。 今回の「raster、stars、terraのどれを使えばいいの?」というのはまさにそういう話なわけです。
各パッケージの概要
では雰囲気がわかったところでそれぞれのパッケージを軽く見ていきましょう。
raster パッケージ
raster は古くからの定番パッケージです。CRANのアーカイブを見ると、初回のリリースは2010年3月10日となんと10年以上前です。 とりあえず枯れてはいるので使って安全なパッケージではあると思います。
stars パッケージ
stars は、sf パッケージの作者 Edzer Pebesma 氏による時空間データを扱うためのパッケージです。 sf と同じく、 dplyr 用のメソッドが用意されていたりして tidyverse に慣れている人には使いやすそうです。 初回の CRAN リリースは 2018年7月25日 です。
raster パッケージとの違いは README でも触れられていますが、
- ラスタ以外の時空間データも扱える
- ラスタのさまざまな属性も扱える
- 不規則な形状(球面座標など)のラスタデータも扱える
というあたりが違いのようです。特にrasterパッケージを置き換えるものとして作られたわけではないとのことですが、 機能の対照表を見ると主要な機能はすでにカバーされてそうな雰囲気です*1。
terra パッケージ
terra は、 raster パッケージの作者 Robert Hijmans 氏が raster パッケージの後継としてつくったパッケージです。 開発自体は数年前からやっていたようですが、初回の CRAN リリースは 2020年3月20日とかなり最近です。
raster パッケージとの違いは、README 曰く、
simpler and much faster
とのことです。抽象的...
まあしかし、実際触ってみた感じ速いし、関数もrast()
とvect()
とかシンプルでわかりやすくなっています。
ここまでのまとめ
- raster: 古参。昔からあるのでさすがにバグも出尽くしてそう。
- stars: 高機能。dplyr で扱える。
- terra: シンプルで速い。まだ開発中。
結局どれを使えばいいの??
ここは目的や好みによると思いますが、今の個人的な感触では、 stars が機能が揃っていて一番使いやすいかなーという気がしています。
まず、terra はまだベータリリースなので必要な関数がなかったりする、ということがあります。
たとえば、チュートリアルにはoverlay()
という関数が載っていてもまだ実装されていなかったり、
違う解像度のラスタ画像を結合するのによく使うmosaic()
がなかったり、といったあたりにわたしは先日苦しみました(ただの個人的な怨恨)
あと、ベクタデータの扱いも気になっています。terra は、ラスタデータ用と言いつつベクタデータ用の関数も提供しています。
これは、ラスタデータに対して crop()
や mask()
といった操作をするためには結局ベクタデータが必要になるからですが、
シンプルなケースはいいとして、少し複雑なこと(バッファをつくるとか)をしようと思うと結局 sf が必要になるのでは?という予感がします。
vect()
で sf のデータを terra のベクタデータに変換するだけとはいえ、そうなると、sf と同じ感覚で操作できる stars の方が覚えること少なくてよさそうな気がしませんか。
....というのが軽く触ってみた私の感想なんですが、普段からラスタデータを扱っているわけではないのであまり確信はありません。 識者からのツッコミをお待ちしています!