FOSS4GとOSMを使って 「逃げ地図」のようなものをつくってみる!

Preview:

DESCRIPTION

QGIS、GRASS、OpenStreetMapを使って,逃げ地図のようなものをつくるためのマニュアル(仮)(ってか,手抜き)

Citation preview

OSGeo.JP: wata909

表示 2.1 日本 (CC BY 2.1)

http://creativecommons.org/licenses/by/2.1/jp/

0 はじめに。

この文章は,FOSS4G Advent Calendar 2012のネタで御座います。HTMLで書くのがめんどくさいの

で,pdf のになってます。ごめんなさい(汗 あと,内容についてのご質問は大歓迎ですが,正確さにつ

いては,保証しかねます。あしからず,ご了承下さい。

あと,このマニュアル,今のところ未完成でQGISやGRASSを使い慣れてる人向けに可成り説明を省

略しています(主に時間が間に合わなさそうなため)。時間ができたら細かく追記する予定ですが,誰か

修正してくれたり,追記してくれたりするのも大歓迎です。ライセンスはクリエイティブコモンズの「表示

2.1 日本」ですので,ご自由にご利用下さい m(__)m

なお本チュートリアルでは道路データとして,OpenStreetMap1を,福祉施設および行政界として国土

数値情報2を使用した。

1 「逃げ地図」って?

日建設計さまのボランティア部が考えられた,津波が起きたときに何処まで逃げればいいか,どれくら

いの時間がかかるのか,それを地図化したものです。そして,ワークショップでこの地図を作り,これから

の街作りを考える資料とする活動です。詳しくは下のサイトを見てください。

http://www.nigechizuproject.com/

この逃げ地図は主に防災目的でつくられましたが,「逃げる」だけでなく,例えば公共機関へのアクセ

スなど,広い意味での街作りを評価するための資料としても使えるものです。そして,このような地図を手

作業で作るのは,自分の住んでいる街の実情を知り,それを材料として論議することはとても重要です。

ただ一方で,この地図をつくるのはそれなりに手間がかかるので,何度も作るのはちょっと大変です。

一方で,こういう分析は GIS の得意分野です。なので,GIS を使うとどんな風に逃げ地図ができるか。そ

れを説明してみたいと思います。ここでは,つくば市を例として,「福祉施設までのアクセスマップを作る」

ということにチャレンジしてみたいと思います。

(まぁ,手作業で作るとの GISで作るのと,どっちが手間かという話もありますが(;´Д`))

2 作業を始める前に

GIS で作業をするといっても,GIS のソフトの中に「逃げ地図を作る」というボタンがあるわけではありま

せん。ということは,いろいろな作業を組み合わせてやる必要があります。

つーことで,とてもおおざっぱにいうと,GISの分析は以下の様な流れで行われます。

・分析の流れを決める

・データの下準備

・分析の実施および図化

という感じになります。ここでかかった時間をまとめると,実は

・分析の流れを決める :50%

1 http://www.openstreetmap.org/ 2 http://nlftp.mlit.go.jp/ksj/

・データの下準備 :30%

・分析の実施および図化 :20%

となって,実際の分析にはそんなに時間がかかりません。事前の準備がやっぱり重要です。あと,一

応こんな風に分けて書きましたが,実際は

1 大まかな流れを決める

2 データの下準備をする

3 頭の中で考えた分析方法で実施する

4 データが足りなくて,またダウンロードする

5 1に戻る(ここまでを何度か繰り返す)

6 分析のパラメータを調整する(何度か繰り返す)

7 できあがり!!

となっていて,きれいに分かれているわけではありませんし,トライ&エラーでやり方を探すことになり

ます。なので,実際にどうやっているかを説明するのと,実際に作業をしているときとは,結構中身が違っ

ています。そのあたりをちょっと頭に置いて,あとの説明をお聞きください。

3 では,実際に作業するよ!

3.1 まず,分析の流れを決めよう!

まずは分析の流れを決めます。

はじめに,必要なデータを考えてみます。今回の場合,「福祉施設へのアクセスマップ」ですから,福

祉施設のデータと,道路のデータが必要になります。また,分析対象をつくば市としているので,つくば

市の境界データも必要になります。ここでは,福祉施設とつくば市のデータは,国土数値情報から,道

路のデータは OpenStreetMapを利用することにしました。

次に,逃げ地図を作る場合,道路に沿った距離を分析する必要があります。こういった分析を行う

ツールとして,GRASSの r.cost というモジュールがあります。なので,このツールを使うことにします。

ただし,ここでちょっと問題があります。GRASS で距離の分析をするためには投影座標系である必要

がありますが,今回取得するデータは地理座標系です。なので,GRASS で分析するためには,地理座

標系を投影座標系に変換する必要があります。また,上でもいったようにデータをつくば市に絞ることも

必要になります。

以上の流れをまとめると,分析の流れは以下の様になります。

1. データのダウンロード

2. つくば市域のデータの切り出しと座標変換

3. r.costによる分析の実施(と,そこに至るための下準備)

(ア) データのインポート

(イ) 福祉施設から最も近い道路の座標特定

(ウ) 福祉施設および道路のバッファーの生成

(エ) 上記バッファーのラスター化

(オ) r.costの実施

(カ) 逃げ地図にあわせた色の指定

となります。

作業環境はWindows7 64bit, QGIS (NextGIS版),GRASS6.4.2になります。

QGIS (NextGIS版):http://nextgis.ru/en/nextgis-qgis/

GRASS6.4.2-2:http://grass.osgeo.org/grass64/binary/mswindows/native/

以降,具体的に説明したいと思います。

3.2 データのダウンロードだ!

まずは,OpenStreetMap(OSM)で道路データをダウンロードします。ここではCloud.meから shpを落と

して使用しました。以下のアドレスから,ibaraki.shapefiles.zipをダウンロードして下さい。

http://downloads.cloudmade.com/asia/eastern_asia/japan/ibaraki#downloads_breadcrumbs

ダウンロードしたファイルは,適宜解凍して下さい。この際,解凍先のフォルダー名やパスに日本語

や空白を含めない様にしてください。今回の処理では問題が出ないかもしれませんが,欧米圏,すなわ

ち1バイト文字を主に利用している欧米圏で開発された FOSS4Gの場合,ファイルを開いたり,保存した

りする際に日本語(をはじめとする 2バイト文字や空白)が含まれる場合,エラーが出る場合があります。

実際に,なにがしかの問題にぶち当たったときに,原因がどこかを考えなければいけないのですが,

その時に上記のようにフォルダーやパスに日本語等が含まれていると、そこが原因になる可能性があり

ます。なので,できるだけそれらは含めない方がいいでしょう。

つぎに,国土数値情報ダウンロードサービス(http://nlftp.mlit.go.jp/ksj/index.html)から,行政界と福

祉施設のデータをダウンロードします。福祉施設は,

http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P14.html

行政界は,http://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-N03.html からダウンロード出来ます。

ここからダウンロードするデータ,以前は独自フォーマットで,QGIS 等で使うためには shp 形式に変

換しなくてはいけなかったのですが, 最近は shpファイルの変換したモノをダウンロード出来ます。便利

なのはよいのですが,河川流路データとか,流域界データとか,shp 形式特有のエラーが出る場合も多

いので,ちょいと面倒くさいこともあります。ダウンロードしたファイルはOSMの zipファイルと同様に解凍

して下さい。同じフォルダに入れておいた方が便利かと思われます。

3.3 データの切り出し

さて,3.2 でダウンロードしたデータは,茨城県全域が対象となっています。なので,今回の分

析対象であるつくば市だけを切り取った方が便利です。また,今回ダウンロードしたデータは

データの単位が緯度経度(ようするに度,分,秒)の地理座標系のデータですが,逃げ地図のよう

に距離を測りたい場合には,投影座標系(単位がメートル)に変換する必要があります。ということ

でここでは,OSM の道路データと,国土数値情報の福祉施設データを,つくば市だけ切り抜きま

す。

まず,OSM の道路(ibaraki_hiway.shp),国土数値情報の福祉施設データ(P14_08)および行

政界(N03-12_08_120401.shp)をQGISで開きます。なお,開く時の文字コードは,国土数値情報

は SJIS,OSMは UTF-8ですので,ご注意下さい。

そして,行政下の中からつくば市を「選択」します。表示すると以下のような感じ。

つぎに,【ベクタ,調査ツール,場所による選択】の順で選択して下さい。

すると,下の様な「場所による選択」のウィンドが表示されます。

この「場所による選択」ツールは,あるレイヤーの中から(ここでは道路や福祉施設)の中で,あ

るレイヤーと重なり合っているモノ(ここでは市町村界のつくば市)を選択する,という機能を持っ

ています。レイヤー全体に対して処理することも可能ですし,今回の例のようにレイヤーの中の 1

つのオブジェクト(例えば,つくば市,など)に限定して処理を行う事も可能です。

日本語訳がちょっとわかりにくいのですが,上の「中の地物を選択する」が選択する対象(道路

や福祉施設)で,下の「交差する地物が中にある」が選択範囲として使うレイヤー(ここでが行政

界)です。「選択された地物のみを使う」を選択すると,たとえばここの例のように福祉施設データ

を選ぶときに,行政界のなかで選択したつくば市のデータだけを利用することができます。設定

が完了したら OK を押します。すると,以下のような感じになります。上手く行けば,点も選択され

て黄色になると思います。

そうしたら,レイヤーの上で右クリックして,「選択を名前を付けて保存…」を選んで下さい。

すると,下の様な「ベクタレイヤに名前をつけて保存する…」が表示されます。

ここで上から,

形式:ESRI Shapefile

名前をつけて保存:保存場所を適宜選択。ここでもパスとかフォルダ,ファイル名に日本語は

使わないで下さい。私は point_utm54.shp としました。

エンコーディング:UTF-8をお勧めします。

CRS:CRSは座標参照系の略のことです。ここでは JGD2000 UTM54を使用します。ブラウズを

クリックして下の様な画面が出てきたらフィルタに「3100」と入力すると「JGD2000 / UTM

Zone 54N」というのが表示されるので,それを選択して OKをクリックして下さい。

他の地域の UTM ゾーンと EPSG コードを知りたい場合,gisbox さんに pdfで早見表が

御座います。そちらをご参考に

https://sites.google.com/site/gistoolboxes/

以上がすんだら OKを押します。下の様に表示されたら OKです。

つづけて,道路のデータからも同様につくば市内の道路を選択し,名前をつけて保存して下さ

い。

保存が終了したら,選択したファイルだけを表示してみます。一度 QGIS を終了し,新しく起動

し直して,選択したファイルだけを表示してみて下さい。

上図のように,最初に比べてちょっと縦長に表示されていたらOKです。これで,使用するデー

タの準備はできました。これからが本番の草刈りです(個人的に,GRASS を使って四苦八苦する

ことを,草刈りと呼んでいます)。

3.4 r.costによる分析の実施(と,そこに至るための下準備)

3.4.1 mapset と locationの作成

GRASS は様々な GIS データの処理ができる非常に強力な FOSS4G ですが,shp や GeoTiff と

いったデータをそのまま使えない,location や mapset という独自の概念を理解する必要がある,と

いうことで,ちょっと初心者にはハードルが高い部分もあります。

初心者向けの資料としては,http://www.slideshare.net/wata909/foss4g-2012-tokyo-grass があっ

たりするので,そちらもご参考ください。また,OSGeo財団日本支部のWebサイトにも各種資料があ

ります。 http://www.osgeo.jp/foss4g-mext/ こちらもご参考にして下さい。

さておき,作業をしてみましょう。まず,GRASSを起動します。

GRASS を使用する場合,「GIS データディレクトリ」を指定する必要があります。これは任意の

ディレクトリで良いのですが,例えば「c:¥nige¥GRASS」とします3。これを指定したら「ロケーション

ウィザード」をクリックします。まず,「プロジェクトロケーション」を「tukuba」とします。

3 上記では違うディレクトリになってるけど,気にしない。

つぎに,「新しいロケーションの作成方法を選択」が出ますので,「地理参照ファイルを選択」を

選んで下さい。

ここで先ほど作成した道路データについてつくば市の範囲で切り出したモノを選択します。

すると,以下のようにロケーションが設定されます。

ロケーションが作成されたら,次に mapset を作成します。GRASS の起動画面から「マップセット

の作成」をクリックして,「新しいマップセットの作成」が出てきたら,「nige」と入力して下さい。

ここまできて,やっと起動準備が完了です。「利用可能なマップセット」から「nige」を選択して,

「GRASSの起動」をクリックして下さい。

すると,GRASS が起動します。QGIS や某 A のつく GIS ソフトは 1 つのウィンドが立ち上がるだ

けですが,GRASSは2つのウィンドが立ち上がります。1つは,レイヤの一覧表示やコマンドを選択

する「GRASS GIS レイヤーマネージャー」(左)で,もう一つはデータが表示される「GRASS GIS

マップ表示」(右)になります。

3.4.2 データのインポート

さて,起動が完了したら,データのインポートです。

レイヤーマネージャーから『ファイル,ベクトルデータのインポート,一般的なインポート形式

[v.in.ogr] 』をクリックして下さい。すると,次の様なウィンドが出てくると思います。

ここで,「ソースタイプ」をディレクトリ,「ソース」の「ディレクトリ」で先ほど作成した shp が含まれる

ディレクトリを選ぶと,「OGR レイヤ一覧」にそのフォルダーに含まれる shp ファイルの一覧が表示さ

れます。ここでインポートする shp,ここでは「highway_utm54.shp」と「point_utm54.shp」の横に

チェックを入れ,マップ名を「highway」と「point」と指定します。ここで「インポート」をクリックすると,

ファイルが GRASS にインポートされます。インポートされたファイルを表示すると,次のようになりま

す。ちょっと見えにくいですが,ズームすると福祉施設のポイントデータもインポートされています。

3.4.3 福祉施設から最も近い道路の座標特定

さて,ここからがちょっと面倒。まず,画面をズームしてみます。

黒い線が道路,赤い点が福祉施設になります。見てわかるように,福祉施設のデータが道路の

上に乗っていません。r.cost の分析では,距離測定の開始点,つまり福祉施設の位置は,道路の

上にある必要があります。本来は,福祉施設の入り口の位置がわかれば良いのですが,それが難

しいので,「福祉施設の点から一番近い道路の位置」を仮想的に福祉施設の位置として扱います。

ここでは,

v.distance コマンドを使って一番近い地点の座標を決定する

v.out.asciiをエクスポートする

v.in.asciiで再度読み込む

といった手順で分析を行います。ただし,v.distance コマンドは,既存のテーブルの列に値をアッ

プデートするという使い方しかできません。なのでまず,値をアップロードする列を追加する必要が

あります。なので,

v.db.addcolで列を追加

v.distance コマンドを使って一番近い地点の座標を決定する

v.out.asciiをエクスポートする

v.in.asciiで再度読み込む

という,手順をで行う事にします。もしかするともうちょっと良い手順があるかもしれないのですが,

見つかりませんでした。誰か,教えて(汗

とにかく,やります。まず,『データベース,データベース接続,列追加 [v.db.addcol] 』をクリック

します。

そうすると v.db.addcol ウィンドが開くので,上で「point@nige」を,下で「line_x double, line_y

double」と入力します。これは,「point」という地図に,「line_xという列を小数点形式で,同じく line_y

という列を小数点形式で追加」する,ということになります。

次に,レイヤーマネージャーから『ベクトル,近傍のフィーチャ [v.distance] 』を選択します。する

と下の様なウィンドが表示されるので,「存在するベクトルマップ名 (from) 」で「point@nige」を,

「存在するベクトルマップ名 (to) 」で「highway」を選択し,「x coordinate of the nearest point on the

`to` feature (toの地物の最も近い地点の x座標)」と「y coordinate of the nearest point on the `to`

feature (to の地物の最も近い地点の y 座標)」を選択します。そして,「upload オプションによっ

て・・・」に,「line_x, line_y」と入力して実行をクリックします。

すると,福祉施設の点から最も近い道路の点の x, y座標値が line_x と line_yに入力されます。

このデータを,一度外部に出力します。『ファイル,ベクトルマップのエクスポート,ASCIIポイント

/GRASS ASCIIベクトルのエクスポート[v.out.ascii] 』を選択します。

必須で「point@nige」を選択,ポイントで区切り文字を「,(カンマ)」,エクスポートする属性列名

に「line_x, line_y」と入力,オプションで出力ファイルを指定して下さい。

ここで,出力したファイルを確認すると,一列目と二列目が元のXY座標,3列目が ID,四列目と

五列目が道路上の XY座標になります。

ここで,このテキストファイルをもう一度インポートすることにします。今度は,『ファイル,ベクトル

マップのインポート,ASCII ポイント/GRASS ASCII ベクトルのインポート [v.in.ascii] 』を選択しま

す。

インポートするファイルとして先ほどの point.txt を,出力するマップ名として point_snap を指定し

ます。

そして入力ファイルのフォーマットで,フィールドセパレーターに「,(カンマ)」を,

ポイントで「Number of column used as X coordinate」とその下に,それぞれ4,5を入力して,次

項をクリックします。出力されたデータを表示すると,元の位置から一番近い道路上に新し点(ここ

では赤いまるで表示)が作成されたのが見られます。

よし,ここまで来ればもう少しw

3.4.4 福祉施設および道路のバッファーの生成およびのラスター化

r.cost を実施するためには,ラスターデータが必要になります。GRASS の場合,v.to.rast でベク

ターをラスターに変換するのですが,線や点データをそのままラスターに変換した場合,ちょっと見

栄えが悪くなります。そこでここでは,線や点からバッファーを発生させる→そのデータをラスター

に変換する,という手順で作業を行います。

まず,『ベクトル,バッファリング [v.buffer] 』をクリックします。

入力するマップとして「point_snap」,出力するマップとして「point_buff」を選択します。

次に,距離タブの「マップユニットの長軸に沿ったバッファー距離」に 5(すなわち 5mのこと)を入

力します。これを実施すると、道路上に半径 5mの円ができます。

ラインに対しても同様に実施します。出力を highway_buff とし,実行したものを表示すると以下

のようになります。この場合,道路の線の両脇に 5mの幅でバッファーが生成されています。

次に,このデータをラスタに変換します。

が,その前に。GRASS でラスタデータの分析を行う場合,region と呼ばれる分析範囲を指定す

る必要があります。この region が正しく設定されていないと,期待する結果を得ることができません。

というか,分析したはいいけど,結果が真っ白!!,ということが頻発します。ということで,regionの

設定を行います。『設定,領域,領域設定 [g.region] 』をクリックしてください。既存領域タブの「ベ

クトルマップに一致するように領域を設定します」で「highway_buff」を選択,解像度タブの「グリッド

解像度」に「5」を入力します。これはすなわち,「分析対象は highway_buff と同じ範囲で,ラスタ

データの解像度(細かさ)は 5mです」と指定したことになります。

ラスタの変換は,『ファイル,マップタイプの変換,ベクトル→ラスター [v.to.rast] 』です。「入力

するベクトルマップ名」を point_snap,出力するラスターマップ名を start_point としました。ラスター

値のソースは「val」とします。これで実施すると,点データがラスタに変換されます。

同じく,highway_buffも変換します。こちらは,outputは highway_buffのままでよいかと思います。

道路のバッファーをラスタに変換したものの表示例は以下になります。

3.4.5 r.costの実行

やっと,ここまで来た・・・。

はい,r.costの実施です。r.costが何かとかは,

マニュアル( http://grass.osgeo.org/grass64/manuals/r.cost.html )や,こちらのスライドシェア

(http://www.slideshare.net/wata909/rcost)をご参考にして下さい。4

r.costは「ラスター,地形解析,表層断面図5」

ここの必須タブの「グリッドセルのコスト情報・・・」を highway_buff,「出力するラスターマップ名」を

highway_cost_dist としました。次に,スタートタブの「開始ラスター点のマップ名」を start_point,オ

プションタブの「精度を上げる」にチェックを入れ,実行を押します。

4 すみません,だんだん説明する気力が・・・ 5 うーん訳が・・・。

あとは,計算が終わるのを待つだけです。60 秒と出てますが,まぁ,180 秒ぐらいはかかったかも

しれません。でも,これで終わりです。このように,準備が長い。これが GIS というものです,はい。

データを表示すると,こんな感じです。大体出来上がりなんですけど,色合いがちょと違います。あ

と一歩です!!!

3.4.6 逃げ地図にあわせた色の指定

さて逃げ地図ですが,優れた点の一つが「老人の方の移動時間に合わせて地図を色分けする」

ことにあると思います。具体的には下の様な色分けになっています。

http://www.nigechizuproject.com/?page_id=27 より引用

ということで,色分けを逃げ地図に合わせます。GRASS のラスター地図の色指定は,『ラスター,

カラー調整,カラーテーブル [r.colors] 』から行います。

必須タブで先ほど作成した highway_cost_dist を選択します。

次に,色タブの「または対話的に値を入力します」の所に,以下のテキストを貼り付けて下さい。

これは,最初の数字がラスタの値あとの数字が RGB になります。例えば,最初の二行は「0 から

26(セルの解像度が 5mなので,130m)までは緑色」ということを指定しています。これで表示すると,

逃げ地図をほぼ同じ色合いになります。

0 0:155:99

26 0:155:99

26 121:191:89

52 121:191:89

52 247:218:9

78 247:218:9

78 243:152:9

104 243:152:9

104 232:52:12

130 232:52:12

130 107:22:134

156 107:22:134

156 14:110:184

182 14:110:184

182 0:0:0

1200 0:0:0

nv 255:255:255

default 255:255:255

以上の分析結果を QGISの上で基盤地図 25000WMS配信サービスと重ねたものが下になります

黒いところは,福祉施設まで歩いて 24 分以上かかるところとなります。つくばは旧集落と新しい

住宅地が混在する地域になりますが,歩いて 30分以内となると,なかなかきつい感じのようです。

あとは,これを全国に実施して,福祉施設の配置の分析に使うとか,何とか・・・。

4 おわりに

すみません,時間ぎりぎりなので,結構はしょりました。先ほども申しましたように、このドキュメントは

「CC-BY 2.0 日本」でライセンスしています。

だれか,清書して下さいwww

ここまで目を通してくれた方,ありがとうございます m(__)m