見出し画像

【実習編】非専門家のためのQGIS ~長崎県は10km進めば海に出る?~

I. はじめに

長崎県は、どこをスタート地点にしても10km以内で海に出ることができる。

これは、10年くらい前にどこかのブログか掲示板かでネタになっていた(と記憶している)もので、結論を先に言ってしまえば、10km以上離れた場所もあるという話だったと思います。

長崎県の形を見てみると、細長く海に囲まれた場所が多いですね。長崎県にはたくさんの島があり、また、本土も北松浦半島、西彼杵半島、島原半島といった半島によってその県域の多くが構成されいます。島や入り組んだ入り江がたくさんあるため、その海岸線は北海道に次いで全国で2番目に長い県として知られています。

本土の内陸に目を向けてみても、佐賀県との県境が南は多良岳山系、北部は国見山を通り、大村湾に向かって張り出しているように見えます。

そのため、海と県境の距離も短く、確かにパッと見て明らかに海から10km以上離れていそうな地域は見当たりません。長崎県内には、海から10km以上離れた地域は、あるのか無いのか。手作業で漏れなく探すのは大変そうです。

画像1

GISは、このような距離や空間の位置関係を検索条件として、それにマッチした範囲を探し出す処理を得意としています。QGISを用いれば海岸線からの距離も簡単に算出できるので、このネタの真偽をQGISを活用して改めて検証してみましょう。


II. バッファリングとは

GISには、地物から指定した距離までの圏内を計算するバッファ機能があります。バッファとは、フィーチャを中心として一定の距離を半径として描かれた領域のことで、バッファを発生させる操作のことをバッファリングと呼びます。

例えば、あるコンビニのポイントデータから200mのバッファを作成すると、そのコンビニを中心として半径200mの円が作成されます(下図・左)。作成されたバッファが重なるとき、バッファ同士がディゾルブされるように設定すると、重なる部分が結合して出力されます(下図・右)。

画像2

また、河川のようなラインデータに対して100mのバッファを作成すると、ラインフィーチャの両サイドに100mまで幅を取った細長いポリゴンが作成されます。

画像3

このように、バッファは到達圏や勢力圏、緩衝域などを可視化するために利用されます。また、「幹線道路から100m以内の範囲の建物を抽出する」といった、距離を条件とした空間検索にも使われます。


III. データの入手

それではまず、海岸線からの距離を調べるために必要なGISデータを用意しましょう。海岸線のデータを入手する・・・でも良いですが、国土数値情報の行政区域データでもその境界線は海岸線を兼ねるので、これをダウンロードすればOKです。

ただし、長崎県だけダウンロードするのでは不十分です。行政区域では海岸線と陸域の県境の区別が無いため、長崎県だけでは佐賀県との県境も海岸線と同等の扱いによりバッファが作成されてしまいます。海岸線のみを評価するためには、長崎県と佐賀県のポリゴンを結合し、県境を取り除かなければなりません。したがって、佐賀県の行政区域も一緒にダウンロードします。

ちなみに、国土数値情報には、海岸線データと行政区域データの両方が公開されていますが、整備時期が異なるため両者の海岸線は一致しません。海岸線データの最新版は平成18年整備のもの、行政区域データは平成31年整備が最新版であり、行政区域データを使った方が良さそうです。

画像4

上図は、地理院地図の上に国土数値情報の海岸線データ(赤線)と行政区域データ(緑領域)を重ね合わせて表示しています。地理院地図と行政区域データはほぼ一致していますが、海岸線データは海岸線の位置がずれていたり、埋め立てされた土地が反映されていなかったりしています。


IV. データの前処理

海岸線からの距離は、バッファ機能を用いて算出します。一方、ダウンロードしたデータは、長崎県と佐賀県の2つの別々のシェープファイル、しかもそれぞれ市区町村単位のフィーチャに分かれています。
そこで、2つのファイルをマージで結合し、さらに市区町村単位のフィーチャをディゾルブして1つのフィーチャデータに加工することが今回の前処理になります。

---   ---   ---   ---   ---   ---   ---   ---

1. マージ

まず、長崎県と佐賀県のシェープファイルを1つに結合しましょう。メニューバーの「ベクタ」から「データ管理ツール」→「ベクタレイヤのマージ」を選択します。

画像5

新しく表示された「ベクタレイヤのマージ」ウィンドウの入力レイヤで、長崎県と佐賀県のレイヤにチェックを入れ、[ OK ] ボタンをクリックします。

また、「変換先の座標参照系(CRS)」で、投影座標系を選択します。バッファは距離を用いる処理です。そのため、使用するレイヤも距離を扱う投影座標系で定義されたGISデータが必要になります。
一方、国土数値情報の行政区域データはWGS84という角度を扱う地理座標系で定義されています。したがって、地理座標系から投影座標系へ変換しなければなりません。この座標系変換は後からでも実行できますが(※1)、ちょうどマージ機能の中に変更設定があるので、マージついでに座標系も変更しておきましょう。長崎県は平面直角座標系の第 I 系を使います。「JGD2011 / Japan Plane Rectangular CS I」を選択しましょう。

