Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rを用いたGIS
水谷貴行(株式会社エコリス)
2017.11.15版
配布データ
ダウンロード
https://drive.google.com/open?id=1O4qfhMenwtMoBBFCu-uutdf5jHSRm-a-
「R_GIS_data」を解凍してデスクトップに置いてください。
(ユーザー名が日本...
事前準備の確認
● Windows OS >= 8
● R >= 3.4.1
● RStudio >= 1.0
● パッケージのインストール
3
install.packages(c("sf", "dplyr", "tidyr","ggplot...
事前準備の確認
質問.
1. GISを知ってますか?
2. ArcGISやQGISなどを使ったことがありますか?
3. Rで位置情報を操作したことがありますか?
4
本日の流れ
前半:
● GISの基礎
● 基本編(ベクタ処理、ラスタ処理)
後半:
● 応用編(色々な処理の組み合わせ)
● 質問等
5
GISの基礎
6
なぜRでGISなのか?
● 一括処理 → すべての処理をスクリプトで記述
● 再現性 → 処理手順はすべてスクリプトに保存
● 再利用可能 → 既存のスクリプトを修正、変更
● 統計処理との連携 → Rの機能をフル活用
※ 最近では、ArcGI...
データ形式
● ベクタデータ(ESRI Shapefile、CSV、KML、GeoJSONなど)
○ ポイント
○ ライン
○ ポリゴン
→ジオメトリー(形状)と属性表
● ラスタデータ(GeoTIFFなど)
→値を持ったグリッドセルの集合
出...
地理座標(緯度、経度)
● 位置座標を緯度、経度で表す方法を地理座標と言う
● 緯度、経度は図のように定める
● 楕円体は長半径6,378,137m、扁平率1/298.257222101
● 楕円体の重心が原点に位置し、地球の回転軸が Z軸と重...
投影座標
● 投影座標は、楕円体を平面上に投影し、その平面を基準とした座標
● 日本の場合、平面直角座標系もしくは UTM座標系が主に利用される
● 平面直角座標系とUTM座標系は「ガウス・クリューゲル図法」と呼ばれる投影法を使用
● 地域ごと...
空間参照系とEPSGコード
● 位置座標は、測地系と地理座標 /投影座標の組み合わせで定義される
● その組み合わせを空間参照系と言う
● 空間参照系に識別番号を振ったものが EPSGコード
※EPSGコードはJGD2000のものです。新たにデ...
平面直角座標系の適用区域とEPSGコード
※EPSGコードはJGD2000のものです。新たにデータを作成する場合はJGD2011のEPSGコードを参照ください。 12
UTM座標系の適用ゾーンとEPSGコード
ゾーン EPSG 区域
51 3097 東経120-126
52 3098 東経126-132
53 3099 東経132-138
54 3100 東経138-144
55 3101 東経144-150...
基本編
14
Rの基本操作
以下の操作で検索や入力がスムーズにできるので利用しましょう。
● 関数の詳細 ?関数名
● コマンドの実行 Ctrl+Enter
● パイプの入力 Ctrl+Shif+M
15
RStudioでプロジェクト作成
1. RStudio起動
2. File→NewProject...→Existing Directory→Browse→「R_GIS_data」選択→
「Create Project」ボタン
3. ファイルの...
ベクタ処理 パッケージの読み込み
ベクタ処理に必要なパッケージを読み込みます。
● ベクタ処理  → sfパッケージ(spパッケージは説明しません)
● インタラクティブな地図表示  → mapviewパッケージ
● 属性テーブルの処理 → d...
ベクタデータの読み込み、確認、表示1 ひとまず実行
data(wrld_simpl,package="maptools") #データの読み込み
wld<-st_as_sf(wrld_simpl) #sp形式からsf形式に変換
class(wld...
ベクタデータの読み込み、確認、表示2 ひとまず実行
1行ずつCtrl+Enter 出力結果を確認します
library(jpndistrict) #国土数値情報の行政界データ( R用にデータ変換されたもの)
ibaraki<-spdf_jpn_...
ベクタデータの読み込み、確認、表示3 ひとまず実行
農研機構の土壌図Shapefileデータを確認、表示してみます。
f <- tempfile(fileext = ".zip")
url<-"http://soil-inventory.dc....
ひと息 属性テーブルの簡単表示
21
Environmentパネルの「表ボタン」を押
すと属性テーブルを表形式で簡単に確
認できます。
コマンドからView関数を呼び出しても
OKです。
これはRStudioの機能のようです。
参考
:http...
ベクタデータの作成 関数一覧
sfgクラス、sfcクラス、sfクラスのデータを作成します。
● st_point: ポイントの作成
● st_linestring: ラインの作成
● st_polygon: ポリゴンの作成
● st_multi...
sf、sfc、sfgクラス
● sf(Simple feature) 属性とジオメトリを持った data.frame
● sfc(Simple feature geometry list-column) ジオメトリのリスト
● sfg(Simp...
ひと息 spパッケージとsfパッケージの比較
sp sf
2003年~ 2017年~
S4クラス data.frameを拡張
多くのGIS関連パッケージが依存 dplyr、ggplot2が対応中
地理データの標準仕様に未対応 地理データの標準仕...
ベクタデータの作成 実行
ポイントデータを作成してみます。
#ポイント
p1<-st_point(c(1,2)) #ポイントデータを作成 (sfgクラス)
head(p1) #データの確認
class(p1) #クラスの確認
p2<-st_po...
ベクタデータの作成 実行
ポリゴンデータを作成してみます。
#ポリゴン
b0 = st_polygon(list(rbind(c(-1,-1), c(1,-1), c(1,1), c(-1,1), c(-1,-1)))) #ポリゴンデータを作成...
空間参照系の確認、設定、変換 関数一覧
ベクタデータの空間参照系を確認、設定、変換します。
● st_crs: 空間参照系の取得、設定
● st_set_crs: 空間参照系の設定
● st_transform: 空間参照系の変換
● st_p...
空間参照系の確認、設定、変換 実行
茨城県行政界データの空間参照系を確認、変換してみます。
st_crs(ibaraki) #空間参照系の確認
st_set_crs(ibaraki,4612) #空間参照系の設定 (EPSGコード)
ibara...
ひと息 パイプ %>%
● パイプ左側の関数の出力結果をパイプ右側の関数の第一引数にする
● h(g(f(x), y), z)は、f(x) %>% g(y) %>% h(z) と書ける
● 処理を順に書けるので、コードが見やすくなる
● mag...
空間参照系の確認、設定、変換 パイプを使って実行
空間参照系をパイプを使って確認、変換してみます。
library(dplyr)
ibaraki_latlon<-ibaraki %>% st_set_crs(4612) #行政界データの空間参照...
関数ヘルプのExamplesを実行
1. Consoleで ?関数名 と入力
2. HelpのExamplesを選択してコピー
3. Rスクリプトに貼り付け
4. Ctrl + R でスクリプトを実行
1 2
3、4
すべての関数は説明できない...
面積、長さ、距離の計測 関数一覧
面積や長さ、地物間の距離を計測します。
● st_area: 面積の算出
● st_length: 長さの算出
● st_distance: 地物間の距離
32
面積、長さ、距離の計測 実行
st_distanceのExamplesを実行してみます。
?st_distance
dist_vincenty = function(p1, p2, a, f) geosphere::distVincentyEl...
属性検索、集計、追加、結合 関数一覧
属性テーブルを使った操作をします。
● filter: 行検索
● select: 列選択
● mutate: 列追加
● transmute: 列を追加し、他を削除
● group_by: グループ化
●...
属性検索、集計、追加、結合 実行
filterのExamplesを実行してみます。(一部だけ抜粋)
?filter.sf #sfクラスのfilter関数を指定(?filterの後に、Helpでsfの方を選択しても OK)
library(dpl...
空間検索、結合 関数一覧
地物の空間検索や空間結合をします。
● st_intersects: touch or overlap
● st_disjoint: !intersects
● st_touches: touch
● st_cross...
空間検索、結合 実行
st_intersectsのExamplesを実行してみます。(一部だけ抜粋)
?st_intersects
pts = st_sfc(st_point(c(.5,.5)), st_point(c(1.5, 1.5)), ...
空間演算 関数一覧その1
空間演算を行いジオメトリから別のジオメトリを作成します。
● st_centroid: 地物の重心を作成
● st_boundary: 地物の領域を作成
● st_buffer: バッファーを作成
● st_voron...
空間演算 関数一覧その2
空間演算を行いジオメトリから別のジオメトリを作成します。
● st_simplify: 地物を簡素化
● st_make_valid: ジオメトリを修正(requires lwgeom)
● st_union: 地物を...
空間演算 実行
st_voronoiのExamplesを実行してみます。(一部だけ抜粋)
?st_voronoi
set.seed(1) #乱数のシードを設定
x = st_multipoint(matrix(runif(10),,2)) #乱...
データ変換 関数一覧
データのジオメトリタイプ、クラス、フォーマットの変換をおこないます。
● st_agr: 属性テーブルの値のジオメトリとの関係性を取得、設定します。
● st_zm: Z値とM値を追加、削除
● st_coordinate...
ベクタデータの読み込み、書き出し 関数一覧
ベクタデータのファイル読み込みと書き出しをします。
● st_read: 読み込み
● read_sf: stringsAsFactors = FALSEで読み込み
● st_write: 書き出し
...
地図表示
sfパッケージのplot関数の他に、以下のライブラリなどでも地図表示ができます。
● mapview
● leaflet
● ggplot2(現時点ではdeveloperバージョンのみ)
● tmap
● sp
43
ラスタ処理 パッケージの読み込み
ラスタ処理に必要なパッケージを読み込みます。
library(raster)
※ rasterパッケージでベクタデータを扱う場合は、 sfクラスを扱えないので spパッ
ケージのクラスに変換する必要があります。...
ラスタデータの読み込み、確認、表示1 ひとまず実行
Worldclimの気候データを確認、表示してみます。データの詳細 : http://www.worldclim.org/bioclim
climate<-getData('worldclim...
ラスタデータの読み込み、確認、表示2 ひとまず実行
地球地図日本の標高データを確認、表示してみます。
データの詳細: http://www.gsi.go.jp/kankyochiri/gm_jpn.html
#データのダウンロード
f <- t...
ラスタデータの作成 関数一覧
RasterLayer、RasterStack、RasterBrickクラスのラスタデータを作成します。
● raster: RasterLayerを作成
● stack: RasterStackを作成
● bri...
RasterLayer、RasterStack、RasterBrick クラス
● RasterLayer シングルレイヤーのラスタデータ
● RasterStack マルチレイヤーのラスタデータ。レイヤは同範囲、同解像度。
● RasterB...
ラスタデータの作成 実行
(r<-raster()) #ラスタデータを作成(範囲と解像度はデフォルト値)
class(r) #クラスを確認
(r<-raster(ncol=10,nrow=10)) #列数10、行数10のラスタデータを作成(範囲...
空間参照系の確認、設定、変換 関数一覧
ラスタデータの空間参照系を確認、設定、変換します。
● crs: 空間参照系を確認、設定
● projection: 空間参照系を確認、設定
● projectRaster: 空間参照系を変換
50
空間参照系の確認、設定、変換 実行
気候データの空間参照系を確認、変換してみます。
bio1<-raster(climate,layer=1) #気候データから RasterLayerを読み込み
crs(bio1) #空間参照系を確認
crs(...
値の取得、集計 関数一覧その1
ラスタの値を取得、集計します。
● getValues: ラスタ値を取得
● getValuesBlock: 範囲の値を取得
● getValuesFocal: セルのフォーカル値を取得
● minValue: ...
値の取得、集計 関数一覧
ラスタの値を取得、集計します。
● sampleRandom: ラスタ値をランダムに抽出
● sampleRegular: ラスタ値を規則的に抽出
● cellStats: セル全体の統計値を計算
● summary:...
値の取得、集計 実行
getValuesのExamplesを実行してみます。
?getValues
r <- raster(system.file("external/test.grd", package="raster")) #ラスタデータ読...
ラスタの結合・切り抜き、範囲・解像度の変更 関数一覧その1
複数のラスタを結合、切り抜きます。また、ラスタの範囲や解像度を変更します。
● merge: データの結合(上のレイヤが優先)
● mosaic: データのモザイク(重ねる方法を指定)...
ラスタの結合・切り抜き、範囲・解像度の変更 関数一覧その2
複数のラスタを結合、切り抜きます。また、ラスタの範囲や解像度を変更します。
● shift: データをシフト
● flip: データを上下、左右入れ替え
● rotate: 経度の範囲...
ラスタの結合・切り抜き、範囲・解像度の変更 実行
mosicのExamplesを実行してみます。(一部だけ抜粋)
?mosaic
r <- raster(ncol=100, nrow=100) #ラスタデータの作成
r1 <- crop(r, ...
ラスタ演算 関数一覧その1
ラスタ演算をして、新たなラスタデータを作成します。
● calc: ラスタの演算
● overlay: 複数のラスタ間の演算
● cover: NA値を他のラスタで置換
● mask: 値をマスクしてラスタを作成
●...
ラスタ演算 関数一覧その2
ラスタ演算をして、新たなラスタデータを作成します。
● distanceFromPoints: ポイントからの距離
● direction: ラスタ値がNA以外からの方角
● focal: フォーカル演算
● loc...
ラスタ演算 実行
calcのExamplesを実行してみます。(一部だけ抜粋)
?calc
r <- raster(ncols=36, nrows=18) #ラスタデータの作成
r[] <- 1:ncell(r) #ラスタ値を代入
fun <-...
予測、補間 関数一覧
モデル式からラスタ値を予測、補間します。
● predict: モデル式からラスタ値を予測
● interpolate: モデル式からラスタ値を補間
61
データ変換 関数一覧
データの変換をします。
● raster: SpatialGridクラスからRasterLayerクラスに変換
● rasterize: spクラスのポイント、ライン、ポリゴンからラスタに変換
● rasterToPoin...
ラスタデータの読み込み、書き出し 関数一覧
ラスタデータの読み込みと書き出しをします。
● raster: ファイルから読み込み
● stack: ファイルリストから読み込み
● brick:ファイルリストから読み込み
● writeRaste...
地図表示
rasterパッケージのplot関数、plotRGB関数の他に、以下のライブラリなどでも地図表示ができます。
● mapview
● leaflet
● ggplot2
● tmap
● sp
64
応用編
65
陰影段彩図を作成してみる
SRTMの標高データから陰影段彩図を作成します。
データの詳細:http://srtm.csi.cgiar.org/
1. getData関数でSRTMの標高データをダウンロード
2. データの中身を確認
3. 範囲を...
陰影段彩図を作成してみる 実行
alt <- getData('alt', country='JP',mask=TRUE,path="./alt") #標高データの読み込み
class(alt) #クラスの確認
alt #データの情報
alt ...
正距方位図法を作成してみる 実行
世界地図のデータを正距方位図法で表示します。
1. 世界地図のデータを取得
2. データ形式の変換
3. 投影法の変換
4. ポイントの作成
5. バッファーの作成
6. 地図の表示
68
正距方位図法を作成してみる 実行その1
data(wrld_simpl,package="maptools") #世界地図の読み込み
wld<-wrld_simpl %>% st_as_sf() %>% st_geometry() #Spati...
正距方位図法を作成してみる 実行その2
p_geom<-p %>% st_transform(aeqd_proj) %>% st_geometry() #sfcに変換(st_transformはしなくて良い)
cent<-p_geom[[1]]...
土壌図を編集してみる
農研機構の土壌図を編集してみます。
1. 土壌図を読み込み
2. 全域を統合
3. 同じ土壌を融合
4. マルチポリゴンをポリゴンに変換
5. 投影変換して面積計算
6. agrを設定
7. 土壌を抽出して表示
8. 土壌...
土壌図を編集してみる 実行その1
#読み込み、表示
mydir<-"./soil" #ファイル名を指定しても OK
ibaraki_soil<-read_sf(mydir,options=c("ENCODING=CP932")) #読み込み
p...
土壌図を編集してみる 実行その2
#抽出 SoilName列を抽出し、特定の土壌のみを表示
soil_UTM54 %>% dplyr::select("SoilName") %>% filter(SoilName=="褐色森林土") %>% p...
衛星データをダウンロードして表示してみる
Landsat8のデータを表示してみます。
データの詳細:http://sentinel-pds.s3-website.eu-central-1.amazonaws.com/image-browser/...
衛星データをダウンロードして表示してみる 実行
#ダウンロードする場合(今回は実行しない)
url<-"http://landsat-pds.s3.amazonaws.com/L8/107/035/LC81070352015218LGN00/"...
衛星データを切り抜いてカラーで表示してみる
Landsat8のデータを必要な範囲で切り抜いて、 TrueColorとFalseColorで表示します。
1. 行政境データから必要な範囲を算出
2. 衛星データを範囲で切り抜き
3. plotRG...
衛星データを切り抜いてカラーで表示してみる 実行
ibaraki<-spdf_jpn_pref(admin_name="茨城県") #茨城県の境界データを読み込み
ibaraki_UTM54<-ibaraki %>% st_transform(...
衛星データから植生地域と水域を抽出してみる
Landsat8のデータから植生指標 NDVIを算出します。
1. 衛星データからNDVIを算出
2. 閾値で植生地域と思われる場所を抽出
3. 衛星データのバンドの値から k-mean法で教師なし分...
衛星データから植生地域と水域を抽出してみる 実行
NIR<-raster(landsat,4) #近赤外バンドのラスタデータ
Red<-raster(landsat,3) #赤色バンドのラスタデータ
ndvi <- (NIR-Red)/(NIR...
土壌と地形の関係を調べてみる
農研機構の土壌データと地球地図の標高データを使って、土壌と地形の関係を調べてみます。
1. 標高データを読み込み、空間参照を設定
2. 土壌エリアで標高データを切り取り
3. 起伏と傾斜を作成し表示
4. 土壌デー...
土壌と地形の関係を調べてみる 実行その1
#標高を読み込み
f<-"gm-jpn-el_u_1_1/jpn/el.tif"
dem<-raster(f)
dem
crs(dem)<-CRS("+init=epsg:4612")
#土壌エリアでd...
土壌と地形の関係を調べてみる 実行その2
##土壌データのラスタ化
plot(soil_UTM54) #ベクタデータの表示
soil.sp<-as(soil_UTM54,"Spatial") #sfクラスからSpatialPolygonsDat...
土壌と地形の関係を調べてみる 実行その3
#ラスタから値を抽出
envs<-stack(dem_UTM54,slope,aspect,soil) #標高、傾斜、斜面方位、土壌の RasterStackを作成
names(envs)<-c("el...
参考URL
ベクタ
● https://cran.r-project.org/web/packages/sf/index.html
● https://cran.r-project.org/web/packages/sf/vignettes/s...
以上、お疲れ様でした。
85
Upcoming SlideShare
Loading in …5
×

Rを用いたGIS

6,604 views

Published on

Rを用いたGISの講習資料です。

Published in: Data & Analytics
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Rを用いたGIS

  1. 1. Rを用いたGIS 水谷貴行(株式会社エコリス) 2017.11.15版
  2. 2. 配布データ ダウンロード https://drive.google.com/open?id=1O4qfhMenwtMoBBFCu-uutdf5jHSRm-a- 「R_GIS_data」を解凍してデスクトップに置いてください。 (ユーザー名が日本語の場合は、C:UsersPublicの中に入れてください。) ※日本語のファイル名やパス名はトラブルの元なので使用しません。 内容物 ● データの取得元.txt ● Rスクリプト R_GIS_tutorial.R 2
  3. 3. 事前準備の確認 ● Windows OS >= 8 ● R >= 3.4.1 ● RStudio >= 1.0 ● パッケージのインストール 3 install.packages(c("sf", "dplyr", "tidyr","ggplot2", "raster", "mapview", "jpndistrict", "maptools"),dependencies=T) library(sf) library(dplyr) library(tidyr) library(raster) library(mapview) library(jpndistrict) library(maptools) library(ggplot2)
  4. 4. 事前準備の確認 質問. 1. GISを知ってますか? 2. ArcGISやQGISなどを使ったことがありますか? 3. Rで位置情報を操作したことがありますか? 4
  5. 5. 本日の流れ 前半: ● GISの基礎 ● 基本編(ベクタ処理、ラスタ処理) 後半: ● 応用編(色々な処理の組み合わせ) ● 質問等 5
  6. 6. GISの基礎 6
  7. 7. なぜRでGISなのか? ● 一括処理 → すべての処理をスクリプトで記述 ● 再現性 → 処理手順はすべてスクリプトに保存 ● 再利用可能 → 既存のスクリプトを修正、変更 ● 統計処理との連携 → Rの機能をフル活用 ※ 最近では、ArcGISやQGISでもRと連携できたり、処理内容を記述して一括処理できる 7
  8. 8. データ形式 ● ベクタデータ(ESRI Shapefile、CSV、KML、GeoJSONなど) ○ ポイント ○ ライン ○ ポリゴン →ジオメトリー(形状)と属性表 ● ラスタデータ(GeoTIFFなど) →値を持ったグリッドセルの集合 出典:GIS Cookbook for LGUs (http://www.cookbook.hlurb.gov.ph/) 8
  9. 9. 地理座標(緯度、経度) ● 位置座標を緯度、経度で表す方法を地理座標と言う ● 緯度、経度は図のように定める ● 楕円体は長半径6,378,137m、扁平率1/298.257222101 ● 楕円体の重心が原点に位置し、地球の回転軸が Z軸と重 なりXY平面が赤道と一致する座標系を使用 ● これらの決まりを測地系と言う 出典:「統計・防災・環境情報がひと目でわかる地図の作り方」(p16-17) 9
  10. 10. 投影座標 ● 投影座標は、楕円体を平面上に投影し、その平面を基準とした座標 ● 日本の場合、平面直角座標系もしくは UTM座標系が主に利用される ● 平面直角座標系とUTM座標系は「ガウス・クリューゲル図法」と呼ばれる投影法を使用 ● 地域ごとに、投影原点と投影範囲が決まっている 出典:国土地理院 測量に関するミニ知識 (http://www.gsi.go.jp/chubu/minichishiki23.html) 出典:「統計・防災・環境情報がひと目でわかる地図の作り方」(p16-17) 10
  11. 11. 空間参照系とEPSGコード ● 位置座標は、測地系と地理座標 /投影座標の組み合わせで定義される ● その組み合わせを空間参照系と言う ● 空間参照系に識別番号を振ったものが EPSGコード ※EPSGコードはJGD2000のものです。新たにデータを作成する場合はJGD2011のEPSGコードを参照ください。 11
  12. 12. 平面直角座標系の適用区域とEPSGコード ※EPSGコードはJGD2000のものです。新たにデータを作成する場合はJGD2011のEPSGコードを参照ください。 12
  13. 13. UTM座標系の適用ゾーンとEPSGコード ゾーン EPSG 区域 51 3097 東経120-126 52 3098 東経126-132 53 3099 東経132-138 54 3100 東経138-144 55 3101 東経144-150 ※EPSGコードはJGD2000のものです。新たにデータを作成する場合は JGD2011のEPSGコードを参照ください。 13
  14. 14. 基本編 14
  15. 15. Rの基本操作 以下の操作で検索や入力がスムーズにできるので利用しましょう。 ● 関数の詳細 ?関数名 ● コマンドの実行 Ctrl+Enter ● パイプの入力 Ctrl+Shif+M 15
  16. 16. RStudioでプロジェクト作成 1. RStudio起動 2. File→NewProject...→Existing Directory→Browse→「R_GIS_data」選択→ 「Create Project」ボタン 3. ファイルの一覧から「 R_GIS_tutorial.R」をクリックして開く 16
  17. 17. ベクタ処理 パッケージの読み込み ベクタ処理に必要なパッケージを読み込みます。 ● ベクタ処理  → sfパッケージ(spパッケージは説明しません) ● インタラクティブな地図表示  → mapviewパッケージ ● 属性テーブルの処理 → dplyr、tidyrパッケージ library(sf) library(mapview) library(dplyr) library(tidyr) R_GIS_tutorial.Rの実行したい行で Ctrl + Enter 17
  18. 18. ベクタデータの読み込み、確認、表示1 ひとまず実行 data(wrld_simpl,package="maptools") #データの読み込み wld<-st_as_sf(wrld_simpl) #sp形式からsf形式に変換 class(wld) #クラスの確認 head(wld) #データの中身 str(wld) #データの情報 names(wld) #データの属性名 summary(wld) #属性値のサマリー st_crs(wld) #データの空間参照系 st_bbox(wld) #データの範囲 plot(wld) #地図表示(各属性を主題として ) plot(wld["NAME"]) #地図表示(NAME属性のみ) mapview(wld) #インタラクティブな地図表示 1行ずつCtrl+Enter 出力結果を確認します maptoolsの世界地図データを確認、表示してみます。 18
  19. 19. ベクタデータの読み込み、確認、表示2 ひとまず実行 1行ずつCtrl+Enter 出力結果を確認します library(jpndistrict) #国土数値情報の行政界データ( R用にデータ変換されたもの) ibaraki<-spdf_jpn_pref(admin_name="茨城県") #茨城県を読み込み class(ibaraki) #クラスを確認 head(ibaraki,n=3) #データの中身 str(ibaraki) #データの情報 names(ibaraki) #データの属性名 summary(ibaraki) #属性値のサマリー st_crs(ibaraki) #データの空間参照系 st_bbox(ibaraki) #データの範囲 plot(ibaraki) #地図表示(各属性を主題として ) plot(ibaraki["city_name"]) #地図表示(city_name属性のみ) mapview(ibaraki) #インタラクティブな地図表示 国土数値情報の行政界データを確認、表示してみます。 19
  20. 20. ベクタデータの読み込み、確認、表示3 ひとまず実行 農研機構の土壌図Shapefileデータを確認、表示してみます。 f <- tempfile(fileext = ".zip") url<-"http://soil-inventory.dc.affrc.go.jp/download/Shape20/%E8%8C%A8%E5%9F%8E_20.zip" download.file(url,f) mydir<-"./soil" unzip(f, exdir = mydir) #日本語ファイル名をアルファベットに変化 for(fi in list.files(mydir,full.names=TRUE)){ file.rename(fi,gsub("茨城", "ibaraki", fi)) } ibaraki_soil<-read_sf(mydir,options=c("ENCODING=CP932")) #データの読み込み。日本語エンコーディングを指定 str(ibaraki_soil) #データの情報 st_crs(ibaraki_soil) #データの空間参照系 st_bbox(ibaraki_soil) #データの範囲 plot(ibaraki_soil["SoilName"]) #データの読み込み 20
  21. 21. ひと息 属性テーブルの簡単表示 21 Environmentパネルの「表ボタン」を押 すと属性テーブルを表形式で簡単に確 認できます。 コマンドからView関数を呼び出しても OKです。 これはRStudioの機能のようです。 参考 :https://support.rstudio.com/hc/en-us /articles/205175388-Using-the-Data- Viewer
  22. 22. ベクタデータの作成 関数一覧 sfgクラス、sfcクラス、sfクラスのデータを作成します。 ● st_point: ポイントの作成 ● st_linestring: ラインの作成 ● st_polygon: ポリゴンの作成 ● st_multipoint: マルチポイントの作成 ● st_multilinestring: マルチラインの作成 ● st_multipolygon: マルチポリゴンの作成 ● st_geometrycollection: ジオメトリコレクションの作成 ● st_sfc: sfgクラスからsfcクラスを作成 ● st_sf: sfcからsfクラスを作成 22
  23. 23. sf、sfc、sfgクラス ● sf(Simple feature) 属性とジオメトリを持った data.frame ● sfc(Simple feature geometry list-column) ジオメトリのリスト ● sfg(Simple feature geometry) 1レコード分のジオメトリ Simple feature collection with 100 features and 6 fields geometry type: MULTIPOLYGON dimension: XY bbox: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 epsg (SRID): 4267 proj4string: +proj=longlat +datum=NAD27 +no_defs First 3 features: BIR74 SID74 NWBIR74 BIR79 SID79 NWBIR79 geometry 1 1091 1  10 1364 0 19 MULTIPOLYGON (((-81.4727554... 2 487 0   10 542 3 12 MULTIPOLYGON (((-81.2398910... 3 3188 5 208 3616 6 260 MULTIPOLYGON (((-80.4563446... Simple feature Simple feature geometry list-column Simple feature geometry 23
  24. 24. ひと息 spパッケージとsfパッケージの比較 sp sf 2003年~ 2017年~ S4クラス data.frameを拡張 多くのGIS関連パッケージが依存 dplyr、ggplot2が対応中 地理データの標準仕様に未対応 地理データの標準仕様に対応 sp←→sf の相互変換は可能 参考:http://notchained.hatenablog.com/entry/2017/01/06/213333 24
  25. 25. ベクタデータの作成 実行 ポイントデータを作成してみます。 #ポイント p1<-st_point(c(1,2)) #ポイントデータを作成 (sfgクラス) head(p1) #データの確認 class(p1) #クラスの確認 p2<-st_point(c(2,1)) #ポイントデータを作成 (sfgクラス) geom<-st_sfc(p1,p2) #p1,p2からなるジオメトリデータを作成 (sfcクラス) head(geom) #データの確認 class(geom) #クラスの確認 name <- c("point1","point2") #属性値を入力 point_f<-st_sf(name=name,geom) #ジオメトリと属性を設定してデータを作成 (sfクラス) class(point_f) #クラスを確認 head(point_f) #データを確認 plot(point_f) #地図表示 25
  26. 26. ベクタデータの作成 実行 ポリゴンデータを作成してみます。 #ポリゴン b0 = st_polygon(list(rbind(c(-1,-1), c(1,-1), c(1,1), c(-1,1), c(-1,-1)))) #ポリゴンデータを作成 (sfgクラス) b1 = b0 + st_point(c(2,0)) #b0のポリゴンのX座標を2ずらしたポリゴンを作成 b2 = b0 * 0.5 + st_point(c(0,1.5)) #b0のポリゴンを縮小して Y座標を1.5ずらしたポリゴンを作成 geom<-st_sfc(b0,b1,b2) #b0,b1,b2からなるジオメトリデータを作成 (sfcクラス) class(geom) #クラスの確認 a<-data.frame(number=c(1,2,3),species=c("dog","cat","cat")) #属性データを作成 poly_f<-st_sf(a,geom) #ジオメトリと属性を設定してデータを作成 (sfクラス) class(poly_f) #クラスの確認 head(poly_f) #データの確認 plot(poly_f) #地図表示 26
  27. 27. 空間参照系の確認、設定、変換 関数一覧 ベクタデータの空間参照系を確認、設定、変換します。 ● st_crs: 空間参照系の取得、設定 ● st_set_crs: 空間参照系の設定 ● st_transform: 空間参照系の変換 ● st_proj_info: 投影法、楕円体、座標系の確認 27
  28. 28. 空間参照系の確認、設定、変換 実行 茨城県行政界データの空間参照系を確認、変換してみます。 st_crs(ibaraki) #空間参照系の確認 st_set_crs(ibaraki,4612) #空間参照系の設定 (EPSGコード) ibaraki_latlon<-st_set_crs(ibaraki,4612) #空間参照系をJGD2000緯度経度に設定して変数に代入 ibaraki_zone9<-st_transform(ibaraki_latlon,2451) #緯度経度から平面直角座標系 9系に投影変換 ibaraki_UTM54<-st_transform(ibaraki_latlon,3100) #緯度経度からUTM座標系ゾーン54に投影変換 st_crs(ibaraki_latlon) #空間参照系の確認 st_crs(ibaraki_zone9) #空間参照系の確認 st_crs(ibaraki_UTM54) #空間参照系の確認 st_geometry(ibaraki_latlon) #ジオメトリの座標値確認 st_geometry(ibaraki_zone9) #ジオメトリの座標値確認 st_geometry(ibaraki_UTM54) #ジオメトリの座標値確認 28
  29. 29. ひと息 パイプ %>% ● パイプ左側の関数の出力結果をパイプ右側の関数の第一引数にする ● h(g(f(x), y), z)は、f(x) %>% g(y) %>% h(z) と書ける ● 処理を順に書けるので、コードが見やすくなる ● magrittrパッケージ で利用できるが、dplyrやtidyrから自動的にロードされる 29
  30. 30. 空間参照系の確認、設定、変換 パイプを使って実行 空間参照系をパイプを使って確認、変換してみます。 library(dplyr) ibaraki_latlon<-ibaraki %>% st_set_crs(4612) #行政界データの空間参照系を EPSGコード4612に設定 ibaraki_zone9<-ibaraki %>% st_set_crs(4612) %>% st_transform(2451) #EPSG4612に設定した後、EPSG2451に変換 ibaraki_UTM54<-ibaraki %>% st_set_crs(4612) %>% st_transform(3100) #EPSG4612に設定した後、EPSG3100に変換 ibaraki_latlon %>% st_crs() #空間参照系の確認 ibaraki_zone9 %>% st_crs() #空間参照系の確認 ibaraki_UTM54 %>% st_crs() #空間参照系の確認 ibaraki_latlon %>% st_geometry() #ジオメトリの座標値確認 ibaraki_zone9 %>% st_geometry() #ジオメトリの座標値確認 ibaraki_UTM54 %>% st_geometry() #ジオメトリの座標値確認 30
  31. 31. 関数ヘルプのExamplesを実行 1. Consoleで ?関数名 と入力 2. HelpのExamplesを選択してコピー 3. Rスクリプトに貼り付け 4. Ctrl + R でスクリプトを実行 1 2 3、4 すべての関数は説明できないので、 ヘルプを読んで理解しましょう。 31
  32. 32. 面積、長さ、距離の計測 関数一覧 面積や長さ、地物間の距離を計測します。 ● st_area: 面積の算出 ● st_length: 長さの算出 ● st_distance: 地物間の距離 32
  33. 33. 面積、長さ、距離の計測 実行 st_distanceのExamplesを実行してみます。 ?st_distance dist_vincenty = function(p1, p2, a, f) geosphere::distVincentyEllipsoid(p1, p2, a, a * (1-f), f) #楕円体の定義 line = st_sfc(st_linestring(rbind(c(30,30), c(40,40))), crs = 4326) #ラインのジオメトリ st_length(line) #ラインの長さ st_length(line, dist_fun = dist_vincenty) #ラインの長さ(楕円体を自分で定義) p = st_sfc(st_point(c(0,0)), st_point(c(0,1)), st_point(c(0,2))) #ポイントのジオメトリ st_distance(p, p) #ポイント間の距離のマトリクス st_distance(p, p, by_element = TRUE) #1番目同士の距離、 2番目同士の距離、 3番目同士の距離 33
  34. 34. 属性検索、集計、追加、結合 関数一覧 属性テーブルを使った操作をします。 ● filter: 行検索 ● select: 列選択 ● mutate: 列追加 ● transmute: 列を追加し、他を削除 ● group_by: グループ化 ● summarise: 集計 ● gather: 横長のデータを縦長に変換 ● spread: 縦長のデータを横長に変換 ● inner_join: 内部結合 ● left_join: 外部結合 ● right_join: 外部結合 ● full_join: 完全結合 34
  35. 35. 属性検索、集計、追加、結合 実行 filterのExamplesを実行してみます。(一部だけ抜粋) ?filter.sf #sfクラスのfilter関数を指定(?filterの後に、Helpでsfの方を選択しても OK) library(dplyr) nc = st_read(system.file("shape/nc.shp", package="sf")) #nc.shpの読み込み nc %>% filter(AREA > .1) %>% plot() #AREAが0.1以上の地域をプロット # plot 10 smallest counties in grey: st_geometry(nc) %>% plot() #ジオメトリだけをプロット #AREA列を選択して、昇順に並び替え、上から 10番目をグレーで重ね合わせ(面積が小さい地域) nc %>% select(AREA) %>% arrange(AREA) %>% slice(1:10) %>% plot(add = TRUE, col = 'grey') title("the ten counties with smallest area") #タイトル追加 35
  36. 36. 空間検索、結合 関数一覧 地物の空間検索や空間結合をします。 ● st_intersects: touch or overlap ● st_disjoint: !intersects ● st_touches: touch ● st_crosses: cross (don't touch) ● st_within: within ● st_contains: contains ● st_overlaps: overlaps ● st_covers: cover ● st_covered_by: covered by ● st_equals: equals ● st_equals_exact: equals, with some fuzz ● st_join: 空間結合 36
  37. 37. 空間検索、結合 実行 st_intersectsのExamplesを実行してみます。(一部だけ抜粋) ?st_intersects pts = st_sfc(st_point(c(.5,.5)), st_point(c(1.5, 1.5)), st_point(c(2.5, 2.5))) #ポイントを作成 pol = st_polygon(list(rbind(c(0,0), c(2,0), c(2,2), c(0,2), c(0,0)))) #ポリゴンを作成 (lst = st_intersects(pts, pol)) #ポイントとポリゴンが交差するかどうかをリストで返す (mat = st_intersects(pts, pol, sparse = FALSE)) #ポイントとポリゴンが交差するかどうかをマトリックスで返す #追加 プロットで確認 plot(pts) plot(pol,add=T) 37
  38. 38. 空間演算 関数一覧その1 空間演算を行いジオメトリから別のジオメトリを作成します。 ● st_centroid: 地物の重心を作成 ● st_boundary: 地物の領域を作成 ● st_buffer: バッファーを作成 ● st_voronoi: ボロノイポリゴンを作成 ● st_triangulate: ドローネ三角形を作成 (not constrained) ● st_convex_hull: 凸包ポリゴンを作成 ● st_make_grid: グリッドメッシュを作成 ● st_sample: ランダムポイントを作成 ● st_segmentize: ライン上にポイントを作成 ● st_line_merge: ラインを結合 ● st_split: ポリゴンをラインで分割 ● st_polygonize: 閉じたラインからポリゴンを作成 38
  39. 39. 空間演算 関数一覧その2 空間演算を行いジオメトリから別のジオメトリを作成します。 ● st_simplify: 地物を簡素化 ● st_make_valid: ジオメトリを修正(requires lwgeom) ● st_union: 地物を結合 ● st_intersection: 地物が交差する部分を作成 ● st_difference: 地物が交差しない片方の部分を作成 ● st_sym_difference: 地物の交差しない両方の部分を作成 ● st_interpolate_aw: ポリゴンへの面積加重補間 39
  40. 40. 空間演算 実行 st_voronoiのExamplesを実行してみます。(一部だけ抜粋) ?st_voronoi set.seed(1) #乱数のシードを設定 x = st_multipoint(matrix(runif(10),,2)) #乱数から5地点分のマルチポイントを作成 box = st_polygon(list(rbind(c(0,0),c(1,0),c(1,1),c(0,1),c(0,0)))) #長さ1の四角形ポリゴンを作成 if (sf_extSoftVersion()["GEOS"] >= "3.5.0") { v = st_sfc(st_voronoi(x, st_sfc(box))) #ポイントからボロノイ図を作成(四角形の範囲で) plot(v, col = 0, border = 1, axes = TRUE) #ボロノイ図を表示 plot(box, add = TRUE, col = 0, border = 1) #四角形を表示(四角形の範囲でボロノイ図が作成されていない) plot(x, add = TRUE, col = 'red', cex=2, pch=16) #ポイントを表示 plot(st_intersection(st_cast(v), box)) #クラスを変換して、四角形の範囲で切り取り、表示 plot(x, add = TRUE, col = 'red', cex=2, pch=16) #ポイントを表示 } #追加 クラスを確認 class(v) st_cast(v) %>% class 40
  41. 41. データ変換 関数一覧 データのジオメトリタイプ、クラス、フォーマットの変換をおこないます。 ● st_agr: 属性テーブルの値のジオメトリとの関係性を取得、設定します。 ● st_zm: Z値とM値を追加、削除 ● st_coordinates: 座標をマトリックス形式で表示 ● st_geometry: ジオメトリをsfcクラスで取得、設定 ● st_is: ジオメトリのタイプを確認 ● st_is: ジオメトリのタイプを確認 ● as(x, "Spatial"): spクラスに変換 ● st_as_sf: spクラスからsfクラスに変換 ● st_as_sfc: spクラスからsfcクラスに変換 ● st_as_text: sfg、sfc、crsクラスからWKT形式に変換 ● st_as_binary: sfcクラスからWKB形式に変換 ● st_as_grob: sfクラスからgrob形式に変換 41
  42. 42. ベクタデータの読み込み、書き出し 関数一覧 ベクタデータのファイル読み込みと書き出しをします。 ● st_read: 読み込み ● read_sf: stringsAsFactors = FALSEで読み込み ● st_write: 書き出し ● write_sf: delete_layer = TRUEで書き出し 42
  43. 43. 地図表示 sfパッケージのplot関数の他に、以下のライブラリなどでも地図表示ができます。 ● mapview ● leaflet ● ggplot2(現時点ではdeveloperバージョンのみ) ● tmap ● sp 43
  44. 44. ラスタ処理 パッケージの読み込み ラスタ処理に必要なパッケージを読み込みます。 library(raster) ※ rasterパッケージでベクタデータを扱う場合は、 sfクラスを扱えないので spパッ ケージのクラスに変換する必要があります。 44
  45. 45. ラスタデータの読み込み、確認、表示1 ひとまず実行 Worldclimの気候データを確認、表示してみます。データの詳細 : http://www.worldclim.org/bioclim climate<-getData('worldclim', var='bio', res=10) #データのダウンロード #ダウンロードはできるが読み込みはエラーになるので自分で読み込み ※修正されたかも files<-list.files("./wc10",pattern="bil$",full.names=TRUE) #wc10フォルダ内のファイルリストを取得 (bil形式) climate<-stack(files,native=TRUE) #ファイルの読み込み class(climate) #クラスの確認 climate #データの情報 names(climate) #スタックレイヤ名 bio1<-raster(climate,layer=1) #ラスタレイヤを取得(年平均気温 *10) plot(bio1) #地図表示 bio1_deg<-bio1/10 #ラスタの値を年平均気温に変換 zoom(bio1_deg) #ズーム(範囲の始点と終点をクリック) click(bio1_deg) #値の取得(クリック、 Escで終了) s<-raster::select(bio1_deg) #範囲を選択して変数に代入(範囲の始点と終点をクリック) plot(s) #地図表示 hist(s) #値の分布のヒストグラム表示 density(s) #値の分布の密度表示 45
  46. 46. ラスタデータの読み込み、確認、表示2 ひとまず実行 地球地図日本の標高データを確認、表示してみます。 データの詳細: http://www.gsi.go.jp/kankyochiri/gm_jpn.html #データのダウンロード f <- tempfile(fileext = ".zip") url<-"http://www1.gsi.go.jp/geowww/globalmap-gsi/download/data/gm-japan/gm-jpn-el_u_1_1.zip" download.file(url,f) unzip(f, exdir = ".") f<-"gm-jpn-el_u_1_1/jpn/el.tif" dem<-raster(f) #データの読み込み dem #データの情報 plot(dem) #地図表示 crs(dem) #空間参照系の確認 hist(dem) #値の分布のヒストグラム表示 density(dem) #値の分布の密度表示 46
  47. 47. ラスタデータの作成 関数一覧 RasterLayer、RasterStack、RasterBrickクラスのラスタデータを作成します。 ● raster: RasterLayerを作成 ● stack: RasterStackを作成 ● brick: RasterBrickを作成 ● subset: RasterStack、RasterBrickからレイヤを取り出し ● addLayer: レイヤを追加 ● dropLayer: レイヤを削除 ● unstack: RasterStackからレイヤのリストを作成 47
  48. 48. RasterLayer、RasterStack、RasterBrick クラス ● RasterLayer シングルレイヤーのラスタデータ ● RasterStack マルチレイヤーのラスタデータ。レイヤは同範囲、同解像度。 ● RasterBrick マルチレイヤーのラスタデータ。レイヤは同範囲、同解像度。データはすべてメモリ内に 読み込む。 48
  49. 49. ラスタデータの作成 実行 (r<-raster()) #ラスタデータを作成(範囲と解像度はデフォルト値) class(r) #クラスを確認 (r<-raster(ncol=10,nrow=10)) #列数10、行数10のラスタデータを作成(範囲はデフォルト値) (r<-raster(ncol=36,nrow=18,xmn=-1000,xmx=1000,ymn=-100,ymx=900)) #列数、行数、範囲を指定してラスタデータ作成 res(r)<-100 #解像度を100に変更 r #データの情報を表示 hasValues(r) #ラスタ値があるか確認 set.seed(0) values(r)<-runif(ncell(r)) #乱数をラスタの値に代入 plot(r) #地図表示 r1<-r2<-r3<- raster(nrow=10,ncol=10) #列数10、行数10のラスタデータを作成 values(r1) <- 1:ncell(r1) #ラスタ値に1~セル数の値を代入 values(r2) <- runif(ncell(r2)) #乱数をラスタの値に代入 r3 <- r1*r2 #ラスタ演算(セルの値同士を掛け算) (s<- stack(r1,r2,r3)) #RasterStackを作成 plot(s) #地図表示 (b<-brick(r1,r2,r3)) #RasterBrickを作成 r<-raster(b,layer=3) #ラスタレイヤを取り出し plot(r) #地図表示 49
  50. 50. 空間参照系の確認、設定、変換 関数一覧 ラスタデータの空間参照系を確認、設定、変換します。 ● crs: 空間参照系を確認、設定 ● projection: 空間参照系を確認、設定 ● projectRaster: 空間参照系を変換 50
  51. 51. 空間参照系の確認、設定、変換 実行 気候データの空間参照系を確認、変換してみます。 bio1<-raster(climate,layer=1) #気候データから RasterLayerを読み込み crs(bio1) #空間参照系を確認 crs(bio1)<-CRS("+init=epsg:4326") #空間参照系を設定 bio1 #データを確認 plot(bio1) #地図表示 bio1_crop<-crop(bio1,extent(138,144,33,45)) #範囲を指定して切り抜き plot(bio1_crop) #地図表示 bio1_UTM54 <- projectRaster(bio1_crop, crs=CRS("+init=epsg:3100")) #UTM54に投影変換 bio1_UTM54 #データを確認 options(scipen = 10) #軸の指数表記をやめる plot(bio1_UTM54) #地図表示 51
  52. 52. 値の取得、集計 関数一覧その1 ラスタの値を取得、集計します。 ● getValues: ラスタ値を取得 ● getValuesBlock: 範囲の値を取得 ● getValuesFocal: セルのフォーカル値を取得 ● minValue: 最小値を取得 ● maxValue: 最大値を取得 ● as.matrix: セルの値をmatrixに変換 ● extract: ラスタの値をポイント、ライン、ポリゴンに抽出 52
  53. 53. 値の取得、集計 関数一覧 ラスタの値を取得、集計します。 ● sampleRandom: ラスタ値をランダムに抽出 ● sampleRegular: ラスタ値を規則的に抽出 ● cellStats: セル全体の統計値を計算 ● summary: セル全体のサマリーを計算 ● freq: ラスタ値の頻度を計算 ● crosstab: 2つのラスタレイヤの値をクロス集計 ● unique: ユニーク値を取得 ● zonal: ゾーンごとにラスタ値を集計 53
  54. 54. 値の取得、集計 実行 getValuesのExamplesを実行してみます。 ?getValues r <- raster(system.file("external/test.grd", package="raster")) #ラスタデータ読み込み r #データの情報確認 v <- getValues(r) #ラスタ値の取得 length(v) #値リストの長さ head(v) #値の表示 getValues(r, row=10) #行数を指定してラスタ値を取得 #追加 地図表示 plot(r) 54
  55. 55. ラスタの結合・切り抜き、範囲・解像度の変更 関数一覧その1 複数のラスタを結合、切り抜きます。また、ラスタの範囲や解像度を変更します。 ● merge: データの結合(上のレイヤが優先) ● mosaic: データのモザイク(重ねる方法を指定) ● crop: データの切り抜き ● extend: 範囲の拡張 ● trim: 範囲外側のNAなどの値を除外 ● aggregate: 大きいセルに値を集約したラスタを作成 ● disaggrigate: 小さいセルに値を補間したラスタを作成 ● resample: 異なるラスタ間で値をリサンプリング 55
  56. 56. ラスタの結合・切り抜き、範囲・解像度の変更 関数一覧その2 複数のラスタを結合、切り抜きます。また、ラスタの範囲や解像度を変更します。 ● shift: データをシフト ● flip: データを上下、左右入れ替え ● rotate: 経度の範囲を-180~180に変換する ● t: データの縦横を入れ替える 56
  57. 57. ラスタの結合・切り抜き、範囲・解像度の変更 実行 mosicのExamplesを実行してみます。(一部だけ抜粋) ?mosaic r <- raster(ncol=100, nrow=100) #ラスタデータの作成 r1 <- crop(r, extent(-10, 11, -10, 11)) #範囲を指定して切り出し r2 <- crop(r, extent(0, 20, 0, 20)) #範囲を指定して切り出し r3 <- crop(r, extent(9, 30, 9, 30)) #範囲を指定して切り出し r1[] <- 1:ncell(r1) #ラスタ値を代入 r2[] <- 1:ncell(r2) #ラスタ値を代入 r3[] <- 1:ncell(r3) #ラスタ値を代入 m1 <- mosaic(r1, r2, r3, fun=mean) #モザイクラスタを作成 #追加  plot(r1) #地図表示 plot(m1) #モザイクラスタを地図表示 57
  58. 58. ラスタ演算 関数一覧その1 ラスタ演算をして、新たなラスタデータを作成します。 ● calc: ラスタの演算 ● overlay: 複数のラスタ間の演算 ● cover: NA値を他のラスタで置換 ● mask: 値をマスクしてラスタを作成 ● cut: カット値で値を再分類 ● subs: データフレームの値でラスタ値を置換する ● reclassify: 値の範囲でラスタ値を再分類する ● init: ラスタ値を初期化する ● stackApply: レイヤ間でのラスタ演算 ● stackSelect: 複数レイヤの値を選択してラスタ作成 ● distance: ラスタ値がNA以外までの最短距離 ● gridDistance: NAでないセルを通過する距離 58
  59. 59. ラスタ演算 関数一覧その2 ラスタ演算をして、新たなラスタデータを作成します。 ● distanceFromPoints: ポイントからの距離 ● direction: ラスタ値がNA以外からの方角 ● focal: フォーカル演算 ● localFun: レイヤ間でのフォーカル演算 ● boundaries: ラスタ値の境界を作成 ● clump: パッチを作成 ● adjacent: 隣接するセルを検索 ● area: 緯度経度のセルのおおよその面積をラスタ値にする ● terrain: 標高データから傾斜、斜面方位、 TPI、TRI、roughness、flowdirを作成 ● hillShade: 陰影起伏図を作成 ● flowPath: 流路を作成 ● Moran: 空間自己相関の指標 Moran's I、Geary's C を計算 59
  60. 60. ラスタ演算 実行 calcのExamplesを実行してみます。(一部だけ抜粋) ?calc r <- raster(ncols=36, nrows=18) #ラスタデータの作成 r[] <- 1:ncell(r) #ラスタ値を代入 fun <- function(x) { x * 10 } #ラスタ値を引数とする関数を定義 rc1 <- calc(r, fun) #関数を適用 60
  61. 61. 予測、補間 関数一覧 モデル式からラスタ値を予測、補間します。 ● predict: モデル式からラスタ値を予測 ● interpolate: モデル式からラスタ値を補間 61
  62. 62. データ変換 関数一覧 データの変換をします。 ● raster: SpatialGridクラスからRasterLayerクラスに変換 ● rasterize: spクラスのポイント、ライン、ポリゴンからラスタに変換 ● rasterToPoints: ラスタからポイントの matrixに変換 ● rasterToPolygons: ラスタからSpatialPolygonsDataFrameのポリゴンを変換 ● rasterToContour: ラスタからSpatialLinesDataFrameのコンターを作成 ● rasterFromXYZ: matrixからラスタを作成 ● rasterFromCells: セル番号からラスタを作成 ● as(x, 'SpatialGridDataFrame'): RasterLayerクラスからSpatialGridクラスに変換 62
  63. 63. ラスタデータの読み込み、書き出し 関数一覧 ラスタデータの読み込みと書き出しをします。 ● raster: ファイルから読み込み ● stack: ファイルリストから読み込み ● brick:ファイルリストから読み込み ● writeRaster: ファイルに書き出し ● KML: KMLファイルに書き出し 63
  64. 64. 地図表示 rasterパッケージのplot関数、plotRGB関数の他に、以下のライブラリなどでも地図表示ができます。 ● mapview ● leaflet ● ggplot2 ● tmap ● sp 64
  65. 65. 応用編 65
  66. 66. 陰影段彩図を作成してみる SRTMの標高データから陰影段彩図を作成します。 データの詳細:http://srtm.csi.cgiar.org/ 1. getData関数でSRTMの標高データをダウンロード 2. データの中身を確認 3. 範囲を指定 4. 傾斜、斜面方位を作成 5. 陰影起伏を作成 6. 陰影起伏に標高を重ねて表示 7. histとdensityで値の分布を確認 8. 傾斜データをGeoTIFF形式で書き出し 66
  67. 67. 陰影段彩図を作成してみる 実行 alt <- getData('alt', country='JP',mask=TRUE,path="./alt") #標高データの読み込み class(alt) #クラスの確認 alt #データの情報 alt <- crop(alt,extent(137,141,34.5,38)) #範囲を指定して切り抜き slope = terrain(alt, opt='slope') #傾斜の作成(ラジアン) aspect = terrain(alt, opt='aspect') #斜面方位の作成(ラジアン 北が0で時計回り) hill = hillShade(slope, aspect) #陰影起伏の作成 plot(hill, col=grey(0:100/100), legend=FALSE, main='陰影段彩図') #陰影起伏を表示 plot(alt,col=terrain.colors(10, alpha=0.35),zlim=c(0,1500), add=TRUE) #標高を重ね合わせ x <- terrain(alt, opt=c('slope', 'aspect'), unit='degrees') #傾斜、斜面方位を RasterStackで作成(度数) hist(x) #分布表示 density(x) #分布表示 writeRaster(slope,"slope.tif",format="GTiff",overwrite=TRUE) #GeoTIFFに書き出し 67
  68. 68. 正距方位図法を作成してみる 実行 世界地図のデータを正距方位図法で表示します。 1. 世界地図のデータを取得 2. データ形式の変換 3. 投影法の変換 4. ポイントの作成 5. バッファーの作成 6. 地図の表示 68
  69. 69. 正距方位図法を作成してみる 実行その1 data(wrld_simpl,package="maptools") #世界地図の読み込み wld<-wrld_simpl %>% st_as_sf() %>% st_geometry() #SpatialPolygonクラスを一旦sfクラスに変換して、 sfcクラスに変換 #パイプを使わない場合 #wld.sf<-st_as_sf(wrld_simpl) #wld<-st_geometry(wld.sf) aeqd_proj <- '+proj=aeqd +lat_0=39.036694 +lon_0=125.764559' #中心座標を指定して正距方位図法の定義を指定 wld_aeqd <- wld %>% st_transform(aeqd_proj) #投影変換 #表示範囲を指定し地図表示。経緯度図郭線も表示 plot(wld_aeqd, col = 'grey80',graticule = st_crs(4326),axes = TRUE,xlim=c(-2000000,2000000),ylim=c(-3000000,3000000),lon = seq(80,180,by=10),main="正距方位図法で表示 ") #中心位置のポイントを緯経度で作成し投影変換 p<-st_sf(name="平壌",geom=st_sfc(st_point(c(125.764559,39.036694))), crs=4326) %>% st_transform(aeqd_proj) #ポイントを赤色で重ね合わせて表示 plot(p,col="red",pch=20,cex=2,add=T) 69
  70. 70. 正距方位図法を作成してみる 実行その2 p_geom<-p %>% st_transform(aeqd_proj) %>% st_geometry() #sfcに変換(st_transformはしなくて良い) cent<-p_geom[[1]] #中心点のsfgを取得 dist.sfc <- lapply(10^6 * 1:4, function(x) st_buffer(cent,x)) %>% st_sfc() #多重のバッファー sfcを作成 dist.sf <- st_sf(name=c("1000km","2000km","3000km","4000km"),geom=dist.sfc,crs=aeqd_proj) #sfクラスに変換 plot(dist.sf,border="red",col=NA,add=T) #バッファーを重ねて表示 text(data.frame(x=10^6*1:4,y=0*1:4), labels=dist.sf$name, cex = 0.8) #ラベルを表示 p_guam<-st_sf(name="グアム",geom=st_sfc(st_point(c(144.7631,13.4521))), crs=4326) %>% st_transform(aeqd_proj) #別のポイントを作成 plot(p_guam,col="blue",pch=20,cex=2,add=T) #ポイントを青色で重ねて表示 #正距円筒図法で表示(横方向の等距離は歪む) plot(wld, col = 'grey80',graticule = st_crs(4326),axes = TRUE,xlim=c(100,160),ylim=c(10,60),lon = seq(80,180,by=10),main="正距円筒図法で表示 ") plot(st_transform(p,4326),col="red",pch=20,cex=2,add=T) plot(st_transform(p_guam,4326),col="blue",pch=20,cex=2,add=T) plot(st_transform(dist.sf,4326),border="red",col=NA,add=T) 70
  71. 71. 土壌図を編集してみる 農研機構の土壌図を編集してみます。 1. 土壌図を読み込み 2. 全域を統合 3. 同じ土壌を融合 4. マルチポリゴンをポリゴンに変換 5. 投影変換して面積計算 6. agrを設定 7. 土壌を抽出して表示 8. 土壌面積をグラフ化 9. ファイルに書き出し 71
  72. 72. 土壌図を編集してみる 実行その1 #読み込み、表示 mydir<-"./soil" #ファイル名を指定しても OK ibaraki_soil<-read_sf(mydir,options=c("ENCODING=CP932")) #読み込み plot(ibaraki_soil["SoilName"]) #属性を指定して表示 #全域を統合(統合して、簡素化) dojyou_area<- st_union(ibaraki_soil) %>% st_simplify(preserveTopology = FALSE,dTolerance = 0.003) plot(dojyou_area) #同じ土壌を融合 soil_union<-ibaraki_soil %>% group_by(SoilName) %>% summarise(do_union=T) #マルチポリゴンをポリゴンにして、投影変換して、面積を計算 soil_UTM54<-soil_union %>% st_cast() %>% st_cast("POLYGON") %>% st_transform(3100) %>% mutate(AREA=st_area(.)) st_agr(soil_UTM54)<-c("identity","aggregate") #集計時の挙動を指定。定数か、集約できる値か、特定値か st_agr(soil_UTM54) #融合した土壌図を表示 plot(soil_UTM54["SoilName"],border=NA,col=rainbow(17,alpha=0.8)) 72
  73. 73. 土壌図を編集してみる 実行その2 #抽出 SoilName列を抽出し、特定の土壌のみを表示 soil_UTM54 %>% dplyr::select("SoilName") %>% filter(SoilName=="褐色森林土") %>% plot(main="褐色森林土") soil_UTM54 %>% dplyr::select("SoilName") %>% filter(grepl("アロフェン",SoilName)) %>% plot(col=rainbow(4,alpha=0.5),border=NA,main="アロフェン") #アロフェンとつくものすべてを表示 soil_UTM54 %>% transmute(AREA_NO_UNIT=as.numeric(AREA)) %>% filter(AREA_NO_UNIT<10000000) %>% plot(border=NA,main="SMALL AREA") #面積が小さいものを表示 filterでUNITに対応していない #データフレーム library(ggplot2) df<-soil_UTM54 %>% as.data.frame() %>% dplyr::select(-geometry) #データフレームに変換してジオメトリ列を削除 df2<-df %>% group_by(SoilName) %>% summarise(TOTALAREA=as.numeric(sum(AREA))) %>% arrange(desc(TOTALAREA)) %>% mutate(SoilName = factor(SoilName, SoilName)) #土壌ごとに面積を集計したものを、降順に並び替え、 factorもその順番にする df2<-df2 %>% mutate(TOTALAREA=TOTALAREA/1000000) #面積を平方キロに変換 ggplot(df2,aes(x=SoilName,y=TOTALAREA))+geom_bar(stat = "identity",fill="lightblue") + labs(title="茨城県の土壌面積 ", x="", y="面積(km^2)")+ theme(axis.text.x = element_text(angle = 90, hjust = 1)) #グラフ表示 #ファイルに書き出し write_sf(soil_UTM54,"soil_UTM54.shp",layer_options="ENCODING=CP932") 73
  74. 74. 衛星データをダウンロードして表示してみる Landsat8のデータを表示してみます。 データの詳細:http://sentinel-pds.s3-website.eu-central-1.amazonaws.com/image-browser/ 1. landsatの衛星データをダウンロード 2. ダウンロードしたファイルの一覧を取得 3. ファイルすべてをstack関数で読み込み 4. データの中身を確認 5. plotで地図表示 74
  75. 75. 衛星データをダウンロードして表示してみる 実行 #ダウンロードする場合(今回は実行しない) url<-"http://landsat-pds.s3.amazonaws.com/L8/107/035/LC81070352015218LGN00/" flist<-c("LC81070352015218LGN00_B2.TIF","LC81070352015218LGN00_B3.TIF","LC81070352015218LGN00_B4.TIF","LC81070352015218LGN00_B5.TIF") mydir<-"./landsat" #ここだけ実行 dir.create(mydir, showWarnings = FALSE) for(fi in flist){ f<-paste(url,fi,sep="") dest<-paste(mydir,fi,sep="/") if(!file.exists(dest)) download.file(f,dest,mode="wb") } #ここから files<-list.files(mydir,pattern="TIF$",full.names=TRUE) #フォルダの中のファイル名一覧を取得 landsat_org<-stack(files) #RasterStackを作成 class(landsat_org) #クラスの確認 landsat_org #データ情報の確認 names(landsat_org) #レイヤ名の表示 nlayers(landsat_org) #レイヤ数の表示 dim(landsat_org) #サイズ、レイヤ数の表示 crs(landsat_org) #空間参照の表示 plot(landsat_org,1,col=gray.colors(30)) #レイヤ番号を指定して表示 75
  76. 76. 衛星データを切り抜いてカラーで表示してみる Landsat8のデータを必要な範囲で切り抜いて、 TrueColorとFalseColorで表示します。 1. 行政境データから必要な範囲を算出 2. 衛星データを範囲で切り抜き 3. plotRGB関数でバンドを指定し TrueColorで表示 4. plotRGB関数でバンドを指定し FalseColorで表示 76
  77. 77. 衛星データを切り抜いてカラーで表示してみる 実行 ibaraki<-spdf_jpn_pref(admin_name="茨城県") #茨城県の境界データを読み込み ibaraki_UTM54<-ibaraki %>% st_transform(32654) #UTM54に投影変換 ibaraki_cities<-ibaraki_UTM54 %>% filter(grepl("つくば市|つくばみらい市|常総市",city_name)) #3市を抽出 #plot(ibaraki_cities) bbox<-ibaraki_cities %>% st_bbox() %>% as.vector() #領域を取得 landsat<-crop(landsat_org,extent(bbox[1],bbox[3],bbox[2],bbox[4])) #衛星画像を3市の範囲で切り抜き #landsat<-crop(landsat,extent(400000,430000,3980000,4000000)) #RasterStackからレイヤ番号で指定 plotRGB(landsat, r = 3, g = 2, b = 1, axes = TRUE, stretch = "lin", main = "Landsat8 True Color Composite") #トゥルーカラーで表示(自然な色合い) plotRGB(landsat, r = 4, g = 3, b = 2, axes = TRUE, stretch = "lin", main = "Landsat8 False Color Composite") #フォルスカラーで表示(植物を赤色で強調) plot(ibaraki_cities,border="white",lwd=2,col=NA,add=T) #3市の境界を重ね合わせ 77
  78. 78. 衛星データから植生地域と水域を抽出してみる Landsat8のデータから植生指標 NDVIを算出します。 1. 衛星データからNDVIを算出 2. 閾値で植生地域と思われる場所を抽出 3. 衛星データのバンドの値から k-mean法で教師なし分類 4. 水域と思われるカテゴリを抽出 5. 地図表示して確認 植生指標は植生の有無・活性度を表す指標 -1~1の値で、大きい値ほど植生の活性度が高い 78
  79. 79. 衛星データから植生地域と水域を抽出してみる 実行 NIR<-raster(landsat,4) #近赤外バンドのラスタデータ Red<-raster(landsat,3) #赤色バンドのラスタデータ ndvi <- (NIR-Red)/(NIR + Red) #植生指標NDVIを計算 plot(ndvi, col = rev(terrain.colors(30)), main = 'NDVI from landsat8') #地図表示 veg <- ndvi >= 0.4 #植生の活性度が大きい場所を抽出 #値を残したい場合はこちら #veg <- calc(ndvi, function(x){x >= 0.4}) plot(veg,legend=FALSE,main = '植生地域を抽出 ') #地図表示 #教師なし分類 values(landsat) %>% head #追加 値の確認 km <- kmeans(values(landsat), centers=5, iter.max=500, nstart=3, algorithm="Lloyd") #クラスター分類 kmr <- setValues(ndvi, km$cluster) #クラスター分類の結果からラスターデータを作成 plot(kmr,main='ランドサット画像の教師なし分類 ') #地図表示 water<-kmr==1 #水に分類されたクラスターを抽出( 1じゃないかもしれない) plot(water,col=c("white","blue"),main = '水域を抽出') #地図表示 79
  80. 80. 土壌と地形の関係を調べてみる 農研機構の土壌データと地球地図の標高データを使って、土壌と地形の関係を調べてみます。 1. 標高データを読み込み、空間参照を設定 2. 土壌エリアで標高データを切り取り 3. 起伏と傾斜を作成し表示 4. 土壌データをラスタ化 5. 土壌エリアを投影変換して、ランダムポイントを作成 6. 標高、傾斜、斜面方位、土壌の値をランダムポイントに抽出 7. 傾斜と標高、斜面方位、土壌のモデルを作成し、予測 80
  81. 81. 土壌と地形の関係を調べてみる 実行その1 #標高を読み込み f<-"gm-jpn-el_u_1_1/jpn/el.tif" dem<-raster(f) dem crs(dem)<-CRS("+init=epsg:4612") #土壌エリアでdemを切り取る bbox<-dojyou_area %>% st_bbox() %>% as.vector() dem_crop<-crop(dem,extent(bbox[1],bbox[3],bbox[2],bbox[4])) plot(dem_crop) plot(dojyou_area,col=NA,add=T) #起伏と傾斜の作成 dem_UTM54 <- projectRaster(dem_crop, crs=CRS("+init=epsg:3100"),method="bilinear") #標高データの投影変換 slope = terrain(dem_UTM54, opt='slope') #傾斜の作成 aspect = terrain(dem_UTM54, opt='aspect') #斜面方位の作成 hill = hillShade(slope, aspect) #陰影起伏の作成 plot(hill, col=grey(0:100/100), legend=FALSE, main='陰影段彩図') #陰影起伏の作成(タイトル間違い) plot(slope*180/pi) #傾斜をラジアンから度に変換して表示 plot(aspect*180/pi,col=rainbow(8)) #斜面方位をラジアンから度に変換して表示 81
  82. 82. 土壌と地形の関係を調べてみる 実行その2 ##土壌データのラスタ化 plot(soil_UTM54) #ベクタデータの表示 soil.sp<-as(soil_UTM54,"Spatial") #sfクラスからSpatialPolygonsDataFrameクラスに変換(spパッケージ) soil.sp$SoilName<-as.factor(soil.sp$SoilName) #SoilNameをfactorに変換 levels(soil.sp$SoilName) #factorを確認 soil<-rasterize(soil.sp,dem_UTM54,"SoilName",fun="last") #SoilNameのfactor値をラスタ化。dem_UTM54の範囲と解像 度を使用。1セルに複数のポリゴンがある場合は最後のものを使用。 plot(soil,breaks=1:17,col=rainbow(17)) #ラスタ化した土壌図を表示 plot(soil_UTM54,col=NA,add=T) #土壌の境界ポリゴンを表示 #ランダムポイント作成 dojyou_area_UTM54<-dojyou_area %>% st_transform(3100) #土壌範囲のベクタデータを投影変換 pnt<-st_sample(dojyou_area_UTM54,10000) #範囲内に1万点をランダムに作成 plot(dojyou_area_UTM54) #範囲の地図表示 plot(pnt,pch=".",add=T) #ランダム点の表示 82
  83. 83. 土壌と地形の関係を調べてみる 実行その3 #ラスタから値を抽出 envs<-stack(dem_UTM54,slope,aspect,soil) #標高、傾斜、斜面方位、土壌の RasterStackを作成 names(envs)<-c("elev","slope","aspect","soil") #RasterStackのレイヤ名を変更 envs #データの確認 pnt.sp<-as(pnt,"Spatial") #SpatialPointsクラスに変換 ex<-raster::extract(envs,pnt.sp,df=TRUE) #ランダムポイントの位置の RasterStackの値を抽出 head(ex) #抽出した値の確認 #モデル作成と予測 ex$soil<-as.factor(ex$soil) #土壌データはfactorに変換 pairs(ex[,2:5],cex=0.1) #ペアプロット m<-glm(slope~elev+aspect+soil,data=ex) #傾斜の決定要因をモデル化 summary(m) #モデルの概要(モデルは出鱈目です) result<-predict(envs,m) #モデルを全域に適用 par(mfrow=c(1,2)) #追加(プロットを2列表示) plot(result) #予測した傾斜の結果を地図表示 slope_mask<-mask(slope,soil) #土壌の範囲で傾斜データをマスク(周辺部分を消す) plot(slope_mask) #実際の傾斜を表示 83
  84. 84. 参考URL ベクタ ● https://cran.r-project.org/web/packages/sf/index.html ● https://cran.r-project.org/web/packages/sf/vignettes/sf1.html ● https://cran.r-project.org/web/packages/sf/vignettes/sf2.html ● https://cran.r-project.org/web/packages/sf/vignettes/sf3.html ● https://cran.r-project.org/web/packages/sf/vignettes/sf4.html ● https://cran.r-project.org/web/packages/jpndistrict/index.html ラスタ ● https://www.rdocumentation.org/packages/raster/versions/2.5-8/topics/raster-package ● https://cran.r-project.org/web/packages/raster/index.html 全般 ● http://rspatial.org/index.html ● https://edzer.github.io/UseR2017/ ● http://ooooooha.hatenablog.com/ ● http://uribo.hatenablog.com/ ● http://notchained.hatenablog.com/ ● https://www.karada-good.net/ ● https://suryu.me/ 84
  85. 85. 以上、お疲れ様でした。 85

×