GRASS Seeds

B : 情報の操作・抽出


はじめに

GISには,データの保存および管理の機能があります.この機能を用いると,あるテーマの地図レイヤーに関するデータの要約や簡略な統計を出すことができます.このセッションでは,これまでに扱ってきたいくつかの地図レイヤーに関する情報の要約や統計を出すという作業を行います.

このセッションはいくつかの短いエクササイズからなっています.これらのエクササイズのどれから始め,そしてどれを最後とするかはあなたの判断に委ねられます.しかし,なるべく簡単なエクササイズからスタートし,そこで操作技術をある程度身につけてから次のワンランク上のエクササイズに進むのが望ましいでしょう.

また,これまでのレッスンを通じてそろそろGRASSの動作環境や対話(インタラクティブ)形式に慣れてきた頃でしょうから,この章ではディスカッションや説明の内容の量を以前のセッションAよりも減らすことにします(セッション修了予定時間: 約2時間).


GRASSをスタート

前回のトレーニング・セッションに引き続き作業を行う人は,このページを省略し下さい.そうでない場合は,まずGRASSを開いてこれから使用するデータセットの種類を指示します.

GRASSをスタート(grass4.2と入力)してして下さい.以下のような画面が現われると思います.

Display 1 これはGRASSの通常のオープニング画面です.しかし,ロケーション・マップセット・データベースは各々の機種によって異なります.

ここでこれから使用するデータセットを指示します.この最初の画面では,ロケーション,マップセット,データベースのそれぞれの項目に必要な情報を入力して下さい.直前に使用した情報を表示するため変更する必要がない場合が多いです.その場合は<Esc>キーを押してください.

ロケーションは,研究地域の地理的範囲を入力します.このエクササイズではイングランド地方のLeicestershire州の一部のデータを扱います.まず,始めにカーソルがLOCATIONの所になるまでリターンキーを数回押して下さい(最初からある場合は不要です).そして研究地域を指定するために,leicsと入力して下さい.もし範囲を超えた文字数を打ち込んでしまった場合は,スペースバーを押して余った文字を消去すれ大丈夫です.

次に,リターンキーを押してカーソルをMAPSETの項目まで移動させて下さい.ここで覚えておいてほしいのは,GRASSにおけるマップセットとは,現在指定しているLOCATIONの中のユーザー自身のファイル(ディレクトリ)です.従って,ここではあなたのユーザー名を入力して下さい.今後,あなたが作成したファイルを他人が気軽に手を加えることは一切禁じられることとなります.

DATABASEは,leicsのデータを解凍したディレクトリーを指定してください.

全て正しくセットしたら,<Esc>キーを押してスタートして下さい.

GRASSの中のグラフィックを使用する場合は,少なくとも一つのグラフィックウィンドウを開かなければなりません.従って,始める前に,次のように入力して下さい.

Command : d.mon start=x0 select=x0


目標:

このトレーニングセッションでは,GRASSで利用可能な様々な処理によるデータの抽出を学習することによって,特定のテーマの地図レイヤーに関する要約,または統計的な情報を得ることを目的とします.

目的:セッションを完了すると,以下の技術が習得できます.:-

Display 2 これから利用するコマンド一覧


Exercise 1: 森林地帯,牧草地,雑木林などの平均高度を算出する

このエクササイズでは,GRASSコマンドr.averageを使って,地図レイヤーから統計的データを引き出すという作業を行います.ただし,r.averageを操作するには2つのラスター地図レイヤーが必要となります.ベースファイル(base file)には平均値を求める場所のカテゴリーが,そして2つ目のバリューファイル(values file)には平均したい統計データが,それぞれ含まれています.例えば,「市街地/非市街地」というカテゴリーのファイル(urban)と,「人口」のデータが入っているファイル(population)の2つがあったとします.この場合,例えば,都心部の人口の平均値を計算しようとするならば,市街地(urban)のベースファイルと人口(population)のバリューファイルの2つをセットで使用するということになります.

このエクササイズでは,topo地図レイヤーに含まれる標高に関するデータから統計量を引き出すという作業を行います.統計量を出したいと思っている区分は,landcovマップレイヤーの中の土地利用区分に関してです.