※1 単に座標系を変更する場合は、GISデータの「エクスポート」から出力ファイルの座標系を指定して保存します。すなわち、レイヤを右クリックして「エクスポート」→「地物の保存」を選択し、「CRS」の設定で変更する座標系を指定します。

画像6

画像7

---   ---   ---   ---   ---   ---   ---   ---

2. ディゾルブ

続いて、ディゾルブを行います。メニューバーの「ベクタ」から「空間演算ツール」→「融合(dissolve)」を選択します。ディゾルブは、同じ属性値を持つフィーチャを結合する機能です。市町村に分かれたフィーチャをディゾルブ機能を用いて1つにまとめます。

上でマージしたレイヤの属性テーブルを確認すると、「N03_002」フィールドが全てブランクで揃っていることが確認できます。そこで、「ディゾルブ」ウィンドウの「基準となる属性」には「N03_002」フィールドを指定します。出力レイヤ(保存先)を設定し、処理を実行しましょう。

画像8

下図は前処理後のデータです。長崎県と佐賀県が結合され、さらに市町村界も取り払われて1つのフィーチャにまとめられたレイヤになりました。

画像9


V. バッファリング

1. 海岸線から10km圏を求める

海岸線から10km圏内の範囲を求めるために、QGISのバッファ機能を使います。メニューバーの「ベクタ」から「空間演算ツール」→「バッファ」を選択します。

画像10

「バッファ」ウィンドウの設定について説明します。まず、「入力レイヤ」にはバッファを発生させるレイヤ、すなわち前処理で作成した長崎県と佐賀県を結合しディゾルブしたレイヤを指定します。

次に、「距離」の値を設定します。ポリゴンに対してバッファを発生させるとき、通常は境界の外側に向かって作成されます。ここで、距離をマイナスに設定するとポリゴンの内側に対してバッファが生成されます。「-10km」となるように数字と単位を設定してみましょう(※2)。「結果をディゾルブする」にチェックを入れたら、[ 実行 ] ボタンをクリックしてバッファを作成します。

※2 対象のGISファイルの座標系が地理座標系の場合、単位が角度になります。角度表記では対応する距離が分かりにくいので、GISファイルの座標系を投影座標系に変換しておきましょう。

画像11

バッファ処理が完了すると、ポリゴンの境界から10km以上離れた領域を示したポリゴンが新しく追加されます(※3)。ただし、ここで作成されたポリゴンは、長崎県と佐賀県を対象としているので、ここから長崎県に含まれる領域を切り出します

※3 「境界から内側に10kmまで」ではないことに注意。下図では緑色の領域が、バッファ機能によって出力されたポリゴンです。指定した距離が正の値ならポリゴンの外側に、負なら内側に向かってバッファが作成される方が、直感に合った処理のように思うのですが、QGISのバッファ機能は微妙に違うみたいです。

画像12

---   ---   ---   ---   ---   ---   ---   ---

2. インターセクトによる切り出し

切り出しにはインターセクトという処理を使います。インターセクトは、2つのポリゴンを指定し、重なった領域を抽出する処理です。

その前に、長崎県をひとまとめにしたGISデータがあると都合が良いので、長崎県の行政領域ファイルをディゾルブして、市町村界を消去したデータを作成しておきます。

画像13

メニューバーの「ベクタ」から「空間演算ツール」→「交差(intersect)」と選択し、「インターセクト」ウィンドウを立ち上げます。

ウィンドウの「入力レイヤ」と「オーバーレイレイヤ」に長崎県ディゾルブレイヤと10km圏バッファレイヤを指定します。指定レイヤは逆でも問題ありません。ファイルの保存先を指定し、[ 実行 ] をクリックすると、2つのレイヤの重なる部分を切り出したポリゴンが出力されます。

画像14

---   ---   ---   ---   ---   ---   ---   ---

3. 命題の真偽は・・・

インターセクトの結果、長崎県内の2か所にバッファポリゴンが残りました。すなわち、この2か所が海から10km以上離れた地域ということになり、最初に掲げた「長崎県は、どこをスタート地点にしても10km以内で海に出ることができる」という命題は偽であることを確認できました。
下図に示した波佐見町と大村市、諫早市の地域では、海に出るまで10km以上の距離を進まなければならないようです。
とはいえ、10km以上離れた地域は本当にわずかで、命題の距離を「11km以内である」と変更すると、成り立ちそうな感じがしますね。

画像15


VI. 多重リングバッファによる海からの距離の可視化

1. Multi-distance buffer プラグインをインストール

QGISにデフォルトで備わっているバッファは、指定できる距離は1つだけです。一方、GISには多重リングバッファと呼ばれる、複数指定した距離に基づいてリング状にバッファを発生させる機能があります。

QGISでは「Multi-distance buffer」というプラグインをインストールして機能を拡張すると、多重リングバッファを利用できます。まず、「Multi-distance buffer」をQGISに導入しましょう。

メニューバーの「プラグイン」から、「プラグインの管理とインストール」を選択します。新規に開いたプラグインウィンドウの左メニューで「未インストール」を選択し、「Multi-distance buffer」を探します。リストから見つかったら、クリックして選択し、ウィンドウ右にある [ インストール ] ボタンをクリックします。

