見出し画像

【実習編】六角形メッシュを使ってレトロゲーム風マップを作成しよう

前回のnoteでは六角形メッシュの真面目な使い方を紹介しましたが、六角形のドットで地図を描くと言ったらやっぱりゲームのワールドマップかなと思うので、今回はレトロゲーム風マップを作成してみたいと思います(※1)。

※1 といっても、一部の戦略ゲームを除いて、ほとんどのワールドマップが四角形のドットを用いて描かれている気がしますが。

I. データの用意

ワールドマップを作成するためには、平地、森、水域といった地形情報が必要です。活用できそうなGISデータには、次のようなものがあります。

・衛星画像、空中写真
・土地利用分類
・土壌分類
・地形分類
・植生分類

土壌や地形分類は国土交通省国土情報課のウェブサイトから、植生分類は生物多様性センターのウェブサイトからダウンロードできます。しかし、今回は土地利用分類データを使用します。

土地利用分類データの入手について、無料で手に入る代表的なデータは次の2つです。

・国土数値情報 土地利用細分メッシュ
・JAXA 高解像度土地利用土地被覆図

これらは衛星画像をもとに地表面の状況を分類したデータで、土地利用メッシュは100m、JAXAデータは30m程度の解像度となっています。JAXAデータは利用登録が必要になります。

ここでは、「国土数値情報 土地利用細分メッシュ」を使用します(※2)。ダウンロードは1次メッシュ単位となっています。
下図の真ん中の画像で「ダウンロードしたい県をクリックしてください」とありますが、クリックしてもそのメッシュが選択されるだけで、ダウンロードリンクにジャンプしたり絞り込まれたりすることはありません(2020年5月25日時点)。マウスカーソルを合わせているとメッシュコードがポップアップするので、そのメッシュコードで検索を掛けてダウンロードリンクに移動しましょう。
下図では、高知市が含まれるメッシュID「5033」を選択しています。ダウンロードするデータは、最新の年度で世界測地系のものを選びましょう。

画像16

※2 土地利用3次メッシュは、土地利用細分メッシュを集計し1kmメッシュにしたデータです。都市地域土地利用細分メッシュは、土地利用細分メッシュよりも土地利用を細かく分類したデータです。メッシュ幅は100mで、名前のとおりデータがある範囲は都市部に限られます。


II. 六角形メッシュの作成

QGISを立ち上げ、ダウンロードした土地利用細分メッシュを読み込みましょう・・・。データをすべて読み込むまでに、かなり時間が掛かりますね。

土地利用細分メッシュは100mメッシュのデータです。一方、国土数値情報のウェブサイドでは1次メッシュ単位でダウンロードしました。1次メッシュは約80㎞です。つまり、ダウンロードしたデータは、1つの1次メッシュあたり最大64万の100mメッシュが含まれていることになります(※3)。

※3 土地利用細分メッシュのデータ範囲は海岸付近までのため、海域を多く含む区画では、含まれる100mメッシュ数は64万より少なくなります。

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

1. 作業範囲の設定

これだけの数のメッシュを扱うのは大変なので、ここでは高知市の範囲に絞って作業をしようと思います。行政区域データから高知市を選択→エクスポートし、高知市の行政界区域のレイヤを用意しました。

画像2

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

2. プロジェクトの座標系を変更

六角形メッシュを作成するためには、プロジェクトの座標系を投影座標系にしておくことが望ましいです。QGISのウィンドウ右下からプロジェクトプロパティの座標参照系を開き、平面直角座標系第IV系(EPSG:6672)を選択してプロジェクトの座標系を変更しましょう。

画像3

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

3. 六角形メッシュの作成

続いて、QGISの機能を用いて六角形メッシュを作成します。メニューのプロセシングツールから「プロセシングツールボックス」を開き、ツールボックスの「ベクタ作成」から「グリッドの作成」を選択します。

グリッドの作成ウィンドウの設定は、次の通りです。

グリッドの種類:
六角形
グリッドの範囲:
右のボタンから「レイヤの領域を使う」をクリックし、高知市の行政区域レイヤを指定
水平・垂直方向の間隔:
200mに設定。数字を小さくするほど細かなメッシュとなりデータサイズが大きくなるので、後の処理で時間が掛かります。500m~1kmくらいでも十分だと思いますが、メッシュ幅を大きくすると河川のような細長い地物の情報を取得できなくなるため、バランスが難しいです。