まず,r.reportコマンドを使って, landcov地図レイヤーに入っている土地利用のカテゴリーを確認して下さい.そして各カテゴリーに関する情報を求め,下の一覧表の中に記入して下さい.

次に,各土地利用カテゴリーの平均高度を算出して下さい.

Command : r.average base=landcov cover=topo output=avheight

平均高度値を含む地図レイヤーを表示して下さい.

Command : d.rast avheight

Discussion この画像はlandcov地図レイヤーに似ているように思われるかもしれませんが,この場合は別の色が使われています.

それぞれの色が何を示しているか,わかりますか?

さて,ラスター地図レイヤーのカテゴリー値を表示するにはr.reportコマンドを使うということはすでに学びましたが,ここではまた別の方法で試してみましょう.

Command : d.what.rast avheight

Responses : マウスをイメージの上に動かし,左ボタンをクリックすると,次のような2行があらわれると思います.

445175(E) 317675(N)

avheight in username (2) 76.300663

Discussion このうち上の行は先ほどクリックしたポイントのラスター地図上の地理座標を示しています.下の行の括弧内の数字はカテゴリー値(この場合は土地利用のタイプ)を表わし,その後に続く数字はカテゴリーレベル(この場合は平均高度)を表わしています.

また,一度に幾つもの地図レイヤーについて検索することが出来ます.ここではavheightとlandcovの両方を同時に用いて行います.

Command : d.what.rast landcov,avheight

ディスプレイ4の関連項目の結果を表示した8つの色をすべて確認して下さい.確認し終えたらマウスの右ボタンをクリックして下さい.

Discussion 

あなたの出した結果が,0.01の単位まで上記のものと同じであることを確認して下さい.この表は,メートル法で表わされた,landcovファイルに含まれる8つの土地利用カテゴリーの平均高度を表したものです.

これらの値はそれぞれ適切な数値であると思いますか? この結果から,海抜高度が気候や植生におよぼす影響は何だと思われますか? また,それとほぼ同等と思われる別の要因についても考えてみて下さい.


Exercise 2:耕地や産業地帯を流れる川の全長距離を計算する

研究対象地域における河川の汚染問題を調べる調査団の一員になったと仮定してみて下さい.この場合,汚水源は主に産業廃棄物や,耕地から流れ出る農薬などの化学物質が可能性として考えられます.まず,この問題に関する最初の見積りを行うにあたっては,耕地や産業地帯を流れる川の距離を調べておくと,よい手がかりになるでしょう.

この処理は次の3段階,

    1. 対象地域の土地利用のタイプを出す,
    2. 耕地や産業地帯を流れる川を探し出す,
    3. その川の流れる距離を計算する,

から構成されています.

さて,次のステップはラスター地図レイヤーの土地利用のタイプを再分類し(reclass),耕地と産業地帯のみが対象となるようにします.

Command : r.reclass

Responses : Enter name of the layer to be reclassified

> landcov

Enter name of the NEW RECLASSIFIED map

> arabl_ind

Please indicate how you would like the reclass table initialized

> 0     (すべての値をゼロにする)

<Esc>    (Escキーを打つ)

カーソルをIndustryの行におくと,古いカテゴリーの名称と数値の表が表示されます.1と入力し,カーソルがarableの行に来るまで<Return>リターンキーを数回押して下さい.そして最後に再び1と入力し,<Esc>キーを押して下さい.

次は,新しい地図レイヤーにタイトルとカテゴリーの説明を与える必要があります.以下のように記入して下さい.(前のテキストの上に新しいテキストを重ねて入力することも出来ます.):

[arabl_ind]

ENTER NEW CATEGORY NAMES FOR THESE ENTRIES

TITLE : Arable and Industrial Landuse______

CAT  NEW CATEGORY NAME

0 Background________________________________

1 Industrial/Arable________________________

<Esc>

