More Related Content
More from Mizutani Takayuki (9)
カッパ(妖怪)の生息適地マップ作成入門
- 2. 2 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
この資料は以下の本から
[オープンデータ+QGIS]
統計・防災・環境情報がひと目でわかる地図
の作り方
ハンズオン用にスピンオフした内容になってい
ます。ぜひ、本書もあわせてご覧いただければ
と思います。
技術評論社サイト
http://gihyo.jp/book/2014/978-4-7741-6913-2
Amazonサイト
http://www.amazon.co.jp/dp/4774169137
- 3. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
内容
入門編(前半): 14:00~15:30
カッパの生息適地マップの作成
オープンデータなどの公開されているデータを利用して、カッパの生息適地を
QGISで可視化してみます。
~10分休憩~
応用編(後半): 15:40~17:00
カッパの生息適地マップの分析
カッパの生息適地をGDAL、Python、GRASS、Rを連携して分析してみます。
3
- 4. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
事前準備
•Windowsパソコン(7以降)を使用します。
•OSGeo4Wで、QGIS2.4、GRASS6.4をインストールします。
•Python、GDALはOSGeo4Wでインストールされるものを利用します。
•R 3.1をインストールします。
•配布したデータ「kappadata」フォルダは、デスクトップに保存します。
4
- 5. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
使用データ
本ハンズオンでは、岩手県遠野市周辺 2次メッシュ 「594104」のデータを使用します。
kappadata¥dataの中にあらかじめダウンロードしておいたデータが入っています。
・国土数値情報(http://nlftp.mlit.go.jp/ksj/)
「河川」データ [W05-07_03_GML.zip]
・自然環境情報GIS(http://www.vegetation.biodic.go.jp/)
「1/25,000植生図」GISデータ [shp594104.zip]
・基盤地図情報(http://www.gsi.go.jp/kiban/)
「数値標高モデル」10mメッシュデータ [FG-GML-5941b-DEM10B.zip]
・エコリス(http://www.ecoris.co.jp)
「カッパ確認位置」データ(未公開)
5
- 6. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データについて
ご注意!
・基盤地図情報「数値標高モデル」のデータは、今回の講習のためだけの「一時的な資料とし
て利用する」ものとして、あらかじめ国土地理院のサイトからダウンロードしておいたものを
配布しています。
・講習終了後、「数値標高モデル」のデータおよび「数値標高モデル」を利用して作成した
データは、速やかに破棄してください。
・家で復習したい場合は、国土地理院のサイトでアカウントを取得し、自分でデータを
ダウンロードしてください。
・その他のデータは、出典の明示をすることで再配布可能なデータとなっているので、その規
約に従ってご利用ください。
6
- 7. 生息適地
生息適地推定とは
環境データ
2014/10/31 FOSS4G Tokyo 2014 ハンズオン
(地形、植生、気候など)
生物データ
(生態情報、確認位置など)
7
地形、植生、気候などの環境データと、
生物の生息環境や確認位置などの情報か
ら、その生物が生息するのに適している
場所を推測して可視化する手法を生息適
地推定と言います。
- 9. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
カッパの生態について
川や池に生息し、陸上も移動する
胡瓜を主食とする
頭上の皿の乾燥に極めて弱い
参考文献:Yanagida(1910). Tono monogatari
予備知識
「カッパ淵」
画像出典:wikipedia
9
- 10. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
入門編の流れ
1. 河川データから河川からの距離図を作成
2. 植生データから畑地面積率図を作成
3. 標高データから日射量図を作成
4. データを組み合わせて生息適地マップを作成
10
川や池に生息し、陸上も移動する
胡瓜を主食とする
頭上の皿の乾燥に極めて弱い
- 12. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データのダウンロード国土数値情報から「河川」データを
ダウンロードします。
JPGIS2.1→河川→岩手を選択座標系がJGD2000になっているのを確認
12
- 13. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データの読み込み
ダウンロードした河川データを
QGISに読み込みます。
「W05-07_03-g_Stream.shp」を
ドラッグアンドドロップ
※「data¥W05-07_03_GML」の中に入っ
ています。
ダウンロードしたデータの中にはprjファイル
がないため空間参照システム(測地系や投影
法)が自動判別できません。
そのため「空間参照システム選択」ウインドウ
でデータの空間参照システムを定義します。
「CRSが設定されていません」とメッセージが
出る場合は、レイヤを右クリックして「レイヤ
CRSを設定する」を選択します。
次ページ参照
13
- 14. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
空間参照の定義
レイヤを右クリック→「レイヤCRSを設定
する」
データの空間参照システム(測地系や
投影法)を定義します。
フィルターにJGD2000と入力して、
EPSG:4612を選択
14
- 15. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データの切り出し
データを2次メッシュ594104の範囲で切り出し
て保存します。
レイヤを右クリック→「名前をつけて保存」
「形式」→ESRI Shapefile
「名前をつけて保存」→ブラウズ「kasen.shp」
ファイルの保存先は、デスクトップの中の
「kappadata¥mydata」を指定してください。
「領域」をチェック→以下を入力
北 39.41666667 南 39.3333333
西 141.5 東 141.625
15
「エンコーディング」→Shift_JIS
「保存されたファイルを地図に追加する」を
チェック
- 16. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
投影法の変換
投影法をUTMゾーン54のデータに変換します。
「kasen」レイヤを右クリック→「名前をつけて
保存」
「形式」→ESRI Shapefile
「名前をつけて保存」→ブラウズ
「kasen_UTM54.shp」
「CRS」→ブラウズ→
JGD2000/UTM zone54N(EPSG:3100)を選択
16
注意
ファイル名やパス名に日本語があると、このあと利用す
るプロセッシングが上手く動作しない場合があるので、
本ハンズオンでは日本語ファイル名は使用しません。
ファイルの保存先は、デスクトップの中の
「kappadata¥mydata」を指定してください。
※キャプチャ画像の保存先が違っている場合があります
が、読み変えてください。 次ページ以降も同じ。
「エンコーディング」→Shift_JIS
- 17. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
ラスタデータに変換
セルサイズが10m✕10mで川の部分のラスタ値が1の
GeoTIFFファイルを作成します。
「kasen_UTM54.shp」を読み込み
メニュー→ラスタ→変換→ラスタ化 を選択
「出力ファイル」を指定「kasen.tif」
「地図の単位ピクセルでのラスタ解像度」を選択
「水平」「垂直」に10を入力
を押して、
gdal_rasterizeのあとに -burn 1 と入力
17
メニュー→プロジェクト→新規 を選択
- 18. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
ラスタデータの確認
レイヤを右クリック→プロパティ→スタイル
→バンド表示→最大→1と入力
スタイルを変更してラスタデータを確認します。
河川部分が白く表示されるのを確認
18
- 19. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
距離を計算
メニュー→ラスタ→解析→プロキシミティ
を選択
河川ラスタからの距離を計算します。
「出力ファイル」を指定「kasen_distance.tif」
※ファイルの種類でGeoTIFFを選択のこと!
プロキシミティは、ラスタ値が0以外の場所か
らの距離を計算します。(距離を計算するらラ
スタ値を指定することも可能です)
19
- 20. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
河川からの距離図距離を算出したレイヤにスタイルを設定して、距離に
より色分けした「河川からの距離図」を作成します。
レイヤを右クリック→プロパティ→スタイル
河川からの距離で色分けされているのを確認
レンダータイプ→単バンド疑似カラー
新規カラーマップを作成→Spectral
最小 0、最大1000と入力→分類
20
既定スタイルとして保存しておく
- 22. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データのダウンロード自然環境情報GISから「1/25,000 植生図」
GISデータをダウンロードします。
「Shapeデータダウンロード」→「植生調査情
報提供ホームページへ」を選択
2次メッシュ(594104)の
1/25,000植生図GISデータをダウンロード
22
- 23. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データの読み込みダウンロードした植生データを
QGISに読み込みます。
メニュー→「レイヤ」→「ベクタレイヤの追加」
ドラッグアンドドロップで読み込むと属性テーブルの
エンコードが判別できず日本語の属性テーブルが文字
化けする場合があります。
「エンコーディング」→「Shift_JIS」を選択
「データセット」→「p594104.shp」を選択
※「data¥shp594104」の中に入っていま
す。
23
QGISでメニュー→プロジェクト→新規 を選択
- 24. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
空間参照の定義データの空間参照システム(測地系や
投影法)を定義します。
フィルターにJGD2000と入力して、
EPSG:4612を選択
ダウンロードしたデータの中にはprjファイルが
ないため空間参照システム(測地系や投影法)
が自動判別できません。
そのため「空間参照システム選択」ウインドウ
でデータの空間参照システムを定義します。
「CRSが設定されていません」とメッセージが
出る場合は、レイヤを右クリックして「レイヤ
植生データのREADMEファイルに世界測地系のCRSを設定する」を選択します。
緯度経度のデータだと書かれています。
24
- 25. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
畑地の選択植生データから畑地雑草群落を選択します。
式に ”HANREI_N” = ’畑地雑草群落’
と入力して「選択」
レイヤを右クリック→「属性テーブルを開く」
「条件を使った地物選択」ボタンを押す
25
- 26. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
畑地データの保存
レイヤを右クリック→名前をつけて保存
選択した畑地雑草群落のみをシェープファイル
に保存します。同時に投影法もUTMゾーン54に
変換します。
「形式」→ESRI Shapefile
「名前をつけて保存」→「hatati.shp」
「CRS」→ブラウズ→
JGD2000/UTM zone54N(EPSG:3100)を選択
「選択された地物のみを保存する」にチェック
26
- 27. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
ラスタデータに変換
セルサイズが10m✕10mで畑地の部分のラスタ値が
100のGeoTIFFファイルを作成します。
メニュー→プロジェクト→新規 を選択
メニュー→ラスタ→変換→ラスタ化を選択
「出力ファイル」を指定「hatati.tif」
「地図の単位ピクセルでのラスタ解像度」を選択
「水平」「垂直」に10を入力
を押して、
gdal_rasterizeのあとに -burn 100 と入力
27
「hatati.shp」を読み込み
- 28. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
プロセッシング設定
メニュー→プロセッシング→オプションと構成
畑地面積率はプロセッシングツールボックス
のGRASSコマンドを利用します。はじめ
に、プロセッシングの設定を確認します。
メニュー→プロセッシング→ツールボックス
からツールボックスを開く
プロバイダ→GRASS commandsの設定を確認
28
- 29. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
畑地面積率を計算
ツールボックスから
「GRASS commands」→「Rater」→「r.neighbors」
※ツールボックス下部のリストボックスを「Advanced Interface」
に変更しておく。
畑地ラスタから1km圏内の畑地面積率をGRASSの
r.neighborsを使って計算します。
「Neiborhood operation」→average
「Neiborhood size」→101
※ Neiborhood sizeは奇数のみ
「Use circular neighborhood」→Yes
「Output layer」を指定「hatati1km.tif」
29
「Input raster layer」→hatati
- 30. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
畑地面積率の解説r.neighborsを使った畑地面積率の算出方法を
説明します。
r.neighborsは、中心セルから指定範囲内を計
算対象セルとしてラスタ値の平均や合計などを
計算します。その計算を中心セルを移動させな
がらラスタデータ全域で行います。
「Neighborhood size(1辺のセル数)」は101
セルで、ラスタ解像度は10mなので、
10m✕101セル=1010m が1辺の長さとなりま
す。そして、「circular neighborhood」を指定
しているので、1010mを直径とする円内のセル
が計算対象セルとなります。
「Neighborhood operation」はaverageなの
で、計算対象セルのラスタ値の平均を計算しま
す。今、ある場所が畑地であれば、そのラスタ値
は100、そうでなければ0なので、計算対象セル
全域が畑地であれば、その平均は100、半分なら
50、なければ0となります。
よって、r.neighborsにより
約1km圏内の畑地面積率(0~100)がラスタ全域で
計算できます。
※近傍解析、フォーカル統計と言ったりもします。
30
- 31. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
畑地面積率図算出した畑地面積率レイヤにスタイルを設定して、色
分けした「畑地面積率図」を作成します。
1km圏の畑地面積率(0~100)で色分けさ
れているのを確認
レイヤを右クリック→プロパティ→スタイル
レンダータイプ→単バンド疑似カラー
新規カラーマップを作成→Spectral
最小 0、最大100と入力→反転に
チェック→分類
31
既定スタイルとして保存しておく
- 33. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データのダウンロード基盤地図情報から「数値標高モデル」データ
をダウンロードします。
国土地理院のアカウントを取得してログイン
数値標高モデル JPGIS(GML)形式を選択
10mメッシュの
「594104FG-GML-5941b-DEM10B.zip」
をダウンロード
33
- 34. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
GMLデータの変換ダウンロードした標高GMLデータを
GeoTIFF形式に変換します。
エコリス「基盤地図情報 標高DEMデータ変換
ツール」をダウンロード
※今回は、programの中に入っています。
「変換結合.vbs」をダブルクリック
投影法は緯度経度 →0 を入力
陰影起伏図を作成しますか?→はい
フォルダ選択→「data¥FG-GML-5941b-
DEM10B」
海域の標高→はい(0)
「変換終了しました」のメッセージで完了
選択フォルダの中に「merge.tif」があればOK
34
- 35. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データの読み込み
GeoTIFF形式に変換した標高データを
QGISに読み込みます。
「data¥FG-GML-5941b-DEM10B
¥merge.tif」をドラッグアンドドロッ
プ
35
メニュー→プロジェクト→新規 を選択
- 36. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
投影法の変換
標高ラスタデータの投影法をUTMゾーン54に
変換します。
メニュー→「ラスタ」→「投影法」→「ワー
プ」を選択
入力ファイル→merge
「出力ファイル」→選択
「iwate_demUTM54.tif」
「ソースSRS」→JGD2000(EPSG:4612)を選択
「ターゲットSRS」→
JGD2000/UTM zone54N(EPSG:3100)を選択
36
「リサンプリングメソッド」→双線型
- 37. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
日射量の解説日射量の計算はプロセッシングツールボック
スのGRASSコマンドr.sunを使用します。
r.sunによる日射量の算出方法を説明します。
日射には、直達日射、反射日射、散乱日射が
あります。
総日射は、直達日射+反射日射+散乱日射に
なります。
総日射量は、1日分の総日射の合計値です。
単位は、[Wh・㎡・1day]です。
日射量の計算には、あらかじめ用意しておい
た、標高、傾斜、傾斜方位のデータを使用
し、GRASSのr.sunのコマンドを利用します。
37
詳細は、GRASS GISの r.sunの マニュアルを
参照ください。
- 38. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
傾斜角度の計算
標高データから傾斜角度を計算します。
メニュー→ラスタ→解析→DEM を選択
「出力ファイル」→選択「slope.tif」
「モード」→傾斜
38
メニュー→プロジェクト→新規 を選択
「iwate_demUTM54.tif」を読み込み
「入力ファイル」→「iwate_demUTM54」
- 39. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
傾斜方位の計算
傾斜と同様に標高データから傾斜方位を計算します。
メニュー→ラスタ→解析→DEM を選択
「入力ファイル」→「iwate_demUTM54」
「出力ファイル」→選択「aspect.tif」
「モード」→傾斜方位
39
「三角法角度を返す」→ チェック
「平地の値に0を返す」→チェック
「三角法角度を返す」により傾斜方位が東0°、北
90°、西180°、南270°となります。
「平地の値に0を返す」により、傾斜のない平坦地
が0°となります。
- 40. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
傾斜方位の確認
レイヤを右クリック→プロパティ→スタイル
スタイルを変更して斜面方位を確認します。
斜面方位によって色分けされるのを確認
40
レンダータイプ→単バンド疑似カラー
を押して、↑のように値と色を追加
- 41. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
日射量を計算標高、傾斜、傾斜方位のデータから日射量を計算します。
「Elevation layer」→「iwate_demUTM54」(標高)
41
ツールボックスから
「GRASS commands」→「Rater」→「r.sun」
「Aspect layer」→「aspect」(傾斜方位)
「Name of the input slope raster map」→「slope」(傾斜)
「No. of day of the year」→172
※1月1日から数えて172日目(夏至のあたり)を計算
「Output global(total) irradiance/irradiation layer」
→「irradiation.tif」(総日射量)
その他の「Open output file after running algorithm」の
チェックを外す
- 42. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
日射量図レイヤのスタイルを設定して、日射量により色分けし
た「日射量図」を作成します。
レイヤを右クリック→プロパティ→スタイル日射量で色分けされているのを確認
レンダータイプ→単バンド疑似カラー
最小/最大にチェック→読み込み
新規カラーマップを作成→Spectral
反転にチェック→分類
42
既定スタイルとして保存しておく
- 44. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
生息適地の計算
これまで作成したラスタデータを組み合わせて
カッパの生息適地をラスタ計算機で算出します。
メニュー→ラスタ→ラスタ計算機 を選択
「ラスタバンド」の畑地を選択→カレントレイヤ
の領域 を押す
ラスタ演算式に次の式を入力(コピペでもOK)
44
メニュー→プロジェクト→新規 を選択
「kasen_distance.tif」「hatati1km.tif」
「irradiation.tif」を読み込み
「出力レイヤ」→選択「kappa.tif」※.tifも入力
((("kasen_distance@1" < 100) * 100 + (100 <=
"kasen_distance@1") * ("kasen_distance@1" < 500) *
50 + ("kasen_distance@1" >= 500) * 10) *
"hatati1km@1" * (100 - "irradiation@1" / 100)) ^
0.33333
↑ダブルクリック
で演算式↓に追加
- 45. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
ラスタ演算式の解説1 ラスタ演算式の意味を説明します。
※「河川からの距離」がkasen_distance、「畑地面積率」がhatati1km、
「日射量」がirradiationという名前のラスタレイヤになっています。
(
( ("kasen_distance@1"<100)*100 + (100<="kasen_distance@1")*("kasen_distance@1"<500)*50 + ("kasen_distance@1">= 500)*10 ) *
"hatati1km@1" *
(100 - "irradiation@1" / 100)
) ^ 0.33333
最初のカッコの部分は、kasen_distanceのラスタ値が100より小
さければ1、そうでなければ0を返すという条件式です。
45
("kasen_distance@1" < 100)
(100 <= "kasen_distance@1") * ("kasen_distance@1" < 500) * 50
次の部分は、kasen_distanceが100以上であれば1を返す部分と、
kasen_distanceが500より小さければ1を返す部分を掛けています。
つまり、kasen_distanceが100以上かつ500より小さければ1を返し、
そうでなければ0を返します。また、最後にそれに対して50を掛けて
いるので、この式の部分は河川からの距離が100mから500mの場所
はその値を50にするという意味になります。
ここまでの説明からkasen_distanceを含む
1段目の式は、以下の表のようにラスタ値を
変更するという意味になります。
つまり、川に近いと良い場所(100点)、遠
いと悪い場所(10点)になります。
演算式全体
演算式の説明1
演算式の説明2
演算式の説明3
河川までの距離ラスタの値
0~100m 100
100~500m 50
500m~ 10
- 46. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
ラスタ演算式の解説2 ラスタ演算式の意味を説明します。
※「河川からの距離」がkasen_distance、「畑地面積率」がhatati1km、
「日射量」がirradiationという名前のラスタレイヤになっています。
(
( ("kasen_distance@1"<100)*100 + (100<="kasen_distance@1")*("kasen_distance@1"<500)*50 + ("kasen_distance@1">= 500)*10 ) *
"hatati1km@1" *
(100 - "irradiation@1" / 100)
) ^ 0.33333
2段目のhatati1kmの部分は、なにも変更せず0~100の畑地面積
率の値をそのまま使います。
46
"hatati1km@1"
(100 - "irradiation@1" / 100)
3段目のirradiationの部分は、切片が100で傾きが-1/100の直線式となって
います。なので、日射量が0(Wh.㎡.1day)だとラスタ値が100で、日射
量が10000(Wh.㎡.1day)だと0になるように変換されます。
つまり、日射量が少ないと良い場所(100 点)、多いと悪い場所(0点)
になります。
最後に、kasen_distance、hatati1km、irradiationの
部分を掛けあわせて、それを0.33333乗しています。
これは各ラスタレイヤを0~100になるように変換し
た上で、その相乗平均をとることを意味します。
つまり、ラスタレイヤの内1つでも0だと全体が0にな
り、すべてのレイヤが100であれば100になります。
演算式全体
演算式の説明4
演算式の説明5
演算式の説明6
まとめ
総合すると、河川までの距離が近く、畑地が多く、
日射量が少ない場所が、カッパが出没しやすい場所
(100点)、反対に河川までの距離が遠く、畑地が少
なく、日射量が多い場所はカッパが出没しにくい場
所(0点)となるようにラスタ値を変換する式になっ
ています。
- 47. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
生息適地マップレイヤのスタイルを設定して、生息適地の得点により
色分けした「カッパ生息適地マップ」を作成します。
レイヤを右クリック→プロパティ→スタイル生息適地としての得点で色分けされているの
を確認
レンダータイプ→単バンド疑似カラー
最小/最大にチェック→読み込み
新規カラーマップを作成→Spectral
反転にチェック→分類
47
既定スタイルとして保存しておく
- 50. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
入門編のおさらい
生息適地を推定するための地図データをQGISで変換&作成しました。
◯ データを見ながら操作できる
✕ やり直し、繰り返しが面倒
生息適地を「それっぽい演算式」で推定しました。
◯ それっぽい地図が作成できる
✕ 演算式の根拠が弱い
50
- 51. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
応用編の流れ
★ やり直し、繰り返しが簡単
GDAL&GRASSコマンドで
地図データ作成
★ 演算式を分析的に構築
Rで生息適地マップの分析・作成
51
応用編の内容は、ここで完全に理解できなくても大丈夫です。コマン
ドを使ったGISデータの扱いがどんな感じなのか雰囲気を掴んでもらえ
ればOKです。各ソフトの習得法も紹介しますので、今後の独学のため
のステップとしてもらえればと思います。
- 52. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
応用編
GDAL&GRASSコマンドで
地図データ作成・変換
52
入門編で作成したデータ(河川からの距離、畑地面積率、日射量、生
息適地)を、GDALとGRASSコマンドを組み合わせて作成します。
- 53. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
GDALとは最初にGDALについて簡単な説明をします。
・GISデータ変換のためのプログラムライ
ブラリ
・GDAL Utility ProgramsというGISデー
タ変換のための便利なコマンド集を提供し
ている
・ GDALは多くのソフトでGISデータ変換
のために利用されている
GDALを利用しているソフト
53
ArcGIS
- 54. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
GDALコマンドGDAL Utility Programsで提供されている
コマンドについて説明します。
54
ラスタ用ベクタ用
ラスタ情報表示
ファイル形式変換
投影法変換とか
標高関連、傾斜とか
タイル地図作成
べクタ→ラスタ変換
距離ラスタ作成
ラスタ→ベクタ変換
ラスタ計算機
ベクタ情報表示
投影変換、ファイル形式変換
GDALコマンドを使えば、GISデータをいろいろ
操作できます。
- 55. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
GDALコマンド例GDALコマンドの例を紹介します。
55
ژḱᴨḩὟᾛᾜᾤὥᾫᾠᾝὠ᷂ḀͨΌӭಐࣈὟᾪᾟᾘᾛᾜὥᾫᾠᾝὠḉ܂᷐ࣶḂ
gdaldem hillshade dem.tif shade.tif
ژḱᴨḩᷥЖঢḉὬὧᾤ✕Ὤὧᾤᷢٯ᷐Ḃ
gdalwarp -r bilinear -tr 50 50 dem.tif dem50.tif
͆ᷥḡḑᴨṁḿḋḎṕḉᾌᾋᾄᷢҙ᷐Ḃ
ogr2ogr -t_srs epsg:3100 data_utm.shp data.shp
これをOSGeo4Wコンソールに打ち込むだけ
- 56. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
OSGeo4Wの起動OSGeo4Wを起動して、簡単なコマンド操作をして
みます。
OSgeo4W Shellのアイコン
をダブルクリックして起動。
もしくは、スタート→すべてのプログラム
→OSGeo4W→OSGeo4W Shell
56
コマンドを打って以下の操作を実行します。
•kappadataフォルダに移動
•kappadataの中のファイル一覧を表示
•mydataフォルダをmydata_qgisに名前を変更
•新たに空のmydataフォルダを作成
άά܂դḿḓṕḪᷢ̈́ବ
>cd kappadata
άάḿḋḎṕḉ͔ฅݸ
>dir
άάḿḓṕḪ൮ᷥٯ
>mv mydata mydata_qgis
άάࢡ᷎ᶻḿḓṕḪᷥ܂ࣶ
>mkdir mydata
ファイル名の途中でtabを押すと補完できます。
↑↓ボタンを押すと、コマンド履歴が表示できます。
- 57. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
河川からの距離河川からの距離図をコマンドで作成してみます。
57
άάὗύὸᾃᷥधપ᷏᷁᷵ᷡᶻᴮṋṌṔѦଔุᷝᷟമلḒṝḝᴨḱḍṝḚᷥ݊પᴯ
set GDAL_CACHEMAX=1024
set GDAL_FILENAME_IS_UTF8=NO
set SHAPE_ENCODING=CP932
άάὗϳशḱᴨḩḉ݊પఇ̷ᷞḙṔḭṁ᷎ᷝଈΌೳḉҙ
ogr2ogr -clipsrc 141.5 39.3333333 141.625 39.4166667 -s_srs epsg:4612 -t_srs epsg:3100
mydatakasen_UTM54.shp dataW05-07_03_GMLW05-07_03-g_Stream.shp
άάὗЖঢὨὧᾤ✕Ὠὧᾤᷞϳशಊಠ᷃Ὠᷥṓḣḩᷢҙ
gdal_rasterize -burn 1 -tr 10 10 -l kasen_UTM54 mydatakasen_UTM54.shp mydatakasen.tif
άάὗṓḣḩਯ᷃Ὠ᷂ḀᷥԵฑḉבܭ
gdal_proximity -distunits GEO -values 1 mydatakasen.tif mydatakasen_distance.tif
άάὗḱᴨḩᷥѐᴮṓḣḩᴯ
gdalinfo mydatakasen_distance.tif
άάὗḱᴨḩᷥѐᴮṃḙḩᴯ
ogrinfo -al -so mydatakasen_UTM54.shp
άάὗᾈᾀᾊᷞѐ
qgis mydatakasen_distance.tif
kappadata¥生息適地コマンド.txtを開く
コマンドを選択してコピー→コンソール
で右クリック→貼り付け
::はコメント行なので無視される
- 58. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
GDALコマンドの
習得法
最初からコマンドを自在に組み立てるのは難しいです。
そこでGDALコマンドをどうやったら習得できるのかを
紹介します。
58
コマンドのマニュアルを調べる(WEB)
キーワードでググる→ブログやメーリン
グリストを参考に真似する
本を見る(GDALに関する情報は多くあ
りません)
とにかくコマンドを打って試行錯誤する
- 59. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
1km圏畑地面積の計算で利用する
GRASSとは1km圏畑地面積をGDALとGRASSコマンドで作成
しますが、その前にGRASSについて説明します。
59
GRASSの習得法
ハンズオンに参加する
マニュアルを調べる(WEB)
本を見る
・1984年から公開されているオープンソース
のGISソフトウェア
・もともとはコマンド操作を基本としていた
が、今はGUIもある
・ラスタ形式、ベクタ形式ともにサポート
し、豊富な解析コマンドがある。
今回はGRASSをコマンドからバッチ処理的な方法で
利用します。通常のように対話的な操作方法ではあり
ませんが、GRASSコマンドの使い方は同じです。
- 60. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
1km圏畑地面積1km圏畑地面積をGDALとGRASSコマンドで作成し
てみます。(GDAL部分の説明は同じなので省略)
60
άάὗᾉὸᾊᾊҤՉ᷏ࣞ᷁᷵ᷡᶻᴮޒڊҤՉᷥḻḣᴖḱᴨḩ়रᴖधપḿḋḎṕᷥ݊પᴯ
set GISBASE=%OSGEO4W_ROOT%appsgrassgrass-6.4.4
set LD_LIBRARY_PATH=%GISBASE%lib;%LD_LIBRARY_PATH%
set PATH=%GISBASE%bin;%GISBASE%etc;%GISBASE%etcpython;%GISBASE%lib;%GISBASE%
extralib;%OSGEO4W_ROOT%appsmsysbin;%PATH%
set PYTHONPATH=%GISBASE%etcpython
set GISDBASE=%HOME%Desktopkappadatagrassdata
←今回はここを指定
set GISRC=%HOME%Desktopkappadatahandson.grassrc
άάὗଈΌೳḉ݊પ᷎ᷝṗḛᴨḡṑṝḿḓṕḪḉ܂ࣶᴖḕṖṝḲṈḭṁḥḭḲḉधપḿḋḎṕᷢӫຉ
g.gisenv.exe set="MAPSET=PERMANENT"
g.gisenv.exe set="LOCATION_NAME=temp"
g.gisenv.exe set="GISDBASE=%GISDBASE%"
g.gisenv.exe set="GRASS_GUI=text"
g.proj -c epsg=3100 location=temp
άάὗḱᴨḩḉᾉὸᾊᾊᷢ᷶ڴ᷶ᴖבܭฺ͐ḉधપᴖᾩὥᾥᾜᾠᾞᾟᾙᾦᾩᾪḉޒڊᴖḱᴨḩḉࠟ᷄߾᷎
r.in.gdal --overwrite -o -e input=mydatahatati.tif output=tmp
g.region rast=tmp
r.neighbors --overwrite -c input=tmp output=tmp_neighbors method=average size=101
r.out.gdal -c createopt="TFW=YES,COMPRESS=LZW" input=tmp_neighbors output=mydata
hatati1km.tif
άάὗࠖซߘวؽᴖṗḛᴨḡṑṝḿḓṕḪḉ܃ࠪ
rm -r %GISDBASE%temp
←epsgはデータによって変更
↓GRASSコマンドの主要な部分
- 61. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
日射量日射量をGDALとGRASSコマンドで作成してみます。
61
άάὗᾉὸᾊᾊҤՉ᷏ࣞ᷁᷵ᷡᶻᴮޒڊҤՉᷥḻḣᴖḱᴨḩ়रᴖधપḿḋḎṕᷥ݊પᴯ
同じなので省略
άάὗଈΌೳḉ݊પ᷎ᷝṗḛᴨḡṑṝḿḓṕḪḉ܂ࣶᴖḕṖṝḲṈḭṁḥḭḲḉधપḿḋḎṕᷢӫຉ
同じなので省略
άάὗḱᴨḩḉᾉὸᾊᾊᷢ᷶ڴ᷶ᴖבܭฺ͐ḉधપᴖᾩὥᾪᾬᾥḉޒڊᴖḱᴨḩḉࠟ᷄߾᷎
r.in.gdal --overwrite -o -e input=mydataiwate_demUTM54.tif output=dem
r.in.gdal --overwrite -o -e input=mydataaspect.tif output=aspect
r.in.gdal --overwrite -o -e input=mydataslope.tif output=slope
g.region rast=dem
r.sun elevin=dem aspin=aspect slopein=slope day="172" glob_rad=globrad --overwrite
r.out.gdal -c createopt="TFW=YES,COMPRESS=LZW" input=globrad output=mydata/
irradiation.tif
άάὗࠖซߘวؽṗḛᴨḡṑṝḿḓṕḪḉ܃ࠪ
同じなので省略
- 62. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
生息適地の計算生息適地の計算をGDALコマンドで実行してみます。
(QGISで実施した演算式による手法)
62
άάὗᾟᾘᾫᾘᾫᾠὨᾢᾤὥᾫᾠᾝ᷂ḀḱᴨḩḒṔḌḉݸ᷐ṇṔḞṝᾘᾩᾜᾘὥᾪᾟᾧḉ܂ࣶ
gdaltindex mydataarea.shp mydatahatati1km.tif
άάὗᾢᾘᾪᾜᾥᾖᾛᾠᾪᾫᾘᾥᾚᾜᴖᾟᾘᾫᾘᾫᾠὨᾢᾤᴖᾠᾩᾩᾘᾛᾠᾘᾫᾠᾦᾥᷥḱᴨḩḉ᷐ᷰᷝᾘᾩᾜᾘὥᾪᾟᾧᷥఇ̷ᷢᷔḄᶿḂᴗ
gdalwarp -overwrite -r near -tr 10 10 -dstnodata -9999 -t_srs epsg:3100 -crop_to_cutline
-cutline mydataarea.shp mydatahatati1km.tif mydatar_hatati1km.tif
gdalwarp -overwrite -r near -tr 10 10 -dstnodata -9999 -t_srs epsg:3100 -crop_to_cutline
-cutline mydataarea.shp mydatakasen_distance.tif mydatar_kasen_distance.tif
gdalwarp -overwrite -r near -tr 10 10 -dstnodata -9999 -t_srs epsg:3100 -crop_to_cutline
-cutline mydataarea.shp mydatairradiation.tif mydatar_irradiation.tif
άάὗᾞᾛᾘᾣᾖᾚᾘᾣᾚᷞṓḣḩίܭḉޒڊ᷐Ḃ
gdal_calc --overwrite -A mydatar_kasen_distance.tif -B mydatar_hatati1km.tif -C mydata
r_irradiation.tif --outfile=mydatakappa.tif --calc="pow(((A < 100) * 100 + (100 <= A) *
(A < 500) * 50 + (A >= 500) * 10) * B * (100 - C / 100),0.33333)"
άάὗḱᴨḩᷥѐ
gdalinfo mydatakappa.tif
qgis mydatakappa.tif
gdal_calcで使用するラスタはすべて、同じ解像度、同じ範囲、同
じ投影法にそろえておく必要があります。
- 63. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
コマンドの利点GDALやGRASSコマンドでデータを作成することによ
る利点を説明します。
63
GISの処理をテキストに保存しておける
手順の再現、再利用が可能
プログラムと連携、バッチ処理ができる
宿題
•500m圏畑地面積率を計算してみましょう
•冬至の日射量を計算してみましょう
•演算式を変更して生息適地を計算してみましょう
→少し数値を変えてコピペするだけ
※最近ではGISの処理をグラフィカ
ルに作成・保存できる「モデル」や
「モデルビルダー」が利用できるよ
うになってきています。
- 64. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
おまけPythonとの連携PythonからGRASSを呼び出す方法を紹介します。
参考程度なので興味があれば調べてみてください。
64
# -*- coding: utf-8 -*-
import os,sys
import grass.script as grass
import grass.script.setup as gsetup
import binascii
ଈΌೳḉ݊પ᷎ᷝṗḛᴨḡṑṝḿḓṕḪḉ܂ࣶᴖḕṖṝḲṈḭṁḥḭḲḉधપḿḋḎṕᷢӫຉ
epsg = 3100
gisrc = os.environ['GISRC']
gisbase = os.environ['GISBASE']
gisdb = os.environ['GISDBASE']
location = binascii.hexlify(os.urandom(16))
mapset="PERMANENT"
grass.run_command("g.gisenv.exe",set="GISDBASE="+gisdb)
grass.run_command("g.gisenv.exe",set="LOCATION_NAME="+location)
grass.run_command("g.gisenv.exe",set="MAPSET="+mapset)
grass.run_command("g.gisenv.exe",set="GRASS_GUI=text")
grass.run_command("g.proj",epsg=epsg,location=location,flags="c")
gsetup.init(gisbase, gisdb, location, mapset)
ᾩὥᾥᾜᾠᾞᾟᾙᾦᾩᾪᷥࠖซ
input=sys.argv[1]
output=sys.argv[2]
size=sys.argv[3]
grass.run_command("r.in.gdal", input = input , output = "tmp",flags="oe", overwrite=True)
grass.run_command('g.region', rast="tmp", flags='ap')
grass.run_command("r.neighbors", input = "tmp", output = "tmp_neighbors" , method = "average",size=size, flags="c",overwrite=True)
grass.run_command("r.out.gdal", input = "tmp_neighbors", output = output,flags="c")
άάࡱӫᷥᾧᾰᾫᾟᾦᾥḣḙṔṁḲḉޒڊᴮὪᾢᾤױᷞבܭ᷐Ḃ᷿ᶽᷢࣞ͢ḉ݊પᴯ
>python neighbors.py mydata¥hatati.tif mydata¥hatati3km.tif 301
GRASS環境変数は設定しておく
- 65. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
Rで使用する
データの準備
Rで生息適地マップを分析する際に使用する
データの作成と確認をしておきます。
άάὗᾉᷞܺෟ᷐ḂṈḣḙᴖͨΌࣈᷥ܂ࣶ
gdal_rasterize -a_nodata -9999 -tr 10 10 -burn 1 dataecorisplan.shp mydataplan.tif
gdalwarp -overwrite -r near -tr 10 10 -dstnodata -9999 -t_srs epsg:3100 -crop_to_cutline
-cutline mydataarea.shp mydataplan.tif mydatamask.tif
gdaldem hillshade mydataiwate_demUTM54.tif mydatashade.tif
άάὗᾉᷞܺෟ᷐Ḃḕḭḻᷥѐᴖੴێఇ̷ᷥѐ
ᾨᾞᾠᾪὗᾤᾰᾛᾘᾫᾘᾶᾪᾟᾘᾛᾜὥᾫᾠᾝὗᾛᾘᾫᾘᾶᾜᾚᾦᾩᾠᾪᾶᾧᾣᾘᾥὥᾪᾟᾧὗᾛᾘᾫᾘᾶᾜᾚᾦᾩᾠᾪᾶᾢᾘᾧᾧᾘὥᾪᾟᾧ
65
- 66. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
応用編
Rで生息適地マップの分析・作成
66
Rに現地調査結果のデータと、GDALとGRASSコマンドで作成した
データ(河川からの距離、畑地面積率、日射量)を読み込み、その関
係性を分析します。そのあと、生息適地の演算式を統計モデリングを
利用して作成し、その結果を地図データとして出力します。
- 67. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
Rとは最初にRについて簡単な説明をします。
67
• 統計解析のためのオープンソースのプログ
ラム言語
• きれいな図やグラフを表示、出力できる
• パッケージ(ライブラリ)を追加すること
で機能を拡張することができる。
• 地図データを扱うパッケージを追加するこ
とでラスタ、ベクタデータを読み込み、統
計分析することができる
- 68. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
Rのパッケージ
インストール
Rを起動して地図データを扱うために必要な
パッケージをインストールします。
パッケージ→ローカルにあるzipファイルからの
パッケージのインストール を選択
68
kappadata¥program¥R_libraryのすべての
ファイルを選択してインストール
※「personal libraryにインストールするか?」
というメッセージが出る場合はYesを選択
今回の分析では、dismo、rgdal、raster、ggplot2ライブラ
リを利用します。そのライブラリを利用するために必要な
パッケージファイルをインストールします。
通常は、ネットワークを利用してインストールしますが、
今回は回線の都合のためあらかじめ用意しておいたパッ
ケージファイルからインストールします。
- 69. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
スクリプトの読み込みあらかじめ用意しておいたRのスクリプト
ファイルを読み込みます。
ファイル→スクリプトを開く を選択
69
kappadata¥kappa.R を選択
コンソール(コマンド実行、結果を表示) スクリプト(コマンドをまとめたもの)
- 70. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
Rの基礎Rコンソールで簡単な操作をしてみます。
70
܂դḱḍṖḙḲṔᷥݸᴮᾉᷢ᷁᷈ḂḝṋṝḲڊᷦᴯ
> getwd()
[1] "C:/Users/mizutani/Documents"
܂դḱḍṖḙḲṔᷥٯὟքढḁᷦᴭὦᴭᴖᾫᾘᾙᷞҐὠ
> setwd("C:/Users/mizutani/Desktop/kappadata/")
Ҫਓᷡבܭ
> 1+2
[1] 3
בܭץϰḉࣞᾘᷢ৩Ὗ৩ᷢᷦὗέὤὗᷟᶻᶽӫڜḉܺᶽὠ
> a<-2*3
ࣞᷥਯḉݸ
> a
[1] 6
ࣞᷥਯḉܺᷚᷝבܭ᷎ᴖᶹḀᷖᷡࣞᷢ৩ᴗבܭץϰḉݸᴗ
> b<-a+4
> b
[1] 10
このほかRについて最低限知っておか
なければならないことは色々あります
が、ここでは説明しません。
・データ形式(スカラー、ベクトル、
行列、データフレーム、リスト)
・制御構文(if、forなど)
・関数など
- 71. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
地図データ読み込みRに地図データを読み込んで表示してみます。
71
ṓḎṀṓṔᷥ᷶ڴ᷶ᴮḻḭḛᴨḢᷦḎṝḣḲᴨṕۥ᷶ᴯ
library(rgdal)
library(raster)
library(dismo)
library(ggplot2)
#GDAL設定おまじない(日本語エンコーディングの指定)
setCPLConfigOption("GDAL_FILENAME_IS_UTF8","NO")
setCPLConfigOption("SHAPE_ENCODING","cp932")
#ラスタデータの読み込み(河川からの距離、畑地面積率、日射量)
kasen_distance<-raster("mydata/r_kasen_distance.tif")
hatati1km<-raster("mydata/r_hatati1km.tif")
irradiation<-raster("mydata/r_irradiation.tif")
shade<- raster("mydata/shade.tif")
#地図表示
plot(kasen_distance)
plot(hatati1km)
plot(irradiation,col=cm.colors(12))
plot(shade,col=grey(1:100/100))
#ベクタデータの読み込み(カッパの確認地点、調査範囲)
kappa <- readOGR("data/ecoris/kappa.shp","kappa")
plan <- readOGR("data/ecoris/plan.shp","plan")
#地図表示
plot(kappa)
plot(plan)
#地図の重ね合わせ
plot(shade,col=grey(1:100/100))
plot(plan,add=T)
points(kappa,col="red",cex=0.7,pch=20)
スクリプトウインドウでCtrl+Rを
押すと、その行を実行します。
(複数行選択→実行も可)
- 72. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
ラスタ値の抽出
カッパの確認地点における各ラスタ値を抽出し、調査
範囲内からランダムに作成したバックグラウンドデー
タにおいてもラスタ値を抽出します。これらを合わせ
て分析に使用するデータセットを作成します。
72
#説明変数としてラスタレイヤをまとめる
predictors<-stack(kasen_distance,hatati1km,irradiation)
#バックグラウンドデータ作成(maskデータ内のランダムなポイントデータ10000点)
mask <- raster("mydata/mask.tif")
set.seed(0)
backg<-randomPoints(mask,n=10000)
#地図表示
plot(mask,ext=extent(546817,551330,4354006,4358079))
points(backg,cex=0.05,pch=20)
#カッパ確認地点とバックグラウンドデータのラスタ値を抽出する
datapres <- extract(predictors,kappa)
databackg <- extract(predictors,backg)
#データ確認
head(datapres)
head(databackg)
#データセットを作成する(pa列にカッパ確認地点は1,バックグラウンドデータは0を入れる)
pa<-c(rep(1,nrow(datapres)),rep(0,nrow(databackg)))
data_rbind<-rbind(datapres,databackg)
data_cbind<-cbind(pa,data_rbind)
envdata<-data.frame(data_cbind)
colnames(envdata)<-c("pa","川からの距離","1km圏畑地面積率","日射量")
#データ確認
head(envdata)
tail(envdata)
- 73. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データ分析① 作成したデータセットから単変量解析をしてみます。
73
#データ要約(pa==0はバックグラウンド、pa==1はカッパ確認地点)
summary(envdata[envdata$pa==0,])
summary(envdata[envdata$pa==1,])
#ヒストグラムの表示
hist(envdata[envdata$pa==0,"川からの距離"],col="#ff00ff40")
hist(envdata[envdata$pa==1,"川からの距離"],col="#0000ff40")
hist(envdata[envdata$pa==0,"1km圏畑地面積率"],col="#ff00ff40")
hist(envdata[envdata$pa==1,"1km圏畑地面積率"],col="#0000ff40")
hist(envdata[envdata$pa==0,"日射量"],col="#ff00ff40")
hist(envdata[envdata$pa==1,"日射量"],col="#0000ff40",add=T)
#ggplot2でヒストグラム図作成(くわしく説明しませんがカッコイイ図を作成できます。)
xval<-c("川からの距離","1km圏畑地面積率","日射量")
windowsFonts(Meiryo=windowsFont("メイリオ"))
for(i in 1:3){
#種データ情報と表示位置
mindata<-min(envdata[envdata$pa==1,xval[i]])
maxdata<-max(envdata[envdata$pa==1,xval[i]])
mediandata<-median(envdata[envdata$pa==1,xval[i]])
str<-paste(xval[i],"(確認地点)n","最小値:",sprintf("%2.2f",mindata),"n")
str<-paste(str,"最大値:",sprintf("%2.2f",maxdata),"n")
str<-paste(str,"中央値:",sprintf("%2.2f",mediandata),"n")
xpos<-min(na.omit(envdata[envdata$pa==0,xval[i]]))
pafactor<-as.factor(envdata$pa)
p<-ggplot(envdata,aes_string(x=xval[i],fill="pafactor"))+
theme_grey(base_size=12,base_family="Meiryo")+
ylab("count(log_10)") +
theme(legend.position=c(1,1),legend.justification=c(1,1),axis.title.x=element_blank()) +
geom_histogram(position="identity",alpha=0.4) +
guides(fill=guide_legend(title=NULL)) +
scale_fill_discrete(labels=c("バックグラウンドデータ","確認地点データ")) +
scale_y_log10()+
coord_cartesian(ylim = c(10^0, 10^4)) +
annotate("text",x=xpos,y=8000,label=str,size=4,family="Meiryo",hjust=0,vjust=1)
ggsave(paste("mydata/",xval[i],"分布.png",sep=""), p, width = 16, height = 16,unit="cm",dpi=300)
}
- 74. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
データ分析② 作成したデータセットから二変量解析をしてみます。
74
#説明変数間の相関係数
cor(envdata[envdata$pa==0,2:4])
#説明変数間の散布図
plot(envdata[envdata$pa==0,2:4],pch=".")
#相関ペアプロット用関数
panel.cor<- function(x,y,digits=2,prefix="",cex.cor,...){
usr<-par("usr")
on.exit(par(usr))
par(usr=c(0,1,0,1))
r<-abs(cor(x,y,use="complete.obs"))
txt<-format(c(r,0.123456789),digits=digits)[1]
txt<-paste(prefix,txt,sep="")
if(missing(cex.cor)) cex.cor<-0.8/strwidth(txt)
text(0.5,0.5,txt,cex=cex.cor*(1+r)/2)
}
panel.hist <- function(x,...){
usr<-par("usr")
on.exit(par(usr))
par(usr=c(usr[1:2],0,1.5))
h<-hist(x,plot=FALSE)
breaks<-h$breaks
nB<-length(breaks)
y<-h$counts
y<-y/max(y)
rect(breaks[-nB],0,breaks[-1],y,col="white",...)
}
#相関ペアプロット図
ppi=300
png(file="mydata/相関ペアプロット.png", width=16/2.54*ppi, height=16/2.54*ppi,res=ppi)
pairs(envdata[envdata
$pa==0,2:4],pch=".",upper.panel=panel.cor,diag.panel=panel.hist,lower.panel=panel.smooth)
dev.off()
- 75. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
統計モデリング統計モデリングにより生息適地を推定してみます。
※統計モデリングについては説明しません。
75
#統計モデルを作成(glmを利用)
colnames(envdata)<-c("pa","r_kasen_distance","r_hatati1km","r_irradiation")
fit<- glm(pa~ . + I(r_kasen_distance^2) + I(r_hatati1km^2) +
I(r_irradiation^2),family=binomial(link="logit"),data=envdata)
fit
fit<-step(fit)
summary(fit)
#モデルの評価(AUC、閾値、ROC曲線、予測値の分布比較)
e<-evaluate(p=envdata[envdata$pa==1,],a=envdata[envdata$pa==0,],fit,type="response")
e
threshold(e)
plot(e,"ROC")
density(e)
boxplot(e,col=c("blue","red"))
#モデルにより生息適地を計算、表示、データ書き出し
pg<-predict(predictors,fit,type='response')
plot(pg)
plot(plan,add=T)
points(kappa,col='red',pch='+')
tr<-threshold(e,'kappa')
plot(pg>tr)
writeRaster(pg, filename="mydata/カッパ生息確率.tif", format="GTiff", overwrite=TRUE)
- 76. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
応答曲線の作成説明変数の変化が生息適地にどのような影響を及ぼす
かを示す応答曲線を作成してみます。
※詳しくは説明しません。
76
#glm応答曲線用関数
predictvals <- function(model,xvar,data,...){
f <- sapply(data, is.factor)
notf <- !f
m <- matrix(nrow=1, ncol=ncol(data))
if (sum(notf) > 0) m[notf] <- as.numeric(apply(subset(data[,notf,drop=FALSE],pa==1), 2, mean))
if (sum(f) > 0 ) m[f] <- as.numeric(apply(subset(data[,f,drop=FALSE],pa==1), 2, modal))
m <- matrix(m, nrow=nrow(data), ncol=length(m), byrow=TRUE)
colnames(m) <- names(data)
m<-data.frame(m)
m[f]<-sapply(m[,f,drop=FALSE],factor)
v<-data[,xvar]
if (!is.factor(v)) {
xrange<-range(v)
m[,xvar]<-seq(xrange[1],xrange[2],length.out=nrow(data))
}else{
m[,xvar]<-v
}
m['pa']<-predict(model,m,type='response')
m
}
#応答曲線
for(i in 1:3){
xval<-c("r_kasen_distance","r_hatati1km","r_irradiation")
xlabel<-c("川からの距離","1km圏畑地面積","日射量")
rn<-range(envdata[,xval[i]])
xpos<-(rn[1]+rn[2])/2
gml_predicted <-predictvals(fit,xval[i],envdata)
res<-ggplot(envdata,aes_string(x=xval[i],y="pa")) + geom_line(data=gml_predicted,color="red") +
xlab(xlabel[i])+ylab("生息適地確率") + geom_line(y=tr,color="blue",size=1,linetype="dashed") +
annotate("text",x=xpos,y=0.07,label="生息適地閾値(Cohhen's Kappa)")
ggsave(paste("mydata/",xlabel[i],"応答曲線",".png",sep=''),res, width = 16, height =16,unit="cm",dpi=300)
}
- 77. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
ggplot2で地図作成ggplot2で生息適地マップを作成してみます
※詳しくは説明しません。
77
#ggplot2で生息適地マップ作成
windowsFonts(Meiryo=windowsFont("メイリオ"))
en<-crop(pg,extent(546620,551600,4354300,4358100))
hs<-crop(shade,extent(546620,551600,4354300,4358100))
hdf <- rasterToPoints(hs)
hdf <- data.frame(hdf)
colnames(hdf) <- c("X","Y","Hill")
edf <- rasterToPoints(en)
edf <- data.frame(edf)
colnames(edf) <- c("X","Y","Environment")
adf<-fortify(plan)
colnames(adf)[1:2] <- c("X","Y")
sdf<-data.frame(kappa@coords)
colnames(sdf)[1:2] <- c("X","Y")
g<-ggplot(NULL, aes(X, Y)) +
theme_grey(base_size=13,base_family="Meiryo")+
geom_raster(data = edf, aes(fill = Environment)) +
geom_raster(data = hdf, aes(alpha = Hill)) +
scale_alpha(range = c(0.5, 0), guide = "none") +
scale_x_continuous(breaks=NULL,limits=c(546620,551600),expand=c(0,0)) +
scale_y_continuous(breaks=NULL,limits=c(4354300,4358100),expand=c(0,0)) +
geom_path(data= adf,aes(group=group),colour = "#333333", size = 0.5) +
geom_point(data=sdf,aes(x=X,y=Y,colour="black"),size=1.5,alpha=0.8) +
scale_colour_manual(guide=guide_legend(title=NULL),name = '確認地点', values = 'black', labels = '確認地点') +
coord_equal() +
theme(legend.position=c(1,1),legend.justification=c(1,1),axis.title.x=element_blank(),axis.title.y=element_blank())
g<-g+scale_fill_gradientn(name="生息適地",colours = c("white","green","yellow","orange","red"))
ggsave("mydata/カッパ生息適地マップ.png", g, width = 16, height = 16,unit="cm",dpi=300)
plot(g)
- 78. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
地図データを扱うための
Rの習得法
Rで地図データを分析出力するには「統計」「コマン
ド」「グラフィックス」の知識が必要です。そこで地図
データを扱うためにRをどうやったら習得できるのかを
紹介します。
78
本を見る(Rは情報が多い)
とにかくコマンドを打って試行錯誤する
キーワードでググる (Rは情報が多い)
「統計」はあきらめて勉強する
生息適地推定については↓のPDFがお薦め
- 79. 2014/10/31 FOSS4G Tokyo 2014 ハンズオン
お疲れ様でした。
上手くいったのは皆様のおかげ。
失敗したのは、妖怪のせい。
79
e-mail: mizutani.takayuki+handson@gmail.com
twitter: @tmizu23