画像4

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

4. 土地利用細分メッシュの切り出し

作成した六角形メッシュの範囲(高知市の範囲)に対し、土地利用細分メッシュはかなり広範囲のデータとなっています。六角形メッシュと重ならない部分は不要なので、今後の処理を軽くするためにも必要になる部分を切り出しておきましょう。

切り出し方は「選択地物の保存」で問題ありません。必要な範囲を厳密に選択する必要はないので、選択ツールを使ってマウスでおおよその範囲を選択し、レイヤを右クリックして「エクスポート」→「選択地物の保存」とします。

画像5


III. 土地利用情報を六角形メッシュに結合する

次は、六角形メッシュに土地利用の情報をくっつけます。ここで使用する機能が空間結合です。空間結合とは、2つのレイヤ間の位置関係に基づいて属性情報を結合する操作です。位置関係とは、「重なる」とか「完全に含まれている」とか「交差する」などの結合条件です。

1. 空間結合とは?

下図は、ポリゴンレイヤと重なるポイントレイヤにポリゴンの属性テーブルを空間結合するイメージ図です。位置関係は「重なる」を想定していますが、この場合は「含まれる」でも結果は同じですね。ポイントCはポリゴンレイヤと重なっていないので、ポリゴンの情報が結合されません。

画像6

次は、ポリゴンとポリゴンによる空間結合のイメージ図です。今回はこのパターンの空間結合を使用しますが、この空間結合では厄介な問題が発生します。

それは、位置関係を「重なる」にした時に、1つのフィーチャに対し結合対象となるフィーチャが複数存在する場合があることです。

下図の例では、六角形メッシュDは1つの河川フィーチャと3つの田フィーチャと重なっています。この4つが結合対象となるのですが、どの属性情報を六角形メッシュDに結合すればよいでしょう?

下図では、結合候補の決定方法に「最頻」というルールを採用しています。これにより、河川:1に対し、田:3なので田を選択することができます(※4)。

画像7

※4 「最頻」を選べばすべて解決するかといえば、そんなことはないですね。
1. 最頻が同率で複数あったらどうすればよいでしょう?
2. 重なる面積の大きさを考慮せず、全て1としてカウントするのは不公平ではないでしょうか?
3. 「最頻」の他に、もっと合理的な解決方法は無いのでしょうか?
1. について、同率だった場合は「最初に結合候補として見つかったものを採用する」というような強引な決定方法をツール側で勝手に採用されることが多いです。それを避けたければ、面積等の情報を用いて重み付けを行い、順位が定まるよう処理を工夫します。2について、重なっている領域の面積値で重み付けをする方が公平ですね。いわゆる「面積按分」については、別のnoteで紹介できればと思います。3について、扱う属性データの性質が比例尺度の場合、合計や平均などが意味を持つこともあります。

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

2. 土地利用情報を数値に変換

それでは、空間結合を行いましょう・・・と言いたいところなのですが、QGISが基本機能として持つ「空間結合(集計つき)」は、数値型のデータにしか集計が機能しません
対して、土地利用情報はテキスト型になっています。そのため、テキスト型→数値型の変換が必要になります。具体的に見ていきましょう。

切り出した土地利用メッシュの属性テーブルを開くと、3列のフィールドを確認できます。そのうち、真ん中の「土地利用種」フィールドに、土地利用の状況がコード化して記載されています。

この土地利用コードは、数字によって表されています。しかし、左寄せになっていることから、データ型はテキスト型です。データ型は、レイヤプロパティのフィールドからも確認できます。レイヤプロパティをキャプチャした下図の右では、土地利用種のタイプ名が「String」となっており、テキスト型であることが確認できます。

画像8

それでは、テキスト型の土地利用コードを、フィールド演算を用いて数値型に変換しましょう。属性テーブルウィンドウのメニューバーのボタンからフィールド計算機ウィンドウを開きます([ Ctrl ] + [ I ] でも開きます)。

フィールド計算機ウィンドウで、「新しいフィールドを作る」にチェックが入っていることを確認し、「フィールド名」に名前を指定します。ここでは「landuse」と付けておきました。