r.reclassについて一言注意しておきます.先程地図レイヤーを再分類したことによって,オリジナル・レイヤーのカテゴリー値が変化しました.しかし,この作業においてGRASSは完全な新しい地図レイヤーを作成したのではなく,単にオリジナルとは違った内容の別な‘再分類’ファイルを作成しただけです.そのため,オリジナル・ラスター地図レイヤーを消去すれば,再分類されたマップもそれに伴って消去されてしまいます.

先程の再分類の作業がうまくいったかどうか確かめるために,d.rastを使って新しいファイルarabl_indを表示してみましょう.また,河川や貯水池の分布状態を扱うレイヤーwaterに対しても同じ作業を行って下さい.

次のステップでは,耕地や産業地帯を流れる河川を探し出すという作業を行います.

Command : r.mapcalc

Responses : mapcalc> polrivers = arabl_ind * water

<Enter> (Enterキーを打つ)

Discussion r.mapcalcは,ラスター地図レイヤーをmap algebra(地図代数)という概念で操作する機能です.つまり,地図レイヤーを数学の方程式における変数として扱います.これらは上の例のように非常にシンプルになりますし,また,様々な数学の機能や操作方法を駆使すればより精緻なものになることも出来るのです.地図代数法という方法は,空間情報を扱うには非常に有能かつ柔軟な方法なのです.

以上の例では,ラスター地図レイヤーarabl_indの各セルに,地図レイヤーwaterにおける同じ位置のセルの値を‘掛け合わせる’という計算が行われました.その結果でき上がった地図には,両方の地図レイヤーにおいて非ゼロ値のエリアのみが示されています.

では,なぜそのようになるか少し考えてみましょう.値が0または1のセルのみの二つのレイヤーを掛け合わせる場合,両方のレイヤーにおいて値が1のセルのみが,値1のセルとして出力ファイルに記録されるのです.

1 x 1 = 1 the cell is `retained'

1 x 0 = 0 the cell is `rejected'

0 x 1 = 0 the cell is `rejected'

0 x 0 = 0 the cell is `rejected'

これは,Boolean(ブール)オーバーレイの論理による方式(論理AND操作)です.

さて,次は汚染区域と考えられるエリアを流れる河川の長さを計ります.しかし,直接にその長さを計らなくても,r.reportコマンドを使えば,おおまかな距離を知ることが出来ます.

Command : r.report polrivers units=cell

Discussion polriversマップの中のセルの数が表示されると思います.各区域における河川の大体の長さは,この数に50を掛けたものです.(各セルの寸法は縦横50mであることを思い出して下さい)

この計算からどのような結果が出ましたか?

その結果より良い答えがあると思いますか?

この数値は実際の長さを上回ると思いますか,それとも下回ると思いますか?

河川のようなライン状の形態を計測するには,d.measureコマンドを使うとよいでしょう.このコマンドを使うと,動作中のグラフィック・ディスプレイ上の線図形の寸法を計測することが出来ます.しかし,polriver地図レイヤーに表示された全ての地区における河川の長さをすべて計算するのはたいへん時間がかかるため,1つの地区のみを取り上げることにします.まずは,d.rastを使ってsegment地図レイヤーを表示してみましょう.

Command : d.rast segment

Command : d.measure

Responses : Buttons:

Left: Where am i

Middle: Set FIRST vertex

Right: quit this

マウスを河川のスタートラインに置き,中央のマウスボタンをクリックして下さい.

Responses : Buttons:

Left: Where am i

Middle: set NEXT vertex

Right: FINISH

中央のマウスボタンを押しながら川のラインをなぞり,最後まで来たら右ボタンをクリックします.

Responses : Buttons:

Left: DO ANOTHER

Middle:

Right: quit this

最後に,もう一度右ボタンをクリックし,今計測したラインの長さを表示して下さい.次は,segment地区での河川の長さを測りますが,この際はイメージを別のサイズにし,d.zoomコマンドで画像にズーム・インしてみましょう.

Command : d.zoom

Responses : Buttons:

Left: Establish a corner

Middle: Check coordinates

Right: Accept