画像16

---   ---   ---   ---   ---   ---   ---   ---

2. Multi-distance buffer による多重リングバッファの作成方法

インストールが成功すると、メニューバーの「ベクタ」に「Multi distance buffer」が新しく追加されます。「Multi distance buffer」を選択して、設定ウィンドウを表示しましょう。

画像17

各所設定についてみていきましょう。まず、「Input layer」には前章で作成したバッファと同じように、長崎県と佐賀県のディゾルブレイヤを指定します。

「buffer distances」ではバッファの距離を指定します。Distanceの入力ボックスに数値を入れ、[ add ] ボタンをクリックすると、右隣りのボックスに作成するバッファの距離が追加されます。ここで、入力値の単位はメートルとして扱われるので、1kmのバッファを発生させる場合は「1000」と記入します。

「Multi distance buffer」も、正の数値を入力すると対象レイヤの外側に向かってバッファを作成します。逆に、数値の符号を負にしてバッファ距離を指定すれば、レイヤの内側にバッファを作成できます。
ここでは、2km間隔で多重リングバッファを作成します。「0」から順に、「-2000」、「-4000」、「-6000」、「-8000」、「-10000」とバッファ距離を指定します(※4)。「0」を入れないと、0m から 2000m までのリングバッファが作成されないので注意です。

「Output (buffer) layer」では、レイヤに出力するレイヤ名を指定します。このツールでは、メモリ上に仮ファイルとして出力されるのみで、直接シェープファイルなどの外部ファイルに保存することができません。シェープファイル等のファイルに出力する場合は、レイヤ作成を作成した後に、そのレイヤをエクスポートします。

「Options」はデフォルト設定のままで問題ありません。設定が完了したら、[ OK ] ボタンをクリックして、実行を開始しましょう。

※4 当然のことですが、リングの数を増やすほど多重リングバッファの作成処理にかかる負荷は大きくなります。また、対象レイヤの境界線が長く複雑な場合も処理に時間が掛かります。したがって、海岸線が入り組んでる長崎県はバッファ処理と相性が悪いですね。今回の範囲を対象に上記のように5段階の多重リングバッファを発生させると、30分~1時間程度の処理時間が掛かります。

画像18

下図が作成された多重リングバッファです。海岸線から等間隔で線が引かれていることが確認できます。また、10km以上はリングバッファの設定をしていないので、ポリゴンの中央部はひとまとまりになっています。

画像19

---   ---   ---   ---   ---   ---   ---   ---

3. 差分機能を使って長崎県の範囲を切り出す

今回も長崎県と佐賀県の範囲を対象に多重リングバッファが作成されたので、ここから長崎県と重なる領域を切り出します。
前章と同様に、インターセクトを使えば長崎県のみを切り出すことはできます。しかし、今回の場合は、インターセクトを使うと長崎県の多数の島々に対して1つ1つ判定処理が入ってしまうので無駄が多いです。

ここで、「長崎県を抽出する」から、「佐賀県を取り除く」と発想を転換します。QGISには対象レイヤに対して重なる領域を削除する「差分(difference)」という機能があります(※5)。この差分機能を用いてバッファ領域から佐賀県の範囲を取り除きましょう(※6)。

メニューバーの「ベクタ」から「空間演算ツール」→「差分(difference)」と選択し、「差分」ウィンドウを立ち上げます。入力レイヤに多重リングバッファレイヤを、オーバーレイレイヤに佐賀県のレイヤを選択し、処理を実行します。

※5 ArcGISではイレースと呼ばれている機能です。ArcGISでは何故かAdvancedという最上位ライセンスでしか利用できない高度な(?)機能です。
※6 地図を描くだけであれば、佐賀県のレイヤを多重バッファレイヤの上に配置して、多重バッファを隠してしまうという手段も、裏ワザとしてアリだと思います。

画像20

差分が実行され、佐賀県の範囲が取り除かれた多重リングバッファが作成できました。

画像21

---   ---   ---   ---   ---   ---   ---   ---

4. 海までの距離を分かりやすく可視化しよう

多重リングバッファには、作成時に指定した境界からの距離情報が属性値に格納されています。この属性値を使用してシンボルの色分けを設定し、海岸線からの距離を視覚的に分かりやすくしてみましょう。

画像22


VII. おわりに

今回のnoteでは、「長崎県は、どこをスタート地点にしても10km以内で海に出ることができる」という命題を、QGISのバッファ機能を用いて検証しました。長崎県は多くを海に囲まれた非常に細長い県ですが、この結論としては、海から10km以上離れた場所もわずかながら存在することが確認できました。

この検証に使用したQGISの機能は(前処理、後処理も含めて)、バッファ、多重リングバッファ、インターセクト、差分(イレース)、マージ、ディゾルブです。これまでの地図を描くため記事とは少し毛色が異なり、空間分析が主体となった内容となりましたが、今回登場した機能も非常によく使うものばかりなので、その使い方に慣れていただければと思います。


記事の内容でもそれ以外でも、地理やGISに関して疑問な点があれば、可能な限りお答えしたいと思います。