-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path01-introduction-ja.Rmd
More file actions
393 lines (317 loc) · 48.3 KB
/
01-introduction-ja.Rmd
File metadata and controls
393 lines (317 loc) · 48.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
```{asis index-2, echo=knitr::is_latex_output()}
\mainmatter
```
# はじめに {#intro}
```{r, include=FALSE}
source("code/before_script.R")
```
本書は、コンピュータの力を使って地理データで<u>何かを行う</u>方法について書かれている。
地理データの読み書きと何らかの処理、静的およびインタラクティブな地図の作成、実世界の問題を解決するためのジオコンピュテーション\index{じおこんぴゅてーしょん@ジオコンピュテーション} の適用、地理現象のモデリングなど、交通や環境系など多様な空間スキルを教える。
本書は、様々な地理的操作をどのようにリンクさせることができるかを、文章に挟まれた再現可能な「コードチャンク」で示す。このことにより、透明性のある、したがって科学的なワークフローも教えてくれる。
本書は、ジオコンコンピュテーションのために<u>既存のツール</u>の利点を活用することだけにとどまらない。地理データ構造、および地理データ処理によってソフトウェアを理解し、<u>新しいツール</u>を開発する際に必要なソフトウェアを理解する。
本書全体で解説するコマンドライン駆動のアプローチと、Chapter \@ref(algorithms)\index{あるごりずむ@アルゴリズム} で解説するプログラミングにより、ソフトウェアによって課された創造性の制約を取り除くことができる。
本書を読み、演習問題を解いた後は、読者が現実の課題に取り組むためにスキルを応用し、地図とコードで作業をこなし、再現可能かつフリーソフトウェア活動に参加する準備ができることを期待している。
地理空間用のフリー&オープンソースソフトウェア (FOSS4G\index{FOSS4G}) はここ数十年の間に驚くほどのスピードで進歩している。
OSGeo のような組織のおかげで、応用地理技術はもはや高価なハードウェアやソフトウェアを持つ人だけのものではなくなり、誰でも高性能なジオコンピュテーション向けソフトウェアをダウンロードして実行することができるようになったのである。
[QGIS](https://qgis.org/ja/site/)\index{QGIS} などのオープンソースの地理情報システム (geographical information system, GIS\index{GIS}) により、世界中で地理分析にアクセスできるようになった。
GIS プログラムは強力であるが、本書で解説するコマンドライン・インターフェース (CLI) よりも、グラフィカル・ユーザー・インターフェース\index{ぐらふぃかるゆーざーいんたーふぇーす@グラフィカルユーザーインターフェース} (graphical user interface, GUI) を重視する傾向がある。
多くの GIS にみられる GUI 偏重は、完全な再現性\index{さいげんせい@再現性}のある作業を難しくするという、意図しない副作用がある。Chapter \@ref(gis) で見るように、この問題は「ジオアルゴリズム」を呼び出すことで解決することができる。
大きく異なる二つのアプローチを単純に比較すると、Table \@ref(tab:gdsl) に示すようになる。
```{r gdsl, echo=FALSE, message=FALSE}
d = readr::read_csv("extdata/gis-vs-gds-table-ja.csv")
knitr::kable(x = d,
caption = "ソフトウェアパッケージによる重点の違い (地理情報システム (GIS) の GUI と R の GUI)。",
caption.short = "Differences between GUI and CLI",
booktabs = TRUE)
```
R だけがジオコンピュテーションのための CLI を提供する言語ではない。
Python\index{Python} ([Geocomputation with Python](https://py.geocompx.org/) で解説)、Julia、JavaScript など、強力なジオコンピュテーション機能を持つコマンド環境は他にも存在する。
しかし、R にはジオコンピュテーションを学ぶこと、さらに応用することに適した利点がある。Section \@ref(why-open-source) で説明するように、特に、統計学、モデル化、可視化の用途である。
本書を執筆する動機は、科学研究における再現性の重要性\index{さいげんせい@再現性} (下記注参照) である。
再現性のある地理データ解析\index{ちりでーたかいせき@地理データ解析}ワークフローをより身近なものにし、コマンドラインから利用できるオープンな地理空間ソフトウェアの力を実証することを目的としている。
R は、他の言語へのインターフェースを提供し [@eddelbuettel_extending_2018]、多くの空間ソフトウェアライブラリにアクセスすることができる。これについては、Section \@ref(why-use-r-for-geocomputation) で簡単に説明し、Chapter \@ref(gis) で実行してみたい。
しかし、ソフトウェアの詳細に触れる前に、一歩下がってジオコンピュテーションとは何かを考えてみる価値がある。\index{じおこんぴゅてーしょん@ジオコンピュテーション}
```{block2 01-introduction-1, type='rmdnote'}
再現性はコマンドラインインターフェースの大きな利点だが、実際にはどのような意味があるのだろうか。
ここでは、次のように定義している。「一般にアクセス可能なコードを用いて、他の人が同じ結果を生成できるプロセス」
これは単純で簡単に思えるかもしれないが (Rのコードをスクリプトファイルで注意深く管理すれば) 、教育や科学的プロセスにとって深い意味を持つ [@pebesma_r_2012]。
```
\index{さいげんせい@再現性}
## ジオコンピュテーションとは? {#what-is-geocomputation}
ここでは、ジオコンピューテーションを以下のように定義する。
> 再現性、柔軟性、ツール開発に重点を置き、地理データを使って問題を解決する研究、ソフトウェア開発、実用化の分野。
ジオコンピューテーション\index{じおこんぴゅてーしょん@ジオコンピュテーション}という用語は比較的新しく、1996年の第 1 回学術会議で用いられた。^[
最初の「GeoComputation」会議は、著者の一人 (Robin Lovelace) が現在在籍している Leeds 大学で開催された。
2017年、GeoComputation カンファレンスはリーズ大学に戻り、私たちがこの本に取り組み、発表する機会を与えてくれた (カンファレンスシリーズや20年以上にわたる論文/発表については、www.geocomputation.org を参照)。
]
ジオコンピュテーションを (当時) 一般的に使われていた「計量地理学」と区別したのは、その初期の提唱者が提唱した、「創造的・実験的」応用 [@longley_geocomputation_1998] と新しいツールや手法の開発に重点を置いたことである [@openshaw_geocomputation_2000]。
この用語を提唱 (かつ、おそらく定義も) した Stan Openshaw によると、「ジオコンピュテーションは、様々な異なるタイプのジオデータを使用し、「科学的」アプローチという全体的な文脈の中で、関連するジオツールを開発することである」[@openshaw_geocomputation_2000]。
この初期の定義に基づき、<u>*R* によるジオコンピューテーション</u>は、データ分析やモデリングにとどまらず、学術的に興味深いだけでなく、有益な仕事のための新しいツールや手法の開発を含む。
しかし、私たちのアプローチは当初の定義とは一点異なり、再現性\index{さいげんせい@再現性}とコラボレーションに重点を置いている。
21世紀初頭は、まだ必要なハードウェア、ソフトウェア、データの入手が困難で、読者がコード例を再現することは非現実的だった。
それから今日まで、解析環境は急速に進展している。
RAM を十分に (少なくとも 8 GB 以上) 搭載したノートパソコンがあれば、一般に公開されているデータセットにジオコンピュテーション用のソフトウェアをインストール・実行し、また本書を再現することができるはずである。
1990年代から2000年代初頭にかけて、高性能なコンピュータが一般の人々にとって手の届かないものであったために存在したジオコンピュテーションに対する金銭的・ハード的な障害は、現在では取り除かれている。^[
この条件に適合するノートパソコンは、多くの国では [Ebay](https://www.ebay.com/sch/i.html?_from=R40&_nkw=laptop&_sacat=0&_oaa=1&_udhi=100&rt=nc&RAM%2520Size=4%2520GB%7C16%2520GB%7C8%2520GB&_dcat=177) などのサイトで $100 以下で購入することができる。
R とコードエディタのインストール方法は、Chapter \@ref(spatial-class) で簡単に述べる。
]
また、公的に入手できるデータセットが広く普及してきたことも、ジオコンピュテーションはより身近になってきた理由の一つである。この点については、Chapter \@ref(read-write) で扱う。
この分野の初期の作品とは異なり、本書で紹介するすべての研究は、本書と一緒に提供されるコードと **spData** のサンプルデータを使って再現可能である。**spData** などの R\index{R} パッケージのインストールは Chapter \@ref(spatial-class) で解説する。
ジオコンピュテーション\index{じおこんぴゅてーしょん@ジオコンピュテーション}は、地理情報科学 (GIScience) 、ジオマティクス、ジオインフォマティクス、空間情報科学、地理情報工学 [@longley_geographic_2015]、空間データサイエンス (Spatial Data Science, SDS)\index{ちりでーたさいえんす@地理データサイエンス|くうかんでーたさいえんす@空間データサイエンス 参照} といった他の用語と密接に関連している。
それぞれの用語は、起源や主な適用分野は異なるものの、GIS\index{GIS!ていぎ@定義} の影響を受けた「科学的」 (再現性と反証可能性を意味する) アプローチに重点を置いている点で共通している。
例えば、SDS は「データサイエンス」のスキルと大規模なデータセットを重視し、ジオインフォマティクスはデータ構造に焦点を当てる傾向がある。
しかし、用語間の違いよりも重複の方が大きいため、すべてを包含する大まかな同義語としてジオコンピュテーションを使用している。
これらはすべて、地理データを応用科学的な作業に利用することを目的としている。
しかし、この用語の初期の使用者とは異なり、私たちは「ジオコンピュテーション (Geocomputation) 」 (または Stan Openshaw が呼んだ「ジオコンピュテーション (GeoComputation、C が大文字になっている) 」) というまとまった学術分野があることを示そうとするものではない。
ジオコンピュテーションは最近の言葉であるが、古い考えに影響を受けている。
2000年以上の歴史を持つ地理学\index{ちりがく@地理学} の一部と見ることができる [@talbert_ancient_2014]。
また、1960年代に登場した GIS\index{GIS} [@neteler_open_2008] の延長線上にあるものでもある [@coppock_history_1991]。
地理学\index{ちりがく@地理学}は、コンピュータが発明されるずっと以前から、人類と自然界との関係を説明し、影響を与える上で重要な役割を担ってきた。
著名な探検家・地理学者であり博識であった Alexander von Humboldt\index{von Humboldt} (彼の名前を冠した種、地物、大学などがある) が、この役割を以下のように説明している。
1800年代初めに南米を旅行した際に自然地理学や植物地理学の伝統の基礎を築いただけでなく、自然界を保護するための政策への道も開いたのである [@wulf_invention_2015]。
本書は、現代のコンピュータとオープンソースソフトウェアの力を活用し、進化し続ける「地理学の伝統」 [@livingstone_geographical_1992] に貢献することを目的としている。
本のタイトル案には *Geography with R* と *R for GIS* があったが、これらは古い学問分野とリンクしていることが分かる。
それぞれに利点がある。
前者は、単なる空間データ以上のもので構成されているというメッセージを伝えている。
後者は、この本が GIS\index{GIS} として R を使い、<u>地理データ</u>の空間演算を行うための本であることを伝えている [@bivand_applied_2013]。
しかし、GIS という言葉には、R\index{R} の最大の強みを伝えきれない意味を含んでいる (Table \@ref(tab:gdsl) 参照)。
すなわち、地理データと地理以外のデータの処理、モデル化、可視化をシームレスに行うことができ、かつ再現性は GIS の能力を超えている。
ジオコンピュテーション\index{geocomputation}は、再現可能なコード主導の環境で地理データを扱い、結果・方法・ツールをプログラムすることを示している。これが本書の狙いである。\index{GIS!ねらい}
## なぜオープンソースをジオコンピュテーションに使うのか? {#why-open-source}
初期の地理学者は、気圧計、コンパス、[六分儀](https://en.wikipedia.org/wiki/Sextant) などのさまざまな道具を使って、世界に関する知識を深めてきた [@wulf_invention_2015]。
海上での経度計算が可能になったのは、1761年に発明された[マリン・クロノメーター](https://en.wikipedia.org/wiki/Marine_chronometer)からで、これにより船はより直進的な航路をとることができるようになった。
今世紀に入る前、地理分析のためのデータやツールは不十分であった。
現在では、研究や実務に際して、地理データの不足ではなく、逆に多すぎるデータと多すぎるツールに悩まされている。
ほとんどのスマートフォンに全地球測位 (GPS\index{GPS}) 受信機が搭載されている。
人工衛星や半自動運転車、市民科学者に至るまで、数多くのセンサーが世界のあらゆる場所を絶え間なく測定している。
データの生成速度が圧倒的に速く、自律走行車のような新技術は、毎日数百から数千ギガバイトのデータを生成する。
人工衛星からのリモートセンシング\index{りもーとせんしんぐ@リモートセンシング}データが膨大になり、対応するデータを 1 台のコンピュータで解析することが難しくなったため、Chapter \@ref(gis) で扱うように一台のコンピュータでは処理しきれない。
この「ジオデータ革命」によって、高性能なコンピュータ・ハードウェアと、ノイズから信号を処理・抽出するための効率的でスケーラブルなソフトウェアに対する需要が高まっている。
オープンソースツールの進化により、膨大な地理データストアから直接またはアプリケーションプログラミングインターフェイス (Application Programming Interface, API) を介して地理データをインポートし処理することができる。\index{くうかんでーたべーす@空間データベース}
急速に変化するハードウェア、ソフトウェア、およびデータ環境では、将来性のあるツールを選択することが重要である。
オープンソースソフトウェアの大きな利点は、何千人もの潜在的な貢献者がいることによる**開発速度と寿命**である。
毎日何百人もの人々がオープンソースプロジェクトにバグレポートを提出し、新機能やドキュメントの改善を提案している。
このことと関係して、**相互運用性**が利点となる。
プロプライエタリな製品は、保守が難しいモノリシックな「帝国」になりがちだが (先に述べた利点と関連している)、オープンソース・ソフトウェアは、組み合わせることができるため、モジュール化されたツール「連合」と言えるだろう。
このため、R のようなオープンソースのデータサイエンス言語は、高性能な可視化ライブラリやファイル形式へのインターフェースといった新しい開発を迅速に取り入れることができる。一方、プロプライエタリなソリューションは遅れを取らないように苦労している。
もうひとつの大きな利点は、**再現性**である。
発見を再現できることは科学研究にとって不可欠であり、オープンソースソフトウェアは、他の人が同じツールを使ってあなたの発見をチェックしたり、新しい文脈であなたの方法を適用したりすることを可能にするため、再現性という重要な障壁がない。
誰でも無料でアクセスできるツールを使い、コードやデータを共有すると、研究結果を他の人がチェックし、それを基に構築できるようになる。これは、自分の作品を使ってもらったり、引用されたいと思うのであれば、大きなアドバンテージとなる。
多くの人にとって、再現可能なコードの共有と組み合わされたオープンソースソフトウェアの最大の利点は、**コミュニティ**である。
プロプライエタリ・ソフトウェアのサポートは非常に使いづらいことが多い。一方、コミュニティでは質の高いサポートをすぐに得ることもある。
コミュニティはフィードバックやアイデアを提供してくれ、Chapter \@ref(conclusion) でも取り上げるように、独自のツールや手法を開発する手助けをしてくれる。
R はオープンソースソフトウェアプロジェクトで、強力な言語であり、統計学者や開発者のコミュニティは常に進化し続けている [@wickham_advanced_2019]。
R はオープンソースソフトウェアで再現可能なジオコンピュテーショ ンを可能にする唯一の言語ではない。
R を使う理由の多くは、Python\index{Python} や Julia など、再現可能なデータサイエンスのための他のオープンソース言語にも当てはまる。
しかし、R 独自の重要な利点がいくつかある。
## なぜ R をジオコンピュテーションに使うのか? {#why-use-r-for-geocomputation}
R は、統計計算とグラフィックスのための、マルチプラットフォームなオープンソース言語・環境である ([r-project.org/](https://www.r-project.org/))。
R は、幅広いパッケージによって高度な地理空間統計学 \index{とうけいがく@統計学}、モデリング、可視化もサポートしている。
\index{R!げんご@言語}
RStudio\index{RStudio} のような新しい統合開発環境 (integrated development environment、IDE\index{IDE}) のおかげで、より多くの人が R を使えるようになった。特に、インタラクティブな視覚化専用のパネルがあることで地図の作成が容易になった。
R の核は、オブジェクト指向の[関数型プログラミング言語](https://adv-r.hadley.nz/fp.html) [@wickham_advanced_2019]である。これに加えて、他のソフトウェアとの対話型インタフェースも設計されている [@chambers_extending_2016]。
後者には、GIS\index{GIS} ソフトウェア、「ジオライブラリ」、関数の宝庫への「ブリッジ」も多く含まれている (Chapter \@ref(gis) を参照)。
そのため、C 言語\index{C}、FORTRAN\index{FORTRAN}、Java\index{Java} などの (R と比較して) 低レベルな言語を習得する必要がなく、「ジオツール」を素早く作成するのに理想的である (Section \@ref(software-for-geocomputation) を参照)。
\index{R}
これは、GUI ベースの地理情報システムやプロプライエタリな地理情報システムが課す比喩的な「見えない壁」からの脱却のように感じられるだろう (GUI\index{ぐらふぃかるゆーざーいんたーふぇーす@グラフィカルユーザーインターフェース} の定義については Table \@ref(tab:gdsl) を参照)。
さらに、R は他の言語へのアクセスを容易にしている。
例えば、パッケージの **Rcpp** は C++\index{C++} の、**reticulate** は Python\index{Python} のコードを実行できるようにする。
つまり、R はさまざまな地理空間プログラムへの「橋渡し役」として使用できるのである (Section \@ref(software-for-geocomputation) 参照)。
R の柔軟性と進化する地理的機能を示すもう一つの例は、インタラクティブな地図作成である\index{ちずさくせい@地図作成!いんたらくてぃぶちず@インタラクティブ地図}。
Chapter \@ref(adv-map) で見るように、R には「限られた対話型 (プロット) 機能しかない」 [@bivand_applied_2013] というのは、もはや真実ではない。
これは、Figure \@ref(fig:interactive) を作成する以下のコードチャンクで実証されている (プロットを生成する関数は、Section \@ref(interactive-maps) でカバーされている)。
```{r 01-introduction-2, eval=FALSE, echo=FALSE}
a = osmdata::getbb("Hereford")
b = osmdata::getbb("Bialystok")
rowMeans(a)
rowMeans(b)
```
```{r interactive-demo, eval=FALSE}
library(leaflet)
popup = c("Robin", "Jakub", "Jannes")
leaflet() |>
addProviderTiles("NASAGIBS.ViirsEarthAtNight2012") |>
addMarkers(lng = c(-3, 23, 11),
lat = c(52, 53, 49),
popup = popup)
```
```{r interactive, fig.cap="青いマーカーは著者の出身地を示している。ベースマップは、NASAが提供する夜の地球のタイル画像。オンライン版 (geocompr.robinlovelace.net) では、ズームインしたりポップアップをクリックするなどして、インタラクティブに楽しむことができる。", out.width="100%", fig.scap="Where the authors are from.", echo=FALSE}
if (knitr::is_latex_output()){
knitr::include_graphics("images/interactive.png")
} else if (knitr::is_html_output()){
# library(leaflet)
# popup = c("Robin", "Jakub", "Jannes")
# interactive = leaflet() |>
# addProviderTiles("NASAGIBS.ViirsEarthAtNight2012") |>
# addMarkers(lng = c(-3, 23, 11),
# lat = c(52, 53, 49),
# popup = popup)
# library(htmlwidgets)
# saveWidget(interactive, file = "interactive.html")
# file.copy("interactive.html", "~/geocompr/geocompr.github.io/static/img/interactive.html")
knitr::include_url("https://geocompr.github.io/img/interactive.html")
}
```
\index{map making!interactive}
インタラクティブな地図としてならともかく、数年前に R (あるいは他のどのプログラミング言語でも) を使って Figure \@ref(fig:interactive) を作成するのは困難だっただろう。
これは R の柔軟性と、**knitr** や **leaflet** などの開発のおかげで、他のソフトウェアへのインターフェースとして使用できることを示すもので、本書を通じて繰り返し出てくるテーマである。
そのため、R コードを使用することで、抽象的な概念だけでなく、現実の現象を表す再現性の高い事例を参考にしながらジオコンピュテーションの教育を行うことができる。
R-spatial stack はインストールが簡単で、包括的でメンテナンスが行き届き、相互運用性の高いパッケージを備えている。
R には、基本インストールに含まれる統計関数と、多くの最先端手法を実装した何百ものよくメンテナンスされたパッケージがある。
R を使えば、驚くほど少ないコード行数で作業を開始することができ、デバッグやパッケージの依存関係の管理よりも、地理メソッドやデータに集中することができる。
R の特に優れた点は、優れた地図作成パッケージのおかげで、出版物のような品質のインタラクティブマップを簡単に作成できることである。
## ジオコンピュテーションのためのソフトウェア {#software-for-geocomputation}
R は地理計算のための強力な言語であるが、地理データ解析のための他の多くの選択肢があり、何千もの地理関数\index{かんすう@関数}を提供している。
地理計算のための他の言語を理解することは、特定のタスクに別のツールがより適切である場合を決定し、より広い地理空間エコシステムに R を配置するのに役立つだろう。
本節では、Chapter \@ref(gis) に向けて、ジオコンピュテーションのための言語 [C++](https://isocpp.org/)\index{C++}、 [Java](https://www.oracle.com/java/)\index{Java}、 [Python](https://www.python.org/)\index{Python} を簡単に紹介する。
R (と Python) の重要な特徴として、インタプリタ型言語であることが挙げられる。
REPL (Read-Eval-Print Loop) \index{REPL}で対話的にプログラミングできるのがメリットである。
コンソールに入力されたコードは、コンパイルという中間段階を待たずに、即座に実行され、結果が表示される。
一方、C++\index{C++} や Java\index{Java} などのコンパイルされた言語は、 (一度コンパイルされると) 動作が速くなる傾向がある。
C++\index{C++} は、[QGIS](https://www.qgis.org/)\index{QGIS}、[GRASS GIS](https://grass.osgeo.org/)\index{GRASS GIS}、[SAGA](https://saga-gis.sourceforge.io/)\index{SAGA} などの多くの GIS パッケージの基礎を提供しているので、賢明な出発点であると言えるだろう。
よく書かれた C++\index{C++} は非常に高速で、大規模な地理データセットを処理するようなパフォーマンスが重要なアプリケーションに適しているが、Python や R に比べて習得が困難である。
C++\index{C++} は、**Rcpp** パッケージによってよりアクセスしやすくなり、R ユーザーのために C\index{C} プログラミングへの良い「入り方」を提供している。
このような低レベルの言語を使いこなすことで、新しい高性能な「ジオアルゴリズム」を生み出す可能性や、GIS ソフトウェアの仕組みをより深く理解することができる (Chapter \@ref(algorithms) を参照)。
しかし、R を使用してジオコンピュテーションを行う際には、必ずしも C++\index{C++} を学ぶ必要はない。
Python\index{Python} は、特に GRASS GIS\index{GRASS GIS}、SAGA\index{SAGA}、QGIS\index{QGIS} などの多くのデスクトップ GIS\index{GIS} が Python API\index{API} を提供しているので、ジオコンピュテーションには重要な言語である (Chapter \@ref(gis) を参照)。
Python\index{Python} は、R\index{R} と同様、データサイエンスでよく使われているプログラミング言語である。
両言語はオブジェクト指向であり、重複する部分が多いため、R から Python\index{Python} へのアクセスを容易にする **reticulate** パッケージや、オープンソースデータサイエンスエコシステム全体の利益のためにポータブルライブラリをサポートする [Ursa Labs](https://ursalabs.org/) イニシアチブなどの取り組みに繋がっている。
実際には、R と Python のどちらにも強みがある。
どちらを使うかは、ある程度、応用や結果の伝達の領域よりは重要ではない。
どちらかを習得することで、もう一方を習得するためのスタートラインに立つことができるのである。
しかし、ジオコンピュテーション\index{じおこんぴゅてーしょん@ジオコンピュテーション}においては、Python\index{Python} よりも R \index{R} の方が大きな利点がある。
R 言語自体の地理ラスタデータモデルのサポートが大幅に向上したこと (Chapter \@ref(spatial-class))、それに対応する可視化の可能性 (Chapter \@ref(spatial-class) と Chapter \@ref(adv-map) 参照) が含まれる。
\index{くうかん@空間!とうけいがく@統計学} 同様に重要なこととして、R は空間統計\index{とうけい@統計} を含む統計のための比類ないサポートを持っており、何百ものパッケージ (Python\index{Python} の比ではない) が何千もの統計手法をサポートしている。
Python の大きな利点は、<u>汎用</u>プログラミング言語であることである。
デスクトップソフトウェア、コンピュータゲーム、Web サイト、データサイエンス\index{でーたさいえんす@データサイエンス}など、多くの領域で使用されている。
Python\index{Python} は、異なる (ジオコンピュテーション) コミュニティ間で唯一共有される言語であることが多く、多くの GIS\index{GIS} プログラムをまとめる「接着剤」と見なすことができる。
QGIS\index{QGIS} や ArcMap を含む多くのジオアルゴリズム\index{じおあるごりずむ@ジオアルゴリズム}は、Python のコマンドラインからアクセスできるため、コマンドライン GIS のスターター言語として適している^[
ジオアルゴリズム\index{じおあるごりずむ@ジオアルゴリズム}へのアクセスを提供する Python モジュールには、GRASS GIS\index{GRASS GIS} 用の `grass.script`、
SAGA-GIS\index{SAGA} 用の `saga-python`、
QGIS\index{QGIS} 用 `processing`、
ArcGIS\index{ArcGIS} 用の `arcpy` がある。]
しかし、空間統計\index{くうかん@空間!とうけい@統計}と予測モデリングでは、R は他の追随を許さない。
これは、R と Python のどちらかを選ばなければならないということではない。Python\index{Python} は、ほとんどの一般的な統計手法をサポートしており (ただし、空間統計の新しい開発は R の方が早くサポートする傾向がある) 、Python で学んだ多くの概念は R\index{R} の世界にも適用することができる。
R と同様に、Python も地理データの解析と操作をサポートしており、**shapely**、**geopandas**、**rasterio**、**xarray** などのパッケージがある。
## Rの空間エコシステム {#r-ecosystem}
R で地理データを扱う方法はたくさんあり、この分野では何十ものパッケージ\index{R-spatial}がある。^[
R の空間エコシステムの概要は、CRAN\index{CRAN} Task View on Analysis of Spatial Data に掲載されている。
(参照: https://cran.r-project.org/view=Spatial)。
]
本書では、この分野の最先端を学ぶと同時に、将来的にも通用する手法を確保するよう努めることとした。
ソフトウェア開発の多くの分野と同様に、R の空間エコシステムは急速に進化している (Figure \@ref(fig:cranlogs))。
R はオープンソースであるため、Isaac Newton が [1675](http2://digitallibrary.hsp.org/index.php/Detail/objects/9792) で述べたように、「巨人の肩の上に立つ」ことによって、これらの開発は容易に過去の研究の上に構築することができるのである。
この方法は、コラボレーションを促進し、「車輪の再発明」を避けることができるという利点がある。
例えば、**sf**\index{sf} (Chapter \@ref(spatial-class) で取り上げている) というパッケージは、前身の **sp** の上に構築されたものである。
R-spatial\index{R-spatial} の開発時間が急増し、R コンソーシアムから、ベクタ形状の保存とアクセスのためのオープンソースの標準とモデルである<u>シンプルフィーチャ</u>のサポートの開発に対する助成金が授与された。
その結果、**sf** パッケージ (Section \@ref(intro-sf)) が誕生したのである。
複数の場所で **sf** への絶大な関心を反映している。
特に、長年にわたって蓄積された R-spatial の知恵を多く含むオープンアクセスのメールリストである [R-sig-Geo Archives](https://stat.ethz.ch/pipermail/r-sig-geo/) がそうである。
```{r cranlogs, fig.cap="2013年初頭から現在までの、地理データを扱うための R パッケージのダウンロード数。y軸は、よく使われる cloud.r-project.org CRAN ミラーからの日次ダウンロードの平均数を91日間ローリングウィンドウ法で示している (対数スケール)。", echo=FALSE, fig.scap="The popularity of spatial packages in R."}
knitr::include_graphics("images/01-cranlogs.png")
```
データ処理パッケージ **dplyr** ([2014年](https://cran.r-project.org/src/contrib/Archive/dplyr/)にリリース) に代表されるように、より広い R コミュニティのシフトが R の空間エコシステムのシフトに影響を与えたことは注目に値する。
**dplyr** は [2016年](https://cran.r-project.org/src/contrib/Archive/tidyverse/) の後半に **tidyverse**\index{tidyverse (package)} という「メタパッケージ」に配置され、スタイルを共有する他のパッケージ (例えば、**ggplot2** など) と並び、「整えられた (tidy) データ」に重点を置いている。
ロング型データと直感的な名前の関数に焦点を当てた **tidyverse**\index{tidyverse (package)} アプローチは、絶大な人気を誇っている。
そのため、「整えられた地理的データ」が求められ、その一部を **sf** が担ってきている。
**tidyverse** の明らかな特徴として、パッケージが調和して動作する傾向がある。
同等の **geoverse** はないが、R-spatial エコシステムは、**sf**\index{sf} と **terra** を中心に集約されており、本書では両者を解説する。**sf** に依存するパッケージ は Table \@ref(tab:revdep) の通りである。
Chapter \@ref(gis) で解説する通り、パッケージ間でも他の言語との間でも相互運用性が高い。
```{r revdep, echo=FALSE, message=FALSE}
top_dls = readr::read_csv("extdata/top_dls.csv")
knitr::kable(top_dls[1:5, 1:2], digits = 0,
caption = paste("sf に依存するパッケージで、前月の 1 日あたりの平均ダウンロード数が多い上位 5 位。",
"",
"",
min(top_dls$date), "時点で、", nrow(top_dls),
"件のパッケージが sf をインポートしている。"),
caption.short = "Top 5 most downloaded packages depending on sf.",
booktabs = TRUE,
col.names = c("パッケージ", "ダウンロード数"))
# cranlogs::cran_top_downloads(when = "last-month") # most downloaded pkgs
```
## R-spatial の歴史 {#history-of-r-spatial}
最新の空間パッケージである **sf** を使うメリットはたくさんあるが、R の空間機能の歴史を知っておくことも重要である。
古いパッケージには機能、ユースケース、教材が多いため、今でも十分役に立つ。
\index{R!れきし@歴史}
\index{R-spatial!れきし@歴史}
R の空間機能は、S 言語の初期の空間パッケージが起源である [@bivand_implementing_2000]。
\index{S}
1990年代には、数多くの S スクリプトが開発され、空間統計\index{とうけいがく@統計学}のためのパッケージも数多く開発された。
2000 年までに、「点パターン解析、地球統計学、探索的空間データ解析、空間経済学」という様々な空間手法のための R パッケージが誕生した [@bivand_open_2000]。
これらのうち、特に **spatial**、**sgeostat**、**splancs** は CRAN\index{CRAN} でまだ利用可能である [@rowlingson_splancs_1993; @rowlingson_splancs_2017;@venables_modern_2002; @majure_sgeostat_2016]。
主要な空間パッケージは @ripley_spatial_2001 で説明されており、空間平滑化と補間と点パターン分析の R パッケージの概要が述べられている。
そのうちの一つ(**spatstat**)は、最初のリリースから 20 年以上経った今でも活発にメンテナンスされている。
続く解説では、空間統計の将来の展望を概説し [@bivand_more_2001]、人気のある **spdep** パッケージ [@bivand_spdep_2017] の開発の舞台を設定した。
特筆すべきは、空間インターフェースの標準化、GIS とのデータ交換の効率的なメカニズム、座標参照系 (CRS\index{CRS}) などの空間メタデータの取り扱いの必要性に言及したことである。
これらの目的はほぼ達成されている。
**maptools** [@bivand_maptools_2017] もこの時期の重要なパッケージで、 Shapefile\index{Shapefile} を読むための [shapelib](http://shapelib.maptools.org/) ライブラリへのインタフェースを提供し、**sp** に供給していた。
空間パッケージの拡張レビューでは、基本的な点、線、多角形、ラスタ型と外部ライブラリへのインタフェースを含む「GDALが提供するデータオブジェクト」をサポートするクラスシステムが提案された [@hornik_approaches_2003]。
これらのアイデアは **rgdal** パッケージと **sp** パッケージで実現され、2008 年に初版が出版された **Applied Spatial Data Analysis with R** (ASDAR) [@bivand_applied_2013] の基礎となった。
R の空間機能はそれ以来大幅に進化しているが、初期のパイオニアたちのアイデアの上に成り立っている。
例えば、GDAL\index{GDAL} と PROJ\index{PROJ} へのインターフェースは、R の高性能な地理データ I/O と CRS\index{CRS} の変換機能を可能にしている。それぞれ Chaptger \@ref(reproj-geo-data) と Chapter \@ref(read-write) で解説する。
2003 年にリリースされた **rgdal** は、R 用の GDAL\index{GDAL} バインディングを提供し、以前は利用できなかった地理データ形式からインポートする機能を大幅に強化した。
最初のリリースではラスタドライバのみをサポートしたが、その後の機能強化により、CRS (PROJ ライブラリ経由)、再投影、ベクタのインポートをサポートした。
これらの追加機能の多くは Barry Rowlingson によって開発され、2006 年に **rgdal** コードベースでリリースされた。
2005 年にリリースされた **sp** は、R の空間対応を大きく進展させた。
**sp** は、クラスとジェネリック関数を採用し、属性データだけでなく地理座標、点、線、ポリゴンやメッシュ (grid) を扱えるようになった。
**sp** は S4 クラスであり、バウンディングボックス、座標参照系 (CRS) 、属性などの情報を `Spatial` オブジェクトのスロットに格納する。
これにより、データ操作で地理データを扱えるようになった。
さらに、**sp** では、地理データのための `summary()` や `plot()` などのジェネリックメソッドが用意されている。
その後の 10 年間で **sp** クラスは R の地理データ用として急速に普及し、これに依存するパッケージの数は2008年の約 20 から 2013 年には 100 以上に増加した [@bivand_applied_2013]。
2019年までに **sp** に依存するパッケージは 500 を超えた
**sf** やその他のパッケージに移行するためその数は減少しているが、**sp** を使用する主な R パッケージには、空間・時空間地球統計学\index{くうかん@空間!とうけい@統計}の **gstat** 、球面三角法の **geosphere** などの著名なパッケージもある [@R-gstat; @calenge_package_2006; @hijmans_geosphere_2016]。
```{r, eval=FALSE, echo=FALSE}
# Aim: show n. pkgs that depend on sf and sp
revdep_sp = devtools::revdep(pkg = "sp")
length(revdep_sp) # 449 # 2023-11-16
revdep_sf = devtools::revdep(pkg = "sf")
length(revdep_sf) # 739 # 2023-11-16
```
**rgdal** と **sp** は空間に関する多くの問題を解決したが、2010年の Google Summer of Code プロジェクト ([@R-rgeos]) で **rgeos** が開発されるまで、**sp** オブジェクトでジオメトリ操作を行うことができなかった。
`gIntersection()` などの機能により、地理的なオブジェクト間の空間的な関係を見つけたり、その形状を変更したりすることが可能になった (**sf**による幾何学的な操作の詳細については、Chapter \@ref(geometry-operations) を参照)。
\index{raster (package)}
**sp** エコシステムの限界は、ラスタデータのサポートが限定的であることであった。
これを克服したのが、2010年に初めてリリースされた **raster**\index{らすた@ラスタ} である [@R-raster]。
Section \@ref(raster-data) にあるように、**raster** クラスシステムと関数によって、さまざまなラスタ操作が可能になり、現在では **terra** パッケージに実装されている。
**raster** と **terra** の重要な機能は、RAM に収まらないほど大きなデータセットを扱うことができることであり、ディスク外操作でサポートしている。
**raster** および **terra** は、Section \@ref(map-algebra) で説明されているように、マップ代数もサポートしている。
このようなクラスシステムや手法の開発と並行して、専用の GIS ソフトのインターフェースとして R がサポートされるようになった。
**GRASS** [@bivand_using_2000] とそれに続くパッケージ **spgrass6** と **rgrass7** と **rgrass** は、この方向性の顕著な例であった [@bivand_rgrass7_2016;@bivand_spgrass6_2016;@R-rgrass]。
R と GIS の橋渡しの例としては、他に QGIS には **qgisprocess** [@R-qgisprocess]、SAGA には **Rsagacmd** [@R-Rsagacmd] や **RSAGA** [@R-RSAGA]\index{RSAGA (package)}、ArcGIS には **RPyGeo** [@brenning_arcgis_2012, first published in 2008] がある (Chapter \@ref(gis) 参照)。
R-spatial の開発の大部分は解析と地理的な操作に集中しており、当初は可視化には焦点が当てられていなかった。
base と lattice の両方のプロット方式で地図を作る方法を提供していた **sp** であるが、高度な地図作成機能への要望が高まっていた。
2009 年にリリースされた **RgoogleMaps** は、Google Maps や OpenStreetMap [@loecher_rgooglemaps_2015] などのオンラインサービスの「ベースマップ」タイルの上に R 空間データを重ね合わせることができる。
\index{ggplot2 (package)}
その後、**ggplot2** [@kahle_ggmap_2013] に同様の「ベースマップ」タイル機能を追加した **ggmap** パッケージがリリースされた。
**gpmap** は **ggplot2** で地図を作ることを容易にしたが、`fortify` 空間オブジェクトをロング形式のデータフレームに変換する必要があるため、その実用性は限られていた。
これは点に対してはうまくいくが、線やポリゴンに対しては計算効率が悪く、各座標 (頂点) が行に変換されるため、複雑な形状を表現するためには巨大なデータフレームが必要となるのである。
地理的な可視化はベクタデータを中心に行われる傾向があるが、ラスタの可視化は **raster** でサポートされ、**rasterVis** のリリースでさらに盛り上がった [@lamigueiro_displaying_2018]。
それ以来、R での地図作成は話題となり、Chapter \@ref(adv-map) で強調されているように、**tmap**、**leaflet**、**mapview** などの専用パッケージがよく使われている。
Geocomputation with R 第 1 版が出版された 2018 年以降、地理系 R パッケージの開発が加速している。
\index{terra (package)}\index{raster (package)}
**raster** パッケージの後継である **terra** は、2020 年に初めてリリースされ、ラスタデータセットを扱う R ユーザーにいくつかの利点をもたらしている [@-terra]。Section \@ref(raster-data) で説明されているように、前任者よりも高速でより分かりやすいユーザーインターフェースを持っている。
Section \@ref(s2) で説明する通り、**sf** パッケージは、2021 年半ばより非投影データに対しては S2 球面幾何学計算を取り入れた。
また、2018年以降の R で地理データを表現し作業する方法として、**stars** と **lidR** パッケージが追加されている。
\index{stars (package)}
\index{lidR (package)}
この展開は、R 環境外の新技術、新標準、ソフトウェアによるものである [@bivand_progress_2021]。
2018 年に始まった PROJ ライブラリ\index{PROJ} の変更により、CRS の proj-string 表現を、Section \@ref(crs-intro) と Chapter \@ref(reproj-geo-data) で説明するように、Well Known Text に置き換えられなければならなくなった。
\index{rayshader (package)}
2018 年に Geocomputation with R の第 1 版が出版されて以来、空間データ可視化のためのいくつかのパッケージが開発・改良されてきた。
例えば、**rayshader** パッケージは、レイトレーシングと複数のヒルシェーディング [@morganwall_rayshader_2021] を介して、印象的でアニメーションしやすい 3D ビジュアライゼーションの開発を可能にする。
\index{ggplot2 (package)}
非常に人気のある **ggplot2** パッケージは、**ggspatial** パッケージで、スケールバーと北矢印という新しい空間機能を得た [@dunnington_ggspatial_2021]。
**gganimate** はスムーズでカスタマイズ可能な空間アニメーションを可能にする [@pedersen_gganimate_2020]。
既存の可視化パッケージも改良されたり書き直されたりしている。
大きなラスタオブジェクトは **tmap** で自動的に縮小され、**leafgl** や **mapdeck** を含むパッケージのおかげで、高性能なインタラクティブマップが可能になっている。
<!-- TODO: tmap 4.0のリリース日を追加 -->。
**mapsf** パッケージ (**cartography** の後継) は依存関係を減らし、パフォーマンスを向上させるために書き直された [@giraud_mapsf_2021]。また、**tmap** はバージョン 4 で大きなアップデートが行われ、内部コードのほとんどが改訂された。
2021 年後半に、**rgdal**、**rgeos**、**maptools** の引退計画が[発表され](https://stat.ethz.ch/pipermail/r-sig-geo/2021-September/028760.html)、2023 年 10 月に CRAN にアーカイブされた。
この 2023 年末の引退は、これらのパッケージを適用する既存のワークフローに大きな影響を与えただけでなく、[それらに依存するパッケージにも影響を与えた](https://geocompx.org/post/2023/rgdal-retirement/)。
Chapter \@ref(spatial-class) で説明する **sf** や **terra** のような最新の R パッケージは、本書で紹介するジオコンピュテーションのための強力で将来性のある基礎である。
## 演習
```{r, echo=FALSE, results='asis'}
res = knitr::knit_child('_01-ex-ja.Rmd', quiet = TRUE, options = list(include = FALSE, eval = FALSE))
cat(res, sep = '\n')
```