マウスをイメージの左端に置き,左下の角を半分くらい上げたらマウスの左ボタンをクリックして下さい.次は,イメージの上端もおなじように,マウスを動かしながらサイズを半分にします.ボックスが元のイメージの左上の4分の1のサイズになったら,マウスの右ボタンをクリックして下さい.

次に,イメージの左端に赤いボックスが表示されたら,YESオプションをクリックして新しい領域を承認します.次は,さきほどズーム・インした場所のためにd.eraseコマンドを入力する必要があります.

Command : d.erase

次は,d.rastsegmentイメージを再現します.この時,表示が前より拡大されているため,イメージの構成要素であるラスターセルの粒子が粗く映ると思います.

d.measureを再び使って河川の一部の長さを測り,その結果を記述して下さい.

d.zoomを使ってさらにズーム・インし,河川をボックスからはみ出さない程度に出来るだけ大きく表示して下さい.d.erased.rastを使って河川の部分を表示し,そしてd.measureを使って河川のラインの長さを計測し,その結果を記述して下さい.

r.reportを使って,polriversにおける河川を全て計測してみましょう.そしてこれをd.measureで計測した3つの区域の長さと比較してみましょう.

d.measureから得たそれぞれの区域に置ける河川の長さは,なぜこのように互いに異なっているのでしょうか?

segmentマップにおいて,「正しい」とされる河川の長さがあると思いますか?

最後に,データ表示をリセットし,イメージを最初の大きさに戻して下さい(この操作に関してはセクションCでより詳しく説明します).

Command : g.region -d

Command : d.erase


Exercise 3:化学薬品の流出により汚染の起こりうる危険区域の人口を計算する

GISは本来非常に強力な意思決定サポートシステムを特徴としていますが,中でもとりわけ優れた能力として,ある出来事が起こった状況を仮想してモデル化するという機能があります.このようなシステムや技術は,すでにいくつかの国で災害対策や住民の避難に役立つよう,研究に取り入れられています.

このレッスンで使われるデータでは限界があるため,ここではごく単純な例を紹介する程度しかできません.それでもこの機能の基本的な原理を説明するには役に立ちます.

危険な化学物質を積んだ貨物車が対象地域を通るとします.もし,この貨物車がなんらかの事故を起こし,爆発した化学物質が気体となって拡散したとすれば,それは当然ながらその地域社会にとって非常に危険な事態となるため,事故現場から1000m以内に住む住民はただちに避難をしなければいけません.貨物車の輸送路に関しては,鉄道か自動車道M1か選択することができます.ただ,いずれのルートの場合も輸送路の選定をするにあたって,事故発生後に被害を受けると考えられる範囲内に住む住民の人口を判断の基準にする必要があります.さて,これからGRASSを使ってこの答えを出してみましょう.

ここで,そもそも問題となるのは,まず1つは鉄道あるいは自動車道M1から各々1000m以内の地区に住む住民の人口ですが,この問題に取り組むには2つのステップをふまえなければいけません.そのステップとは,第1にこれら2つの輸送路からそれぞれ1000m以内の区域を表示する2つの地図レイヤーを新たに作成しなければなりません.次に,popln地図レイヤーからこれら2つの区域の人口の総計を出すという作業をします.


Step 1

まず最初に,鉄道および自動車道M1から1000m以内のエリアの地図をそれぞれ表示します.これにはコマンドr.bufferを使いますが,このコマンドの作成するファイルには,入力されたファイルの非ゼロのセルからその他の各セルまでの距離をユークリッド幾何学的に(もしくは直線的に)表わしたものバッファーゾーンが入っています.

Command : r.buffer rail distances=1000 output=railbuf_temp

次は自動車道M1についても同じ操作をします.したがって,次のステップはこの自動車道をroads地図レイヤーから探すことです.

Command : r.reclass

Responses : Enter name of the layer to be reclassified

> roads

Enter name of the NEW RECLASSIFIED map

> mway

  :

マップを再分類する操作に関しては,これまでにある程度慣れているはずです.操作の後,値1の自動車道(motorway)を除いたすべてのカテゴリー値が0になっていることを確認して下さい.マップレイヤーに適当なタイトルを付けてください.

次は,自動車道周辺のバッファーゾーンを求めます.