続いて、数式を入力します。文字列型の数字を数値型に変えるには「to_int()」という関数を使います(※5)。to_int()は「型の変換」の中に、土地利用種は「フィールドと値」の中にあります。数式ウィンドウに数式を記述しましょう。下の数式をコピペしても問題ありません。

to_int("土地利用種")

画像9

※5 正確には、to_int()は整数型にする関数です。整数型では小数を扱うことはできません。to_real()を使うと数値を実数型として変換します。実数型は小数も扱うことができます。

[ OK ] をクリックすると、フィールド演算が実行されます。問題なく処理が終われば、下図のように新しくlanduseフィールドが追加され、数値型の土地利用コードが各レコードに入力されます。

画像10

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

3. 空間結合(集計つき)

次は、landuseフィールドの値を空間結合によって六角形メッシュに付与します。プロセシングツールボックスのベクタ一般から「空間結合(集計つき)」を開きましょう。キーワード検索で絞り込むと機能を見つけやすいです。

画像11

「空間結合(集計つき)」ウィンドウでは次のように設定します。最後に、出力先を指定したら [ 実行 ] ボタンをクリックします。

入力レイヤ:
結合するレイヤを指定します。今回は六角形メッシュですね。
結合レイヤ:
結合したい属性情報を持つレイヤを指定します。今回は土地利用メッシュが結合レイヤになります。
ジオメトリの空間関係:
「重なる」にチェックを入れます。
集計する属性:
左のボタンから結合対象とするフィールドを選択できます。数値型に変換した土地利用コード「landuse」にチェックを入れます。
計算する集計関数:
集計方法を選択します。今回は「最頻値」を選びます。

画像12

QGISの空間結合は、そこそこ時間がかかります。処理が終了するまで気長に待ちましょう(※6)。空間結合の処理が終わると、新しくレイヤが追加されます。属性テーブルを開き、土地利用コードが結合されていることを確認しましょう。

画像13

※6 待てば終わるのであれば良いのですが。データ規模が大きくなると、QGISの空間演算は急激に遅くなり、そのうち応答なしになります。その場合は、ArcGISなどの商用GISを利用するか、Rやpythonなどが持つ空間データパッケージによる処理に頼るほかありません。


IV. レイヤスタイルの設定

それでは、結合した土地利用コードをもとに、レイヤスタイルを設定しましょう。まず、国土数値情報のウェブサイトから各土地利用コードが表している土地利用を確認しておきましょう。

画像14

この対応表を見ながら、イメージに合うようにメッシュの塗りつぶし色を設定します。ここでは、次のように設定しました。色を多く使いすぎるとレトロゲーム感が無くなってしまうので、人工物関係は赤、水域関係は青でまとめました。

100:水田:#09ff01
200:農用地:#87b335
500:森林:#349a36
600:荒地:#ba7c00
700:建物用地:#ff5050
901:道路:#ff5050
902:鉄道:#ff5050
1000:その他の用地:#ff5050
1100:河川・湖沼:#0000ff
1400:海浜:#0000ff
1500:海水域:#0000ff
1600:ゴルフ場:#09ff01

画像15

そして、描かれたマップが下図になります。レトロゲーム風マップになったでしょうか。えっ、ファミコンに母ちゃんの掃除機が当たってバグった時の画面になった?

現実世界は、ゲームとは違って土地利用が入り組んでいますね。特に都市部。これがスプロール現象か・・・。もっとゲーム風マップっぽくなる地域があれば、ぜひ教えてほしいです。

画像16


V. おわりに

今回は、六角形メッシュを使ってレトロゲーム風のマップを作成しました。このnoteでは遊び半分の内容として六角形メッシュを扱いましたが、六角形メッシュによるデフォルメマップは地図デザイン界隈で見かける機会が増えている手法です。利用機会は意外とあるかもしれません。

また、記事の途中でサラっと出てきた「空間結合」は、GISならではの非常に強力な機能です。「GIS重要スキル」の5本の指には確実にランクインするのではないでしょうか。これからのnoteでも登場することになると思いますし、「GISを学んだ」と胸を張って言うためにもぜひ覚えていただきたい機能です。

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