diff --git a/01-introduction-ja.Rmd b/01-introduction-ja.Rmd index b6c4739..db6fe81 100644 --- a/01-introduction-ja.Rmd +++ b/01-introduction-ja.Rmd @@ -12,10 +12,9 @@ source("code/before_script.R") 地理データの読み書きと何らかの処理、静的およびインタラクティブな地図の作成、実世界の問題を解決するためのジオコンピュテーション\index{じおこんぴゅてーしょん@ジオコンピュテーション} の適用、地理現象のモデリングなど、交通や環境系など多様な空間スキルを教える。 本書は、様々な地理的操作をどのようにリンクさせることができるかを、文章に挟まれた再現可能な「コードチャンク」で示す。このことにより、透明性のある、したがって科学的なワークフローも教えてくれる。 -本書は、ジオコンコンピュテーションのために既存のツールの利点を活用することだけにとどまらない。地理データ構造を理解し、また地理データ処理によってソフトウェアを理解し、新しいツールの開発も可能にする。 +本書は、ジオコンコンピュテーションのために既存のツールの利点を活用することだけにとどまらない。地理データ構造、および地理データ処理によってソフトウェアを理解し、新しいツールを開発する際に必要なソフトウェアを理解する。 本書全体で解説するコマンドライン駆動のアプローチと、Chapter \@ref(algorithms)\index{あるごりずむ@アルゴリズム} で解説するプログラミングにより、ソフトウェアによって課された創造性の制約を取り除くことができる。 -本書を読み、演習問題を解いた後は、R\index{R} の 素晴らしい地理的機能によって開かれる可能性を強く理解し、地理データを使って現実世界の問題を解決する新しいスキル、地図と再現性のあるコードで自分の仕事を伝える力を身につけたと感じるはずである。 -本書の最後までに、読者が現実の課題に取り組むためにスキルを応用し、地図とコードで作業をこなし、再現可能かつフリーソフトウェア活動に参加する準備ができることを期待している。 +本書を読み、演習問題を解いた後は、読者が現実の課題に取り組むためにスキルを応用し、地図とコードで作業をこなし、再現可能かつフリーソフトウェア活動に参加する準備ができることを期待している。 地理空間用のフリー&オープンソースソフトウェア (FOSS4G\index{FOSS4G}) はここ数十年の間に驚くほどのスピードで進歩している。 OSGeo のような組織のおかげで、応用地理技術はもはや高価なハードウェアやソフトウェアを持つ人だけのものではなくなり、誰でも高性能なジオコンピュテーション向けソフトウェアをダウンロードして実行することができるようになったのである。 @@ -35,12 +34,8 @@ knitr::kable(x = d, ``` R だけがジオコンピュテーションのための CLI を提供する言語ではない。 -Python\index{Python}、Julia、JavaScript など、強力なジオコンピュテーション機能を持つコマンド環境は他にも存在する。 -興味があれば、他の言語を試してみたり、本書の例を他の言語で再現してみたりすることをお勧めする。おそらく、[Geocomputation with Python](https://py.geocompx.org/) という本も参考になるだろう。そのオープンアクセス版は [geocompx.org](https://geocompx.org/) でもホストされている。 -しかし、R にはジオコンピュテーションに適したいくつかの利点がある。 -R の空間関連はインストールが簡単で、そのコアパッケージは包括的でよくメンテナンスされている。想定外の事態が少ないため、動作しなくてイライラすることなく作業に集中できる。 -R には、基本的なインストールに含まれる統計関数と、多くの最先端の手法を実装したメンテナンスの行き届いた数百ものパッケージが最初から含まれている。 -R を使えば、驚くほど少ないコード行数で作業を開始することができる。また、優れた地図パッケージのおかげで高品質のインタラクティブ地図を公開することもできる。この点は、Chapter \@ref(adv-map) で解説する。 +Python\index{Python} ([Geocomputation with Python](https://py.geocompx.org/) で解説)、Julia、JavaScript など、強力なジオコンピュテーション機能を持つコマンド環境は他にも存在する。 +しかし、R にはジオコンピュテーションを学ぶこと、さらに応用することに適した利点がある。Section \@ref(why-open-source) で説明するように、特に、統計学、モデル化、可視化の用途である。 本書を執筆する動機は、科学研究における再現性の重要性\index{さいげんせい@再現性} (下記注参照) である。 再現性のある地理データ解析\index{ちりでーたかいせき@地理データ解析}ワークフローをより身近なものにし、コマンドラインから利用できるオープンな地理空間ソフトウェアの力を実証することを目的としている。 @@ -90,9 +85,9 @@ R とコードエディタのインストール方法は、Chapter \@ref(spatial また、1960年代に登場した *Geographic Information Systems* (GIS\index{GIS}) [@neteler_open_2008] の延長線上にあるものでもある [@coppock_history_1991]。 地理学\index{ちりがく@地理学}は、コンピュータが発明されるずっと以前から、人類と自然界との関係を説明し、影響を与える上で重要な役割を担ってきた。 -1800年代初頭、Alexander von Humboldt\index{von Humboldt} が南米を旅したことが、この役割を物語っている。 -その結果、自然地理学や植物地理学の伝統の基礎を築いただけでなく、自然界を保護するための政策への道も開いたのである [@wulf_invention_2015]。 -本書は、現代のコンピュータとオープンソースソフトウェアの力を活用し、「地理学の伝統」 [@livingstone_geographical_1992] に貢献することを目的としている。 +著名な探検家・地理学者であり博識であった Alexander von Humboldt\index{von Humboldt} (彼の名前を冠した種、地物、大学などがある) が、この役割を以下のように説明している。 +1800年代初めに南米を旅行した際に自然地理学や植物地理学の伝統の基礎を築いただけでなく、自然界を保護するための政策への道も開いたのである [@wulf_invention_2015]。 +本書は、現代のコンピュータとオープンソースソフトウェアの力を活用し、進化し続ける「地理学の伝統」 [@livingstone_geographical_1992] に貢献することを目的としている。 本のタイトル案には *Geography with R* と *R for GIS* があったが、これらは古い学問分野とリンクしていることが分かる。 それぞれに利点がある。 diff --git a/02-spatial-data-ja.Rmd b/02-spatial-data-ja.Rmd index a54b2c3..4be22c7 100644 --- a/02-spatial-data-ja.Rmd +++ b/02-spatial-data-ja.Rmd @@ -16,7 +16,7 @@ R のスクリプト、出力、その他ジオコンピュテーションに関 また、学習をサポートするため、[ソースコード](https://github.com/geocompx/geocompr)を[ダウンロード](https://github.com/geocompx/geocompr/archive/refs/heads/main.zip) または[クローン](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)しておくと良い。 R コードを書く/実行する/テストする際には、 [RStudio](https://posit.co/download/rstudio-desktop/#download) (ほとんどの人に推奨)\index{RStudio} または [VS Code](https://github.com/REditorSupport/vscode-R)\index{VS Code} などの統合開発環境 (integrated development environment, IDE) をインストールすることを強く勧める。 -R を初めて使う方は、R のコードを使ったジオコンピュテーションに入る前に、Garrett Grolemund の [Hands on Programming with R](https://rstudio-education.github.io/hopr/starting.html) や Claudia Engel の [Introduction to R](https://cengel.github.io/R-intro/) などの R 入門リソースに従うことを勧める。 +R を初めて使う方は、R のコードを使ったジオコンピュテーションに入る前に、Garrett Grolemund の [Hands on Programming with R](https://rstudio-education.github.io/hopr/starting.html) や [Introduction to R](https://cengel.github.io/R-intro/) などの R 入門リソースに従うことを勧める。 これらのリソースには R のインストール方法が詳細に書かれており、[Comprehensive R Archive Network (CRAN)](https://cran.r-project.org/) から最新バージョンをダウンロードすることも書かれている。 下記の注記は、Mac と Linux について、ジオコンピュテーションするために R をインストールするための情報がある。 作業内容を整理し (例: RStudio プロジェクト)、スクリプトに `chapter-02-notes.R` などのわかりやすい名前を付けて、学習しながらコードを記録するとよい。 @@ -126,13 +126,13 @@ source("https://github.com/geocompx/geocompr/raw/main/code/02-vectorplots.R") # ``` ```{r vectorplots, fig.cap="原点 (青丸) を基準にロンドン (赤 X) の位置を表したベクトル (点) データの図解。左図は、緯度経度 0° を原点とする地理的な CRS。右図は、South West Peninsula の西側の海を原点とする投影 CRS を表している。", out.width="49%", fig.show='hold', echo=FALSE, fig.scap="Illustration of vector (point) data."} -knitr::include_graphics(c("figures/vector_lonlat.png", "figures/vector_projected.png")) +knitr::include_graphics(c("images/vector_lonlat.png", "images/vector_projected.png")) ``` **sf** パッケージは、地理ベクタデータ用のクラスと、以下に説明する地理計算のための重要な低レベルライブラリへのコマンドラインインターフェースを一貫した方法で提供する。 - [GDAL](https://gdal.org/)\index{GDAL} は、Chapter \@ref(read-write) でカバーされる広範な地理データ形式の読み取り、書き込み、操作のためのものである。 -- [PROJ](https://proj.org/) は、 Chapter \@ref(reproj-geo-data) で扱う内容の根幹をなす座標系変換のための強力なライブラリ。 +- [PROJ](https://proj.org/) は、Chapter \@ref(reproj-geo-data) で扱う内容の根幹をなす座標系変換のための強力なライブラリ。 - [GEOS](https://libgeos.org/)\index{GEOS} は、投影型 CRS を持つデータに対してバッファや重心の計算などの操作を行う平面ジオメトリエンジン、Chapter \@ref(geometry-operations) でカバーする。 - [S2](https://s2geometry.io/) は、Google が開発した C++ で書かれた球面幾何学エンジンである。[**s2**](https://r-spatial.github.io/s2/) パッケージ経由で、この章の Section \@ref(s2) と Chapter \@ref(reproj-geo-data) でカバーする。 @@ -158,7 +158,7 @@ OGC 標準の完全版には、「サーフェス (surface)」や「カーブ (c ] ```{r sf-ogc, fig.cap="sf が完全にサポートするシンプルフィーチャ型", out.width="60%", echo=FALSE} -knitr::include_graphics("figures/sf-classes.png") +knitr::include_graphics("images/sf-classes.png") ``` **sf** は、点、線、ポリゴン、およびそれらの「複合」バージョン (同じ種類のフィーチャをまとめて 1 つのフィーチャとするもの) という一般的なベクタフィーチャのタイプをすべて表現できる (ラスタデータクラスは **sf** ではサポートされていない)。 @@ -473,7 +473,7 @@ Figure \@ref(fig:02-sfdiagram) は sf オブジェクトの作成方法を示し ```{r 02-sfdiagram, fig.cap="sf オブジェクトの構成。", echo=FALSE} # source("code/02-sfdiagram.R") -knitr::include_graphics("figures/02-sfdiagram.png") +knitr::include_graphics("images/02-sfdiagram.png") ``` フィーチャ以外の属性は、フィーチャの名称や、測定値、グループなどの属性を表す。 @@ -811,7 +811,7 @@ S2 ジオメトリエンジンはデフォルトでオンになっている。 sf_use_s2() ``` -ジオメトリエンジンをオフにした結果の例を以下に示す。この章で作成した `india` オブジェクトの周りにバッファを作成する (S2 をオフにしたときに発せられる警告に注意) (Figure \ref(fig:s2example))。 +ジオメトリエンジンをオフにした結果の例を以下に示す。この章で作成した `india` オブジェクトの周りにバッファを作成する (S2 をオフにしたときに発せられる警告に注意) (Figure \@ref(fig:s2example))。 ```{r} india_buffer_with_s2 = st_buffer(india, 1) # 1 メートル @@ -1086,7 +1086,7 @@ Figure \@ref(fig:datum-fig) の二つの測地系は、ジオイド (地球平 (ref:datum-fig) ジオイドの上に表示された地心座標系およびローカル測地系データ (フォールスカラーと、スケールファクター1万による垂直方向の誇張)。ジオイドの画像は @essd-11-647-2019 の作品から流用したものである。 ```{r datum-fig, echo=FALSE, message=FALSE, fig.cap="(ref:datum-fig)", fig.scap="Geocentric and local geodetic datums on a geoid."} -knitr::include_graphics("figures/02_datum_fig.png") +knitr::include_graphics("images/02_datum_fig.png") ``` ### 投影座標参照系 {#projected-coordinate-reference-systems} @@ -1122,7 +1122,7 @@ Chapter \@ref(reproj-geo-data) では、CRS について説明し、ある CRS ```{r vector-crs, echo=FALSE, fig.cap="ベクタデータ型の地理座標系 (WGS 84、左) と投影座標系 (NAD83 / UTMゾーン12N、右) の例。", message=FALSE, fig.asp=0.56, fig.scap="Examples of geographic and projected CRSs (vector data)."} # source("https://github.com/geocompx/geocompr/raw/main/code/02-vector-crs.R") -knitr::include_graphics("figures/02_vector_crs.png") +knitr::include_graphics("images/02_vector_crs.png") ``` ## 単位 {#units} diff --git a/04-spatial-operations-ja.Rmd b/04-spatial-operations-ja.Rmd index 805d938..6afe9ab 100644 --- a/04-spatial-operations-ja.Rmd +++ b/04-spatial-operations-ja.Rmd @@ -197,11 +197,6 @@ polygon_sfc = st_sfc(st_polygon(list(polygon_matrix))) 関数 `st_as_sf()` と引数 `coords` を使って、座標を表す列を含むデータフレームから、点を含む `sf` オブジェクトに効率的に変換していることに注目してみよう。 ```{r} -line_sfc = st_sfc(st_linestring(cbind( - x = c(0.4, 1), - y = c(0.2, 0.5) -))) -# create points point_df = data.frame( x = c(0.2, 0.7, 0.4), y = c(0.1, 0.2, 0.8) @@ -212,7 +207,6 @@ point_sf = st_as_sf(point_df, coords = c("x", "y")) ```{r relation-objects, echo=FALSE, fig.cap="点、線、ポリゴンのオブジェクトを配置し、トポロジー関係を表現。", fig.asp=1, out.width="50%", fig.scap="Demonstration of topological relations."} par(pty = "s") plot(polygon_sfc, border = "red", col = "gray", axes = TRUE) -plot(line_sfc, lwd = 5, add = TRUE) plot(point_sf, add = TRUE, lab = 1:4, cex = 2) text(point_df[, 1] + 0.02, point_df[, 2] + 0.04, 1:3, cex = 1.3) ``` @@ -686,7 +680,7 @@ sum(st_coordinates(cycle_hire)[, 1] %in% st_coordinates(cycle_hire_osm)[, 1]) ```{r cycle-hire, fig.cap="公式データ (青) とOpenStreetMapのデータ (赤) に基づく、ロンドンにおける自転車レンタルポイントの空間分布。", echo=FALSE, warning=FALSE, fig.scap="The spatial distribution of cycle hire points in London."} if (knitr::is_latex_output()){ - knitr::include_graphics("figures/cycle-hire-1.png") + knitr::include_graphics("images/cycle-hire-1.png") } else if (knitr::is_html_output()){ # library(tmap) # osm_tiles = tmaptools::read_osm(tmaptools::bb(cycle_hire, ext = 1.3), type = "https://korona.geog.uni-heidelberg.de/tiles/roadsg/x={x}&y={y}&z={z}") @@ -862,7 +856,7 @@ elev[clip] これは、Figure \@ref(fig:raster-subset) に示すように、2 番目のラスタ (ここでは `clip`) の範囲内にある最初のラスタオブジェクト (この場合は `elev`) の値を取得することになる。 ```{r raster-subset, echo = FALSE, fig.cap = "元のラスタ (左)。ラスタマスク (中)。ラスタをマスクした出力 (右)。", fig.scap="Subsetting raster values."} -knitr::include_graphics("figures/04_raster_subset.png") +knitr::include_graphics("images/04_raster_subset.png") ``` 上記の例では、特定のセルの値を返したが、多くの場合、ラスタデータセットの部分集合操作による空間出力が必要である。 @@ -956,7 +950,7 @@ elev > 5 ``` ```{r 04-local-operations, echo=FALSE, fig.cap="elev ラスタオブジェクトのさまざまなローカル操作の例: 2つのラスタの加算、二乗、対数変換の適用、論理演算の実行。"} -knitr::include_graphics("figures/04-local-operations.png") +knitr::include_graphics("images/04-local-operations.png") ``` ローカル演算のもう一つの良い例は、デジタル標高モデルを低標高 (クラス 1)、中標高 (クラス 2)、高標高 (クラス 3) にグループ化するように、数値の間隔をグループに分類することである。 @@ -1067,7 +1061,7 @@ r_focal = focal(elev, w = matrix(1, nrow = 3, ncol = 3), fun = min) この関数は、例えば、プロセス中の NA を削除すべきか (`na.rm = TRUE`)、しないか (`na.rm = FALSE`) などの追加引数も受け付ける。 ```{r focal-example, echo = FALSE, fig.cap = "焦点演算による入力ラスタ (左) と出力ラスタ (右) -3×3の移動窓で最小値を求める。", fig.scap="Illustration of a focal operation."} -knitr::include_graphics("figures/04_focal_example.png") +knitr::include_graphics("images/04_focal_example.png") ``` 期待通りの出力が得られるかどうか、すぐに確認することができる。 diff --git a/05-geometry-operations-ja.Rmd b/05-geometry-operations-ja.Rmd index 22e78ca..4ec9511 100644 --- a/05-geometry-operations-ja.Rmd +++ b/05-geometry-operations-ja.Rmd @@ -538,7 +538,7 @@ p_sc1 = tm_shape(st_sfc(multipoint, crs = "+proj=merc")) + tm_symbols(shape = 1, p_sc2 = tm_shape(st_sfc(linestring, crs = "+proj=merc")) + tm_lines() + tm_title("複合線") + tm_layout(inner.margins = c(0.15, 0.05, 0.15, 0.05)) -p_sc3 = tm_shape(st_sfc(polyg, crs = "+proj=merc")) + tm_polygons(border.col = "black") + +p_sc3 = tm_shape(st_sfc(polyg, crs = "+proj=merc")) + tm_polygons(col = "black") + tm_title("ポリゴン") + tm_layout(inner.margins = c(0.15, 0.05, 0.15, 0.05)) tmap_arrange(p_sc1, p_sc2, p_sc3, ncol = 3) diff --git a/06-raster-vector-ja.Rmd b/06-raster-vector-ja.Rmd index 9f22f03..9acf9b4 100644 --- a/06-raster-vector-ja.Rmd +++ b/06-raster-vector-ja.Rmd @@ -469,7 +469,7 @@ Figure \@ref(fig:contour-tmap) に示すように、等値線 (isoline) には # plot(dem, col = terrain.colors(25), alpha = 0.5, legend = FALSE, add = TRUE) # # add contour lines # contour(dem, col = "white", add = TRUE) -knitr::include_graphics("figures/06-contour-tmap.png") +knitr::include_graphics("images/06-contour-tmap.png") ``` \index{くうかんべくたか@空間ベクタ化!ぽりごん@ポリゴン} diff --git a/07-reproj-ja.Rmd b/07-reproj-ja.Rmd index e18ea97..ed808e5 100644 --- a/07-reproj-ja.Rmd +++ b/07-reproj-ja.Rmd @@ -100,7 +100,7 @@ WKT の CRS 定義が登場する以前は、proj-string が座標操作の指 \index{CRS!proj-string} 最近 (ver 6 以降) の PROJ のバージョンでは、座標操作を定義するために proj-string を使用することができるが、いくつかの proj-string キー (`+nadgrids` , `+towgs84` , `+k` , `+init=epsg:`) はもうサポートされていないか、推奨されないものである。 また、proj-string に直接設定できる測地基準系 (datum) は 3 つ (WGS84、NAD83、NAD27) だけである。 -CRS の定義の進化と PROJ ライブラリの長い説明は、@bivand_progress_2021、@pebesma_spatial_2022 の第 2 章、[Floris Vanderhaeghe によるブログ](https://inbo.github.io/tutorials/tutorials/spatial_crs_coding/)に記載されている。 +CRS の定義の進化と PROJ ライブラリの長い説明は、@bivand_progress_2021、@pebesma_spatial_2022 の第 2 章、Floris Vanderhaeghe によるブログ ([https://inbo.github.io/tutorials/tutorials/spatial_crs_coding/](https://inbo.github.io/tutorials/tutorials/spatial_crs_coding/)) に記載されている。 [PROJ documentation](https://proj.org/development/reference/cpp/cpp_general.html) にも概説されているように、WKT CRS 形式には WKT1 と 2 種類の WKT2 があり、後者 (WKT2, 2018 仕様) は ISO 19111:2019 に対応するものである [@opengeospatialconsortium_wellknown_2019]。 ## 座標系の照会と設定 {#crs-setting} @@ -238,20 +238,20 @@ Figure \@ref(fig:s2geos) で示すように、**sf** は、CRS 種別に応じ }' -> s2geos # # exported manually; the code below returns a low res version of png # tmp = DiagrammeR::grViz(s2geos) -# htmlwidgets::saveWidget(widget = tmp, file = "figures/07-s2geos.html") +# htmlwidgets::saveWidget(widget = tmp, file = "images/07-s2geos.html") # # tmp # tmp = DiagrammeRsvg::export_svg(tmp) # library(htmltools) # html_print(HTML(tmp)) # tmp = charToRaw(tmp) -# # rsvg::rsvg_png(tmp, "figures/07-s2geos.png") -# webshot::webshot(url = "figures/07-s2geos.html", file = "figures/07-s2geos.png", vwidth = 800, vheight = 600) +# # rsvg::rsvg_png(tmp, "images/07-s2geos.png") +# webshot::webshot(url = "images/07-s2geos.html", file = "images/07-s2geos.png", vwidth = 800, vheight = 600) # download.file( # "https://user-images.githubusercontent.com/1825120/188572856-7946ae32-98de-444c-9f48-b1d7afcf9345.png", -# destfile = "figures/07-s2geos.png" +# destfile = "images/07-s2geos.png" # ) -# browseURL("figures/07-s2geos.png") -knitr::include_graphics("figures/07-s2geos.png") +# browseURL("images/07-s2geos.png") +knitr::include_graphics("images/07-s2geos.png") ``` CRS の重要性を示すために、このセクションでは、前セクションで作成した `london` オブジェクトの周りに 100 km のバッファを作成する。 diff --git a/08-read-write-plot-ja.Rmd b/08-read-write-plot-ja.Rmd index b1ab009..4452b1a 100644 --- a/08-read-write-plot-ja.Rmd +++ b/08-read-write-plot-ja.Rmd @@ -64,9 +64,11 @@ knitr::kable(file_formats, caption = "代表的な空間ファイル形式。", caption.short = "Selected spatial file formats.", booktabs = TRUE) |> - kableExtra::column_spec(2, width = "7em") |> - kableExtra::column_spec(3, width = "14em") |> - kableExtra::column_spec(5, width = "7em") + kableExtra::column_spec(2, width = "5em") |> + kableExtra::column_spec(3, width = "12em") |> + kableExtra::column_spec(4, width = "4em") |> + kableExtra::column_spec(5, width = "5em") |> + kableExtra::kable_styling(latex_options = "scale_down") ``` \index{Shapefile} @@ -429,6 +431,7 @@ writeRaster(x = single_layer, filename = "my_raster.tif", gdal = c("COMPRESS=NONE"), overwrite = TRUE) ``` +\index{COG} さらに、`filetype = "COG"` のオプションでラスタオブジェクトを COG (*Cloud Optimized GeoTIFF*, Section \@ref(file-formats) ) として保存することができる。 ```{r 07-read-write-plot-35b, eval=FALSE} @@ -441,7 +444,7 @@ GeoTIFF 形式の圧縮については、Paul Ramsey の [GeoTIFF 圧縮につ ## オープンデータの取得 {#retrieving-data} \index{おーぷんでーた@オープンデータ} -インターネット上には地理データが膨大かつ増え続け、その多くは無料でアクセス・利用することができる (ただし、提供者のクレジットを適切に表示することが必要)。^[例えば、自由に使える地理データの長いサイト一覧が https://freegisdata.rtwilson.com/ にある。] +インターネット上には地理データが膨大かつ増え続け、その多くは無料でアクセス・利用することができる (ただし、提供者のクレジットを適切に表示することが必要)。^[例えば、自由に使える地理データの長いサイト一覧が [https://freegisdata.rtwilson.com/](https://freegisdata.rtwilson.com/) にある。] 同じデータセットにアクセスする場所が複数あるという意味で、ある意味、データは多すぎるくらいにある。 一部のデータセットは品質が低い。 そこで、最初に最も重要な情報源をいくつか紹介する。 @@ -485,10 +488,11 @@ datapackages = tibble::tribble( "rnoaa", "米国海洋大気庁 (National Oceanic and Atmospheric Administration, NOAA) の気候データをインポート。" ) knitr::kable(datapackages, - caption = "地理データ取得の代表的 R パッケージ", + caption = "Selected R packages for geographic data retrieval.", caption.short = "Selected R packages for geographic data retrieval.", - booktabs = TRUE) |> - kableExtra::kable_styling(latex_options="scale_down") + booktabs = TRUE) |> + kableExtra::column_spec(1, width = "5em") |> + kableExtra::column_spec(2, width = "22em") ``` @@ -591,7 +595,7 @@ Chapter \@ref(gis) で紹介するように、地理データは地理ソフト 地理メタデータは **geometa** で管理することができる。**geometa** は ISO/OGC 標準に従って地理メタデータの書き込み、読み込み、検証ができるパッケージである。 **geometa** は、ISO 19110 (Feature catalogue)、ISO 19115-1 および 19115-2 (Geographic metadata for vector and gridded/imagery datasets)、ISO 19119 (geographic metadata for service)、ISO 19136 (Geographic Markup Language) など、地理メタデータ情報に関するさまざまな国際標準をすでにサポートしており、ISO/TS 19139 (XML) 技術仕様を使ってRから地理メタデータを読み込んだり、検証したり、書き込んだりする方法を提供しています。 -規格の複雑さと網羅性、そしてそれらを使用するために必要な高度な知識に対処するために、[geoflow](https://github.com/r-geoflow/geoflow) のような補完的なパッケージが、メタデータの管理を容易にし、自動化するために構築されている。 + 地理メタデータは、**geometa** で以下のように作成することができ、メタデータファイルを作成して保存する。 ```{r 07-read-write-plot-m5, eval=FALSE} @@ -698,10 +702,9 @@ fao_areas = read_sf(file) しかし、多くの日常的な作業には、より高レベルのインターフェースの方が適している場合があり、この目的のために多くのRパッケージやチュートリアルが開発されている。 OWS サービスを利用する **ows4R** というパッケージが開発された。 WFS、データ用の WCS、メタデータ用の CSW、処理用の WPS など、一般的なアクセスサービスへの安定したインタフェースを提供する。 -OGC のサービスカバレッジは[こちら](https://github.com/eblondel/ows4R?tab=readme-ov-file#ogc-standards-coverage-status)に記載されており、新しい標準プロトコルは調査/開発中である。 - -上記の例に基づいて、このパッケージで `getCapabilities` と `getFeatures` の操作を実行する方法を以下のコードに示します。 +OGC のサービスカバレッジは [github.com/eblondel/ows4R](https://github.com/eblondel/ows4R?tab=readme-ov-file#ogc-standards-coverage-status) にあるパッケージの README に記載されており、新しい標準プロトコルは調査/開発中である。 +上記の例に基づいて、このパッケージで `getCapabilities` と `getFeatures` の操作を実行する方法を以下のコードに示す。 **ows4R** パッケージはクライアントの原理に依存している。 OWSサービス (WFS など) と対話するために、以下のようにクライアントを作成する。 diff --git a/09-mapping-ja.Rmd b/09-mapping-ja.Rmd index a55704b..5ae2878 100644 --- a/09-mapping-ja.Rmd +++ b/09-mapping-ja.Rmd @@ -695,9 +695,9 @@ Figure \@ref(fig:urban-animated) は、地図アニメーションの簡単な ```{r urban-animated, message=FALSE, fig.cap="1950年から2030年までの、国連による人口予測に基づく都市集積の上位30位を示した地図アニメーション。アニメーション版は、geocompr.robinlovelace.net で見ることができる。", fig.scap="Animated map showing the top 30 largest 'urban agglomerations'.", echo=FALSE, fig.height=3.3} if (knitr::is_latex_output()){ - knitr::include_graphics("figures/urban-animated.png") + knitr::include_graphics("images/urban-animated.png") } else if (knitr::is_html_output()){ - knitr::include_graphics("figures/urban-animated.gif") + knitr::include_graphics("images/urban-animated.gif") } ``` @@ -737,7 +737,7 @@ source("https://github.com/geocompx/geocompr/raw/main/code/09-usboundaries.R") ```{r animus, echo=FALSE, message=FALSE, fig.cap="米国における人口増加、州形成、境界線の変化を示す地図アニメーション (1790-2010年)。アニメーション版は r.geocompx.org でオンライン公開。", fig.scap="Animated map showing boundary changes in the United States."} u_animus_html = "https://user-images.githubusercontent.com/1825120/38543030-5794b6f0-3c9b-11e8-9da9-10ec1f3ea726.gif" -u_animus_pdf = "figures/animus.png" +u_animus_pdf = "images/animus.png" if (knitr::is_latex_output()){ knitr::include_graphics(u_animus_pdf) } else if (knitr::is_html_output()){ @@ -760,7 +760,8 @@ if (knitr::is_latex_output()){ **tmap** (すでに学習済みの構文)、**mapview**\index{mapview (package)}、**mapdeck**\index{mapdeck (package)}そして最後に **leaflet** \index{leaflet (package)} (対話型地図の低レベル制御を提供) を使って、動く地図を作成する方法を探究する。 Section \@ref(static-maps) で述べた **tmap** は、同じコードを使って静的な地図とインタラクティブな地図を作ることができる。 -`tmap_mode("view")` というコマンドでビューモードに切り替えることで、任意の時点でインタラクティブ表示に切り替えることができる。以下のコードは、`tmap` オブジェクト `map_nz` に基づいて New Zealand のインタラクティブ地図を作成し、Section \@ref(map-obj) で作成し、Figure \@ref(fig:tmview) で図示している。 +`tmap_mode("view")` というコマンドでビューモードに切り替えることで、任意の時点でインタラクティブ表示に切り替えることができる。 +以下のコードは、`tmap` オブジェクト `map_nz` に基づいて New Zealand のインタラクティブ地図を作成し、Section \@ref(map-obj) で作成し、Figure \@ref(fig:tmview) で図示している。 ```{r 08-mapping-25, eval=FALSE} tmap_mode("view") @@ -769,12 +770,12 @@ map_nz ```{r tmview, message=FALSE, fig.cap="**tmap** のビューモードで作成されたNew Zealand のインタラクティブ地図。インタラクティブ版は r.geocompx.org からオンラインで入手可能。", fig.scap="Interactive map of New Zealand.", echo=FALSE} if (knitr::is_latex_output()){ - knitr::include_graphics("figures/tmview-1.png") + knitr::include_graphics("images/tmview-1.png") } else if (knitr::is_html_output()){ # tmap_mode("view") # m_tmview = map_nz # tmap_save(m_tmview, "tmview-1.html") - # file.copy("tmview-1.html", "~/geocompr/geocompr.github.io/static/img/tmview-1.html") + # file.copy("tmview-1.html", "../geocompx.org/static/img/tmview-1.html") knitr::include_url("https://geocompx.org/static/img/tmview-1.html") } ``` @@ -797,7 +798,7 @@ tm_shape(world_coffee) + tm_polygons(facets) + ``` ```{r sync, message=FALSE, fig.cap="2016年と2017年の世界のコーヒー生産量を同期させたファセット化されたインタラクティブ地図で、tmapのビューモードの動作を実演。", fig.scap="Faceted interactive maps of global coffee production.", echo=FALSE} -knitr::include_graphics("figures/interactive-facets.png") +knitr::include_graphics("images/interactive-facets.png") ``` 同じ機能で **tmap** をプロットモードに戻す。 @@ -814,7 +815,7 @@ mapview::mapview(nz) ``` ```{r mapview, message=FALSE, fig.cap="**mapview** の動作イメージ図。", echo=FALSE} -knitr::include_graphics("figures/mapview.png") +knitr::include_graphics("images/mapview.png") # knitr::include_graphics("https://user-images.githubusercontent.com/1825120/39979522-e8277398-573e-11e8-8c55-d72c6bcc58a4.png") # mv = mapview::mapview(nz) # mv@map @@ -841,11 +842,11 @@ trails |> ``` ```{r mapview2, message=FALSE, fig.cap="sf ベースのパイプ式の末尾で **mapview** を使用。", echo=FALSE, warning=FALSE} -knitr::include_graphics("figures/mapview-example.png") +knitr::include_graphics("images/mapview-example.png") # knitr::include_graphics("https://user-images.githubusercontent.com/1825120/39979271-5f515256-573d-11e8-9ede-e472ca007d73.png") ``` -注意点としては、**mapview**のレイヤは `+` 演算子で追加する (**ggplot2** や **tmap** に似ている)。 +注意点としては、**mapview** のレイヤは `+` 演算子で追加する (**ggplot2** や **tmap** に似ている)。 デフォルトでは、**mapview** はユーザーフレンドリーで機能の多い leaflet JavaScript ライブラリを使い、地図を出力する。 しかし、他のレンダリングライブラリの方がパフォーマンスが良い (巨大なデータでもスムーズ)。 **mapview** は、レンダリングライブラリ (`"leafgl"` と `"mapdeck"`) を、`mapviewOptions()` で設定することができる。^[巨大なラスタデータの可視化には、`mapviewOptions(georaster = TRUE)` も試してみると良いだろう。] @@ -885,7 +886,7 @@ mapdeck(style = ms, pitch = 45, location = c(0, 52), zoom = 4) |> ``` ```{r mapdeck, echo=FALSE, fig.cap="**mapdeck** によって生成された、イギリス全土の道路交通事故死傷者数を表す地図。1kmのセルの高さは事故件数を表す。", fig.scap="Map generated by mapdeck."} -knitr::include_graphics("figures/mapdeck-mini.png") +knitr::include_graphics("images/mapdeck-mini.png") ``` ブラウザでは、ズームやドラッグのほか、`Cmd` / `Ctrl` を押すと、地図を回転させたり傾けたりすることができる。 @@ -920,7 +921,7 @@ leaflet(data = cycle_hire) |> ```{r leaflet, message=FALSE, fig.cap="ロンドン市内の自転車レンタルポイントを紹介した **leaflet** パッケージの実例。インタラクティブ版は[オンライン](https://geocompr.github.io/img/leaflet.html)を参照。", fig.scap="The leaflet package in action.", echo=FALSE} if (knitr::is_latex_output() || knitr::is_html_output()){ - knitr::include_graphics("figures/leaflet-1.png") + knitr::include_graphics("images/leaflet-1.png") } else { # pre-generated for https://github.com/ropensci/stplanr/issues/385 # pal = colorNumeric("RdYlBu", domain = cycle_hire$nbikes) @@ -994,7 +995,7 @@ shinyApp(ui, server) ```{r lifeApp, echo=FALSE, message=FALSE, fig.cap="shiny で作成したWeb地図アプリケーションの最小限の例を示す画面。", fig.scap="Minimal example of a web mapping application."} # knitr::include_graphics("https://user-images.githubusercontent.com/1825120/39690606-8f9400c8-51d2-11e8-84d7-f4a66a477d2a.png") -knitr::include_graphics("figures/shiny-app.png") +knitr::include_graphics("images/shiny-app.png") ``` lifeApp の**ユーザーインターフェース** (`ui`) は `fluidPage()` で作成されている。 diff --git a/10-gis-ja.Rmd b/10-gis-ja.Rmd index 449af61..3ea5457 100644 --- a/10-gis-ja.Rmd +++ b/10-gis-ja.Rmd @@ -88,9 +88,9 @@ GIS ブリッジを通すことで、R はさまざまな作業を実行でき この章では、Table \@ref(tab:gis-comp) にまとめた 3 つの成熟したオープンソース GIS 製品への「ブリッジ」に焦点を当てる。 -- QGIS\index{QGIS} (**qgisprocess**\index{qgisprocess (package)}; Section \@ref(rqgis)) -- SAGA\index{SAGA} (**Rsagacmd**\index{Rsagacmd (package)}; Section \@ref(saga)) -- GRASS GIS\index{GRASS GIS} (**rgrass**\index{rgrass (package)}; Section \@ref(grass)) +- QGIS\index{QGIS} **qgisprocess**\index{qgisprocess (package)}; [@R-qgisprocess; Section \@ref(rqgis)] +- SAGA\index{SAGA} **Rsagacmd**\index{Rsagacmd (package)}; [@R-Rsagacmd; Section \@ref(saga)] +- GRASS GIS\index{GRASS GIS} **rgrass**\index{rgrass (package)}; [@R-rgrass; Section \@ref(grass)] また、QGIS\index{QGIS} ([docs.qgis.org](https://docs.qgis.org/3.28/en/docs/training_manual/processing/r_intro.html) 参照) や GRASS GIS\index{GRASS GIS} ([grasswiki.osgeo.org](https://grasswiki.osgeo.org/wiki/R_statistics/rgrass#R_within_GRASS) 参照) など GIS から R を実行する環境も開発されている。 @@ -136,7 +136,7 @@ Docker をインストールしており、十分な実行環境のある方は ``` -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} library(qgisprocess) #> Attempting to load the cache ... Success! #> QGIS version: 3.30.3-'s-Hertogenbosch @@ -149,7 +149,7 @@ library(qgisprocess) 詳細については、**qgisprocess** ['getting started' vignette](https://r-spatial.github.io/qgisprocess/articles/qgisprocess.html) を参照。 次に、どのプラグイン (異なるソフトウェアを意味する) が自分のコンピュータで利用できるかを調べてみよう。 -```{r plugins, eval=has_qgis_plugins} +```{r plugins, eval=FALSE} qgis_plugins() #> # A tibble: 4 × 2 #> name enabled @@ -163,7 +163,7 @@ qgis_plugins() プラグイン GRASS GIS (`grassprovider`) と SAGA (`processing_saga_nextgen`) が存在しているが、有効になっていないことがわかる。 この二つは本章の後半で使用するので、有効化しよう。 -```{r enable-providers, eval=has_qgis_plugins} +```{r enable-providers, eval=FALSE} qgis_enable_plugins(c("grassprovider", "processing_saga_nextgen"), quiet = TRUE) ``` @@ -173,7 +173,7 @@ SAGA のほかにも、QGIS Python プラグイン Processing Saga NextGen を `qgis_providers()` で、ソフトウェアの名称と対応するジオアルゴリズム数の一覧を表示する。 -```{r providers, eval=has_qgis_plugins} +```{r providers, eval=FALSE} qgis_providers() #> # A tibble: 7 × 3 #> provider provider_title algorithm_count @@ -226,7 +226,7 @@ tm_shape(incongr_wgs) + `qgis_algorithms()` 関数は、利用可能なアルゴリズムをすべて表示する。 この関数は、利用可能なすべてのプロバイダと、それらが含むアルゴリズムを含むデータフレームを返す。^[したがって、予想されるプロバイダが表示されない場合は、まだ外部の GIS ソフトウェアをインストールする必要があると思われる。] -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} # 出力は表示せず qgis_algo = qgis_algorithms() ``` @@ -234,7 +234,7 @@ qgis_algo = qgis_algorithms() `qgis_search_algorithms()` 関数は、アルゴリズムを探すために使うことができる。 関数の短い説明文に "union"\index{けつごう@結合 (union)}という単語が含まれていると仮定すると、以下のコードを実行して、興味のあるアルゴリズムを見つけることができる。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} qgis_search_algorithms("union") #> # A tibble: 2 × 5 #> provider provider_title group algorithm algorithm_title @@ -249,7 +249,7 @@ qgis_search_algorithms("union") これによって、出力が長くなる。 以下のコマンドは、各行に `"native:union"` が必要とする引数を表すデータフレームを返し、各列は名前、説明、種類、デフォルト値、とりうる値を示す。 -```{r 09-gis-6, eval=has_qgis_plugins, linewidth=80} +```{r 09-gis-6, eval=FALSE, linewidth=80} alg = "native:union" union_arguments = qgis_get_argument_specs(alg) union_arguments @@ -295,7 +295,7 @@ union **qgisprocess** パッケージは、`qgis_run_algorithm()` の結果を、この場合は出力ファイルへのパスを含むリストとして保存する。 このファイルを R に読み戻すには、`read_sf()` (例, `union_sf = read_sf(union[[1]])` を使うか、`st_as_sf()` を使って直接読み込むことができる。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} union_sf = st_as_sf(union) ``` @@ -358,7 +358,7 @@ qgis_get_argument_specs("grass:v.clean") |> このアルゴリズムを実行し、その出力を新しい `sf` オブジェクト `clean_sf` に変換してみよう。 -```{r 09-gis-7c, eval=has_qgis_plugins, message=FALSE} +```{r 09-gis-7c, eval=FALSE, message=FALSE} clean = qgis_run_algorithm("grass7:v.clean", input = union_sf, tool = "rmarea", threshold = 25000 @@ -369,7 +369,7 @@ clean_sf = st_as_sf(clean) その結果、\@ref(fig:sliver) の右側のパネルでは、予想通り、灰色のポリゴンが削除されているように見える。 ```{r sliver, echo=FALSE, fig.cap="灰色部分を赤で強調 (左) と灰色部分を除去 (右)。"} -knitr::include_graphics("figures/10-sliver.png") +knitr::include_graphics("images/10-sliver.png") ``` ### ラスタデータ {#qgis-raster} @@ -382,7 +382,7 @@ DEM は、衛星航法、水流モデル、表面分析、可視化など、さ このセクションでは、`dem.tif` を使用することにする。これは、Mongón 調査地域のデジタル標高モデルである (Land Process Distributed Active Archive Center からダウンロード、`?dem.tif` も参照)。 解像度は約 30 m × 30 m で、投影型 CRS を使用している。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} library(qgisprocess) library(terra) dem = rast(system.file("raster/dem.tif", package = "spDataLarge")) @@ -393,7 +393,7 @@ dem = rast(system.file("raster/dem.tif", package = "spDataLarge")) 例えば、地形湿潤指数 (Topologic Wetness Index, TWI)\index{ちけいしつじゅんしすう@地形湿潤指数} は、水文・生物学的プロセスの研究に有用であることがわかっている [@sorensen_calculation_2006]。 このインデックスのアルゴリズムリストを、`"wetness"` というキーワードで検索してみよう。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} qgis_search_algorithms("wetness") |> dplyr::select(provider_title, algorithm) |> head(2) @@ -422,7 +422,7 @@ QGIS から SAGA アルゴリズムを使う前に、デフォルトのラスタ これで、指定しなければ保存形式は `.sdat` となる。 ソフトウェア (SAGA, GDAL) のバージョンによっては必要はないが、SAGA のラスタに関する問題を未然に防ぐことができる。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} options(qgisprocess.tmp_raster_ext = ".sdat") dem_wetness = qgis_run_algorithm("sagang:sagawetnessindex", DEM = dem @@ -433,7 +433,7 @@ dem_wetness = qgis_run_algorithm("sagang:sagawetnessindex", 選択された出力は、`qgis_as_terra()` 関数に出力名を与えることで読むことができる。 QGIS から SAGA を使う作業は終わったので、デフォルト形式を `.tif` に戻す。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} dem_wetness_twi = qgis_as_terra(dem_wetness$TWI) # plot(dem_wetness_twi) options(qgisprocess.tmp_raster_ext = ".tif") @@ -458,7 +458,7 @@ qgis_show_help("grass:r.geomorphon") フラグ `search` は視線距離を計算する長さ、および `-m` は検索値を (セル数ではなく) メートル単位で提供することを指定する。 追加論点の詳細は、原著論文と [GRASS GIS documentation](https://grass.osgeo.org/grass78/manuals/r.geomorphon.html) に記載されている。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} dem_geomorph = qgis_run_algorithm("grass7:r.geomorphon", elevation = dem, `-m` = TRUE, search = 120 @@ -468,7 +468,7 @@ dem_geomorph = qgis_run_algorithm("grass7:r.geomorphon", 出力される `dem_geomorph$forms` は、10 個のカテゴリからなるラスタファイルで、それぞれが地形形状を表している。 これを `qgis_as_terra()` で R に読み込んで可視化したり (Figure \@ref(fig:qgis-raster-map) 右図)、その後の計算で使うことができる。 -```{r, eval=has_qgis_plugins} +```{r, eval=FALSE} dem_geomorph_terra = qgis_as_terra(dem_geomorph$forms) ``` @@ -476,7 +476,7 @@ dem_geomorph_terra = qgis_as_terra(dem_geomorph$forms) TWI 値が最も大きいのは谷や窪地であり、最も小さいのは予想通り尾根であった。 ```{r qgis-raster-map, echo=FALSE, fig.cap="研究対象地 Mongón の地形湿潤指数 (TWI、パネル左) とジオモルフォン (パネル右)。"} -knitr::include_graphics("figures/10-qgis-raster-map.png") +knitr::include_graphics("images/10-qgis-raster-map.png") ``` ## SAGA {#saga} @@ -553,7 +553,7 @@ ndvi_segments = ndvi_srg$segments |> ``` ```{r sagasegments, echo=FALSE, fig.cap="正規化差分植生指数 (NDVI、左図) と、Mongón調査地域のシード領域成長アルゴリズムを用いて得られた NDVI ベースのセグメント。"} -knitr::include_graphics("figures/10-saga-segments.png") +knitr::include_graphics("images/10-saga-segments.png") ``` 結果として得られるポリゴン (セグメント) は、類似した値を持つ領域を表す。 @@ -697,14 +697,14 @@ mapview::mapview(route) + points ``` ```{r grass-mapview, fig.cap="ロンドンの OSM 道路網の24の自転車レンタル地点 (青点) とその最短ルート (青線) ", fig.scap="Shortest route between 24 cycle hire stations.", echo=FALSE, out.width="80%"} -knitr::include_graphics("figures/10_shortest_route.png") +knitr::include_graphics("images/10_shortest_route.png") ``` ```{r 09-gis-35, eval=FALSE, echo=FALSE} library(mapview) m_1 = mapview(route) + points mapview::mapshot(m_1, - file = file.path(getwd(), "figures/09_shortest_route.png"), + file = file.path(getwd(), "images/09_shortest_route.png"), remove_controls = c( "homeButton", "layersControl", "zoomControl" diff --git a/11-algorithms-ja.Rmd b/11-algorithms-ja.Rmd index 7580f15..f9fa704 100644 --- a/11-algorithms-ja.Rmd +++ b/11-algorithms-ja.Rmd @@ -85,7 +85,7 @@ R スクリプトで再現性を強制するのは難しいが、それを助け RStudio\index{RStudio} は、デフォルトで R スクリプトを「コードチェック」し、不具合のあるコードに赤い波線を引く (下図参照)。 ```{r codecheck, echo=FALSE, fig.cap="RStudio でのコード確認の様子。この例は 11-centroid-alg.R スクリプトの 19 行目のカッコが閉じられていないことを示している。", fig.scap="Illustration of 'code checking' in RStudio."} -knitr::include_graphics("figures/codecheck.png") +knitr::include_graphics("images/codecheck.png") ``` ```{block2 spellcheck, type='rmdnote'} @@ -422,7 +422,7 @@ identical(poly_centroid_sfg(poly_mat), sf::st_centroid(poly_sfc)) 新しいアルゴリズム\index{あるごりずむ@アルゴリズム}を効率的に実装する際の課題は、実運用で使用することを意図していない単純な関数を作成するために費やした作業量を考慮すると、はるかに遠い。現在の状態では、`poly_centroid()` はほとんどの (非凸) ポリゴンで失敗する! ここから生じる疑問は、関数\index{かんすう@関数}をどのように一般化するかということである。 -(1) 非凸ポリゴンを三角測量する方法を探す (この章をサポートするオンライン記事 [algorithm](https://geocompx.github.io/geocompkg/articles/algorithm.html) で扱っている話題) と (2) 三角メッシュに依存しない他の重心のアルゴリズムを調べるという2つの選択肢がある。 +(1) 非凸ポリゴンを三角測量する方法を探す (geocompx.github.io/geocompkg/articles/ のオンライン記事 [Algorithms Extended](https://geocompx.github.io/geocompkg/articles/algorithm.html) で扱っている話題) と (2) 三角メッシュに依存しない他の重心のアルゴリズムを調べるという 2 つの選択肢がある。 もっと大きな疑問は、高性能なアルゴリズムがすでに実装され、`st_centroid()` のような関数にパッケージされているのに、ソリューションをプログラミングする価値があるのだろうか、ということである。 この具体的なケースにおける還元論的な答えは「価値はない」である。 diff --git a/12-spatial-cv-ja.Rmd b/12-spatial-cv-ja.Rmd index 7067a47..d154cee 100644 --- a/12-spatial-cv-ja.Rmd +++ b/12-spatial-cv-ja.Rmd @@ -106,9 +106,9 @@ ta = terra::rast(system.file("raster/ta.tif", package = "spDataLarge")) # tm_symbols(fill = "lslpts", size = 0.5, col = "white", # fill.scale = tm_scale(values = c("#0071A6", "#C73000")), fill.legend = tm_legend(title = "Landslide: ")) + # tm_layout(inner.margins = rep(0, 4), legend.bg.color = "white", legend.position = tm_pos_in()) -# tmap::tmap_save(map, filename = "figures/lsl-map-1.png", width = 11, +# tmap::tmap_save(map, filename = "images/lsl-map-1.png", width = 11, # height = 11, units = "cm") -knitr::include_graphics("figures/lsl-map-1.png") +knitr::include_graphics("images/lsl-map-1.png") ``` \index{hillshade} @@ -202,9 +202,9 @@ pred = terra::predict(ta, model = fit, type = "response") # tm_layout(legend.position = c("LEFT", "BOTTOM"), # legend.title.size = 0.8, # inner.margins = rep(0, 4)) -# tmap::tmap_save(map2, filename = "figures/lsl-susc-1.png", width = 11, +# tmap::tmap_save(map2, filename = "images/lsl-susc-1.png", width = 11, # height = 13, units = "cm") -knitr::include_graphics("figures/lsl-susc-1.png") +knitr::include_graphics("images/lsl-susc-1.png") ``` ここで、予測を行う際には、空間自己相関構造があってもなくても平均的に予測精度は変わらないと仮定しているため、空間自己相関\index{じこそうかん@自己相関!くうかん@空間}を無視する。 @@ -258,7 +258,7 @@ Chapter \@ref(transport) で見るように、地理学の「第一法則」は その結果、空間 CV はモデルの予測性能のバイアスを低減させ、過適合\index{かてきごう@過適合}を回避するのに役立つ。 ```{r partitioning, fig.cap="1 回の繰り返しの交差検証で選択されたテストおよびトレーニングの観測の空間的な可視化。ランダム (上段) および空間分割 (下段)。", echo=FALSE, fig.scap="Spatial visualization of selected test and training observations."} -knitr::include_graphics("figures/12_partitioning.png") +knitr::include_graphics("images/12_partitioning.png") ``` ## **mlr3** を用いた空間交差検証 {#spatial-cv-with-mlr3} @@ -275,7 +275,7 @@ Figure \@ref(fig:building-blocks) に示すように、これらは明確な順 (ref:building-blocks) mlr3 パッケージの基本的な構成要素。Source: @becker_mlr3_2022 (この図の再利用を快く承諾していただいた。) ```{r building-blocks, echo=FALSE, fig.height=4, fig.width=4, fig.cap="(ref:building-blocks)", fig.scap="Basic building blocks of the mlr3 package."} -knitr::include_graphics("figures/12_ml_abstraction_crop.png") +knitr::include_graphics("images/12_ml_abstraction_crop.png") ``` **mlr3** のモデリングプロセスは、主に3つのステージで構成されている。 @@ -521,7 +521,7 @@ perf_level = mlr3::rsmp("repeated_spcv_coords", folds = 5, repeats = 100) これは、ネストされた空間交差検証 \index{こうさけんしょう@交差検証!くうかん@空間} を用いることで回避することができる。 ```{r inner-outer, echo=FALSE, fig.cap="CV におけるハイパーパラメータのチューニングと性能推定レベルの模式図 (図は Schratz et al. (2019) から引用した。快く再利用の許可をいただいた)。", fig.scap="Schematic of hyperparameter tuning."} -knitr::include_graphics("figures/12_cv.png") +knitr::include_graphics("images/12_cv.png") ``` これは、各フォールドを空間的に不連続な 5 つのサブフォールドに再び分割し、最適なハイパーパラメータ \index{はいぱーぱらめーた@ハイパーパラメータ} (`tune_level` 以下のコードチャンクのオブジェクト。視覚的表現については Figure \@ref(fig:inner-outer) を参照) を決定するために使用することを意味する。 diff --git a/13-transport-ja.Rmd b/13-transport-ja.Rmd index 2114c0b..88e1b1f 100644 --- a/13-transport-ja.Rmd +++ b/13-transport-ja.Rmd @@ -94,7 +94,7 @@ tm_shape(region_all[1, ], bbox = region_all) + ``` ```{r bristol, echo=FALSE, fig.cap="Bristol の交通網は、アクティブ (緑)、公共 (鉄道、青)、自家用車 (赤) の各移動手段を色分けして表現している。黒い境界線は、市街地の境界線 (黄色でハイライト) と、より広い TTWA (Travel To Work Area) を表している。", fig.scap="Bristol's transport network."} -knitr::include_graphics("figures/13_bristol.png") +knitr::include_graphics("images/13_bristol.png") ``` Bristol は England で 10 番目に大きい市で、人口は 50 万人であるが、そのトラベルキャッチメントエリア\index{きゃっちめんとえりあ@キャッチメントエリア}はもっと大きい (Section \@ref(transport-zones) 参照)。 @@ -788,7 +788,7 @@ tm_shape(existing_cycleways_buffer, bbox = bristol_region) + lwd.scale = tm_scale(values.scale = 3), lwd.legend = tm_legend(title = "自転車トリップ数 (モデル化、一方向)"), position = tm_pos_out("center", "bottom")) -knitr::include_graphics("figures/bristol_cycleways_zoomed.png") +knitr::include_graphics("images/bristol_cycleways_zoomed.png") ``` この方法には限界がある。現実には、人々はゾーン重心に移動したり、特定のモードの最短ルート\index{さいたんるーと@最短ルート}アルゴリズムを常に使用するわけではない。 diff --git a/14-location-ja.Rmd b/14-location-ja.Rmd index a3bbe29..2c5510a 100644 --- a/14-location-ja.Rmd +++ b/14-location-ja.Rmd @@ -162,7 +162,7 @@ input_ras ``` ```{r census-stack, echo=FALSE, fig.cap="グリッド化した2011年ドイツ国勢調査 (クラスの内容は Table 13.1)。", fig.scap="Gridded German census data."} -knitr::include_graphics("figures/14_census_stack.png") +knitr::include_graphics("images/14_census_stack.png") ``` 次に、`input_ras` に格納されているラスタの値を、Section \@ref(case-study) で述べた調査に従って、Section \@ref(local-operations) \index{map algebra!local operations} で紹介した **raster** 関数 `reclassify()` を用いて再分類している。 @@ -243,7 +243,7 @@ metros = pop_agg |> ``` ```{r metro-areas, echo=FALSE, out.width= "70%", fig.cap="人口ラスタ (分解能20km)、大都市圏 (金色のポリゴン) とその名称。", fig.scap="The aggregated population raster."} -knitr::include_graphics("figures/14_metro_areas.png") +knitr::include_graphics("images/14_metro_areas.png") ``` 自転車店に適した 8 つの都市圏 (Figure \@ref(fig:metro-areas); 図の作成については `code/14-location-jm.R` も参照) が得られたが、まだ名前が分からない。 @@ -407,7 +407,7 @@ result = sum(reclass) ```{r bikeshop-berlin, echo=FALSE, eval=TRUE, fig.cap="ベルリンにおける自転車店の仮想調査に従った適切なエリア (スコア> 9のラスタセル)。", fig.scap="Suitable areas for bike stores.", warning=FALSE} if (knitr::is_latex_output()) { - knitr::include_graphics("figures/bikeshop-berlin-1.png") + knitr::include_graphics("images/bikeshop-berlin-1.png") } else if (knitr::is_html_output()) { library(leaflet) # Berlin の自転車屋を眺める diff --git a/15-eco-ja.Rmd b/15-eco-ja.Rmd index dca8598..a1af613 100644 --- a/15-eco-ja.Rmd +++ b/15-eco-ja.Rmd @@ -47,7 +47,7 @@ Mongón 山での野外調査において、2011年の冬に無作為にサン このため、沿岸部の砂漠では例年よりもさらに高いレベルの乾燥が発生し、Peru の**ロマ植生**山脈の南斜面では霧の活動が活発化した。 ```{r study-area-mongon, echo=FALSE, fig.cap="Mongón 山調査地、Muenchow, Schratz, and Brenning (2017) より。", out.width="60%", fig.scap="The Mt. Mongón study area."} -knitr::include_graphics("figures/15_study_area_mongon.png") +knitr::include_graphics("images/15_study_area_mongon.png") # knitr::include_graphics("https://user-images.githubusercontent.com/1825120/38989956-6eae7c9a-43d0-11e8-8f25-3dd3594f7e74.png") ``` @@ -114,7 +114,7 @@ Figure \@ref(fig:sa-mongon) に示すように、`dem` に `random_points` と ` # tmap_save(tm, "figures/15_sa_mongon_sampling.png", # width = 12, height = 7, units = "cm") -knitr::include_graphics("figures/15_sa_mongon_sampling.png") +knitr::include_graphics("images/15_sa_mongon_sampling.png") ``` 次のステップは、モデリングと予測地図作成に必要な変数 (Section \@ref(predictive-mapping) 参照) だけでなく、非計量多次元尺度構成法 (Non-Metric Multidimensional Scaling, NMDS\index{NMDS}) 軸を調査地域の主要勾配、高度と湿度にそれぞれ整合させるための変数も計算することである (Section \@ref(nmds) 参照)。 @@ -307,7 +307,7 @@ elev = dplyr::filter(random_points, id %in% rownames(pa)) |> rotnmds = vegan::MDSrotate(nmds, elev) # 最初の2軸の抽出 sc = vegan::scores(rotnmds, choices = 1:2, display = "sites") -knitr::include_graphics("figures/15_xy_nmds.png") +knitr::include_graphics("images/15_xy_nmds.png") ``` ```{r 15-eco-15, eval=FALSE, echo=FALSE} @@ -398,7 +398,7 @@ text(tree_mo, pretty = 0) # plot(tree_mo) # text(tree_mo, pretty = 0) # dev.off() -knitr::include_graphics("figures/15_tree.png") +knitr::include_graphics("images/15_tree.png") ``` 結果として得られる木は、3 つの内部ノードと 4 つの終端ノード (Figure \@ref(fig:tree)) で構成される。 @@ -561,10 +561,10 @@ pred = terra::predict(ep, model = autotuner_rf, fun = predict) # tm_shape(study_area) + # tm_borders() + # tm_layout(legend.position = tm_pos_auto_out()) -# tmap_save(tm, "figures/15_rf_pred.png", +# tmap_save(tm, "images/15_rf_pred.png", # width = 10, height = 8, units = "cm") -knitr::include_graphics("figures/15_rf_pred.png") +knitr::include_graphics("images/15_rf_pred.png") ``` `terra::predict()` がモデル・アルゴリズムに対応していない場合でも、手動で予測を行うことができる。 diff --git a/16-synthesis-ja.Rmd b/16-synthesis-ja.Rmd index be79ac3..5962d75 100644 --- a/16-synthesis-ja.Rmd +++ b/16-synthesis-ja.Rmd @@ -185,7 +185,7 @@ Chapter \@ref(gis) で紹介した空間データベースは、メモリで処 - R の Special Interest Group on Geographic データメーリングリスト ( [R-SIG-GEO](https://stat.ethz.ch/mailman/listinfo/r-sig-geo)) - GIS Stackexchange のウェブサイト ([gis.stackexchange.com](https://gis.stackexchange.com/)) - 大型・汎用プログラミングQ&Aサイト [stackoverflow.com](https://stackoverflow.com/) -- [RStudio Community](https://community.rstudio.com/)、[rOpenSci Discuss](https://discuss.ropensci.org/) ウェブフォーラム、 [Stan](https://discourse.mc-stan.org/) フォーラムなど、特定のソフトウェアツールに関連するフォーラムなど、特定のエンティティに関連するオンラインフォーラム。 +- [Posit Community](https://forum.posit.co/)、[rOpenSci Discuss](https://discuss.ropensci.org/) ウェブフォーラム、 [Stan](https://discourse.mc-stan.org/) フォーラムなど、特定のソフトウェアツールに関連するフォーラムなど、特定のエンティティに関連するオンラインフォーラム。 - GitHub などのソフトウェア開発プラットフォームは、R-spatial パッケージの大半の課題トラッカーや、最近では **sfnetworks** パッケージに関する議論 (バグ報告だけでなく) を促すために作られた議論ページなどをホストしている ([luukvdmeer/sfnetworks/discussions](https://github.com/luukvdmeer/sfnetworks/discussions/)を参照)。 - チャットルームやフォーラム [rOpenSci](https://ropensci.org/blog/2022/09/13/contributing-ropensci/) や [geocompx](https://geocompx.org) コミュニティ (これには質問をすることができる [Discord server](https://discord.com/invite/PMztXYgNxp) もある)。本書もここに関係している。\index{geocompx} - [OSGeoJapan のメーリングリスト](https://www.osgeo.jp/mailing_list) (日本語)