Command : r.buffer mway distances=1000 output=mwaybuf_temp

新しい地図レイヤーrailbuf_tempmwaybuf_tempを表示し,間違いがないかどうかチェックしてみましょう.

Discussion  GISでは,地理的対象物の周囲に対象物の影響がそれ自身の境界を拡張しておよぶ周囲であるバッファーゾーンを設定するという作業はごく一般的です.したがって,この2つの地図レイヤーでは両方とも,対象とバッファーゾーンとを区別しています.しかし,このエクササイズでは,特にこれらを区別する必要はありません.

Command : r.reclass

Responses : Enter name of the layer to be reclassified

> mwaybuf_temp

Enter name of the NEW RECLASSIFIED map

> mwaybuf

<Esc>    (Escキーを打つ)

カテゴリーは以下を除いて全てゼロ(0).

CATEGORY LABEL      OLD VAL    NEW VAL

distances from these loc  1       0

1000m            2       1

<Esc>    (Escキーを打つ)

TITLE :   M1 Motorway Buffer

0      background

1      1000m_around_M1

<Esc>    (Escキーを打つ)

railbuf_tempについても同じ作業をし,新しい地図レイヤーrailbufを作りましょう.

バッファーゾーンの内側に住む住民の人口を計算する前に,2つのエリアを1つのファイルにまとめておくと作業はいくらか簡単になります.これは必ずしも必要というわけではありませんが,最も効率的な方法と考えられるからです.

Command : r.mapcalc

Responses : mapcalc> buffers = mwaybuf + railbuf

<Enter> (Enterキーを打つ)

buffers地図レイヤーを表示して,次の操作に移る前に期待どおりの結果が得られたかどうか確かめてみましょう.

以上の作業で,これよりバッファーゾーンの人口を計算するための準備が整いました.

Command : r.mapcalc

Responses : mapcalc> at_risk = buffers * popln

<Enter> (Enterキーを打つ)

それぞれの輸送経路周辺の事故により被害が予想される危険地域の人口`at_risk'をビジュアル化するために,出来上がった地図レイヤーを画面に表示てみて下さい.

最後に,それぞれグループの`at_risk'の人口を定量的に比較して下さい.

Command : r.report at_risk units=cell

このデータのみを参考とした結果,どちらの輸送ルートが危険な化学物質を運搬するのによいと思われますか?

rail地図レイヤーを再び表示して下さい.このレイヤーの中でまだ気にかかる要素はありませんか?


Step 2

コストの関係で,自動車道を使ったルートが決定されたと仮定してください.そして,不幸なことに,化学物質を積んだ貨物自動車は衝突事故に巻き込まれ,化学物質はこぼれて火災になったとします.

ここで化学物質の有毒煙による大気汚染の危険がおよぶ範囲内の住民人口を見積り,衝突現場から1000m以内の住民を別の場所に避難させる必要があります.

ラスター地図crashは衝突現場を示しています.r.bufferコマンドをつかって,事故現場から1000mのバッファーゾーンを作成してみて下さい.

Command : r.buffer crash distances=1000 output=crashbuf

次に,r.maskコマンドを使って,データベースの質問対象をこのバッファーゾーンのみに限定してみましょう.

Command : r.mask

Responses : Options:

1 Remove the current mask

2 Identify a new mask

RETURN Exit program

2

Enter name of data layer to be used for mask

> crashbuf

r.reclassコマンドを使った時と似た形式が表示されます.カテゴリー1および2 (distances calculated from these locationsと1000 metersそれぞれに)の後ろ「1」と入力して下さい.

<Esc>

<Enter><Enter>

Discussion r.maskコマンドはMASKと呼ばれる特殊なラスター地図レイヤーを作成します.この地図レイヤーは現在焦点となっている地域以外のエリアを「隠す"hiding"」ことで,余分な要素をすべてシャットアウトするレイヤーです.この場合,衝突現場から1000mを超える地域は必要ではありません.これらの地域はMASKレイヤーにおいては値ゼロとされ,隠されます.一方,1000m以内の地域の値は1となります.d.rastを使い他の地図レイヤーを表示するとこれを見ることができます(例;landcovを表示してみましょう.) .

以上でMASKレイヤーの作成が完了したので,次はr.reportを使って避難させる必要のある住民の人口を調べてみましょう.

Command : r.report popln units=cell

以上の操作は,事故現場周辺の住民を非難させるために行なわれした.しかし,有毒煙による大気汚染が南西からの強い風によって北東へとひろがるとします.大気汚染の拡大は避難しなかった地域に影響することが明らかになる次の日までわからなかった.大気汚染の拡大はspillage地図レイヤーで見ることが出来ます(全てのイメージが表示出来るようにMASKを解除しなければなりません).

Command : g.remove rast=MASK

Command : d.rast spillage

大気汚染は値が5単位以上の有毒煙の被害を受けた人々に影響し,従って,それらの人々のために健康診断をする必要があります.そこで,まずは汚染による被害人口を調べます.この作業はr.maskコマンドを使って行なうことができます.

Command : r.mask

maskに対して用いるデータレイヤーとしてspillageを入力することと,カテゴリー5以上に1を入力することを除いて,あとは全て以前と同じ操作を繰り返して下さい.

Command : r.report popln units=cell

これで大気汚染による危険地帯にいる人口のセル数がわかりますが,この場合非難された地区のセルは含まれていません.これを計算に入れるために,まず第1に,crashbufに対しコマンドr.reclassを使い,カテゴリー12の両方を1にし,新しいラスターcrashbuf_tempとして再分類します.そのあと,r.mapcalcを使ってこのエリアをMASKから除外します.

Command : r.mapcalc

Responses : mapcalc> MASK = MASK - crashbuf_temp

MASK - already exists. ok to overwrite ?(Y/N) y

これでMASKから人々が避難したセルを除外することが出来ました.

ほかのラスター地図レイヤーとまったく同様にMASKの計算はr.mapcalcを使い,またそれを消去する場合,g.removeを使うということを覚えておいて下さい.

最後に,化学物質の拡散により健康診断をする必要のある住民の人数を調べます.r.reportを使って被害区域のセル数を出したあと,この数に5.4(各セルの平均人口)をかけて計算して下さい.

Command : r.report popln units=cell


強化エクササイズ

(1) 研究地域の中で自動車路M1に沿って,最も高い高度(標高)の値を求めて下さい.

ヒント:この答えを出すには,r.mapcalcを使って結果を出し,r.reportを使ってそれを表示します.

(2) エクササイズ2をもう一度考えてみると,すべての河川及び貯水池から例えば250m以内の耕作地と産業地帯を調べておくほうがより適切であると考えることもできます.

GRASSでは,様々な方法によって情報を得ることが出来ます.すでに使い慣れたコマンドのみを使って結果を引き出すことも出来ます.今回学んだ操作方法によって,以前のような河川の長さを計る作業の面倒さは解決されたでしょうか?


整理

この章で作成したラスター地図レイヤーは,次は使いません.もし望むなら,これらの地図レイヤーをすべて消去することによってディスクの空きを確保することができますが,この作業は十分慎重に行って下さい.まず最初にg.listコマンドを入力し,現在ディスクに保管されている地図レイヤーを全て再確認して下さい.ここで覚えておいてほしいのは,今行っている作業はPERMANENTマップセットのファイルではなく,自分自身のマップセットで作成したファイルを消去するということです.

GRASSを終了するためには,まずこのセッションの間に開いたウインドウを全て閉じなければいけません.

Command : d.mon stop=x0

最後に,GRASSを終了して下さい.

Command : exit

Responses : Shall the mapset <username> be saved? y/n [y]

      <Enter> (もし,ファイルを保存する必要のない場合はn

      Do you wish to selectively remove data files? y/n [n]

      <Enter> (もし,消したいファイルがある場合はy

      (ここでyを選択した場合は次のようになる)

      Please select type of file to be removed.

        1. Raster file

       : (省略)

      (ファイルタイプの番号を入れ,ファイル名を指示する)

      GOOD BYE from GRASS !


戻る