GoogleマップのGIS機能で世帯数を表示してみた

Googleマップには、ただ地図で場所を探す以外に、自分なりの情報を書き加えて地図を作れる「マイマップ」という便利な機能があります。ここで使われているのが「GIS 地理情報システム(Geographic Information System)」と呼ばれる仕組みです。地図をベースとして、その上にさまざまな情報を重ねて表示閲覧します。
最近、地域の世帯数マップを作る必要があったので、Googleマップのレイヤ(階層・画層)に重ねて、自分専用のマップを作ってみました。少し手間は掛かりますが、かなり高機能な地図ができたのでご紹介します。

実はここ数年、GIS専用システムのインストラクション業務で、九州各地の自治体で開催される操作研修に関わっています。自分のGoogleマップにGISレイヤを重ねてカスタマイズすることで、基礎からのおさらいにもなりました。

編集:2018年9月3日(月)
新しいレイアウトに合わせて、一部の表記を調整しました。
また、2018年夏の西日本豪雨災害の時に、QGIS 3.0で防災マップを作ってみました。新しいエントリーをお楽しみに 😉

地理情報システム- Wikipedia
https://ja.wikipedia.org/wiki/%E5%9C%B0%E7%90%86%E6%83%85%E5%A0%B1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0

今回作ったマップはコレ

手順は大きく3つに分かれます。

1.地図の上に重ねられるデータを探して、ダウンロードする

今回、必要なのは、九州内のいくつかの市区町村の世帯数で、GISとして利用できるフォーマットのデータです。総務省統計局で公開されているデータが見つかったので、それを利用することにしました。最新のデータでも6年前とやや古いですが、「平成22年国勢調査集計単位別(人口)- 市区町村集計(男女別人口総数及び世帯総数)」を使います。
自治体が持つデータを公開する「オープンデータ」という動きもあって、各市区町村のWebサイトへ行けば、より新しいデータがあることは分かっていますが、今回の目的では、大まかな傾向が分かれば十分でした。また、それぞれの自治体で公開フォーマットが違うはずで、GISで使うには整理が必要だと思ったので、この総務省のデータを使いました。

地図で見る統計(統計GIS)-総務省統計局
https://www.e-stat.go.jp/SG1/estat/toukeiChiri.do?method=init

総務省統計局のWebサイト
いろいろ貴重なデータがあります

まず、「地図に表す統計データ」リンクをクリックすると、ブラウザでそのまま見られる「ArcGIS(ESRI社)」というシステムが開きます。機能も充実していて、まさに欲しい情報が表示されるので最初はこれでいいかと思いましたが、実は、致命的な点が3つあります。

ArcGISの遅い動作
これが全然使えない…
  1. 統計データを表示しながら、例えばコンビニを探して重ねたり、地図上に描かれている情報(地物 ちぶつ)を探しながら同時に使えない。
  2.  Flashベースなので、iOSデバイスで表示できない。
  3. 動作が遅くて、ちょっとした操作でも描画を待たされる。

そこでこの方法は諦めて、Shapeファイルをダウンロードして自分のGoogleマップに重ねることにしました。

  1. 総務省統計局のサイトで「データダウンロード」をクリックします。
  2. 「Step1」のプルダウンメニューで「国勢調査」を選び、一番上の「平成22年国勢調査(小地域)」をクリックします。
  3. 「Step2」で、一番上の「男女別人口総数及び世帯総数」をチェックし、右下の[統計表各種データダウンロードへ]ボタンをクリックします。
国勢調査-男女別人口総数及び世帯総数
最新データが各市区町村で公開されていることも
  1. 「Step3」で、プルダウンメニューで都道府県を選び、市区町村の行を選択します。Conctol-クリックで複数の行を選べます。
  2. [検索]ボタンをクリックすると、「Step4」に「統計データ」「境界データ」がそれぞれ表示されるので、「データ」のリンクをクリックしてダウンロードします。「統計データ」は、csvファイルです。「境界データ」は、上から2番目の「世界測地系平面直角座標系・Shape形式」を使うことにしました。必要に応じて、データの仕様を書いた「定義書」もダウンロードします。
  3. ダウンロードしたzipファイルを展開し、分かりやすく1つのフォルダに整理しておきます。
    私は、ダウンロードしたファイルの拡張子の直前の5つの数字(KEY CODE キーコードと呼ばれる、地図の照合番号)と、各市町村名をフォルダに付けました。郵便番号でもいいような気もしますが、混乱するのでお勧めしません。
福岡市西区の統計データと境界データ
市区町村で細分化
ダウンロードされたファイル

また、ダウンロードしたShapeファイルは、別の階層に移動させたりファイル名を変えたりせず、そのままの状態にしておきます。4つのファイルのうち主に使うのはshpファイルだけですが、「必須」ファイルは相互関係があります。私は最初、shpファイル以外を捨ててしまって、次のステップでエラーに悩まされました。
.shp 図形の座標を格納するファイル(必須)
.shx shpの図形とdbfの属性の対応関係を格納するファイル(必須)
.dbf : 図形の属性情報を格納するテーブル(必須)
.prj : 図形の持つ座標系の定義情報を格納するプロジェクトファイル(任意)

2.最小限のデータに編集し、フォーマットを変換する

オープンソースGISのQGIS
QGISアプリケーション

ダウンロードしたShapeファイルには、今回不要なデータがあるので削除します。また、Googleマップに読み込めるkmlファイルに変換します。データ編集とファイル変換には、オープンソースのGISアプリケーションQGISを使います。

QGIS
http://www.qgis.org/ja/

QGISの複数パッケージ
3.0になって、今はこれよりシンプルに
  1. QGISのサイトへアクセスして、[ダウンロードする]ボタンをクリックします。
  2. OSに応じたリンクをクリックします。
  3. KyngChaos QGISのサイトへ遷移するので、Downloadのリンクをクリックします。
  4. macOSの場合、dmgファイルをマウントし、パッケージファイルを順番にインストールしていきます(環境によっては、「システム環境設定」>「セキュリティとプライバシー」>「一般」で、「ダウンロードしたアプリケーションの実行許可」の設定を確認)。
セキュリティーアラート
パッケージファイルインストールの、いつものお約束
  1. QGISアプリケーションを起動し、ダウンロードしておいた市区町村のデータの.shpファイルを開くと、地図が表示されます(ここでエラーになる場合は、前述の複数ファイルを確認)。
QGISのウインドウ
デフォルトだと、余計な海や離島の部分まで
  1. 「Preferences…」を開き、「データソース」の「シェープファイルのエンコーディング宣言を無視する」のチェックをオフにします。これは、Shapeファイルに格納されている日本語の改行コードがS-JISなので、そのまま書き出してGoogleマップに読み込むと文字化けしてしまうためです。[OK]ボタンで閉じます。
QGIS環境設定-データソース
日本語が化けるので、エンコードは無視させない
  1. 次に、「レイヤパネル」で、対象のレイヤを右クリックし、メニューから「編集モード切替」を選択します。地図の境界線がハイライトされます。
「編集モード切替」
QGISでの編集
ハイライトされた部分を編集
  1. もう一度、対象のレイヤを右クリックし、メニューから「属性テーブルを開く」を選択します。
「属性テーブルを開く」
属性テーブルで編集
  1. 属性テーブルが開きます。各属性の詳細は、ダウンロードしておいた「定義書」PDFを参照します。ほとんどの属性は、今回の目的には不要なので削除します。
デフォルトの属性テーブル
今回不要なデータが多すぎるので削除
  1. [フィールド削除]ボタンをクリックします。開いたリストの項目名を上から下までドラッグしてすべて選択し、Command-クリックで「MOJI」「SETAI」「X_CODE」「Y_CODE」「KEY_CODE」の5つだけ除外し、[OK]ボタンをクリックします。
[フィールド削除]ボタン
[フィールド削除]ボタン
  1. 必要最小限の属性テーブルになりました。この段階で世帯数「SETAI」のタイプは「int(数値)」ですが、Googleマップに読み込むとなぜか文字列として認識されてしまうので、後でコピー変換します。
最小限に編集した属性テーブル
属性がコンパクトに
  1. 「レイヤパネル」で、対象のレイヤを右クリックし、メニューから「名前をつけて保存する…」を選択します。
    「形式:Keyhole Markup Language [KML]」にし、[ブラウズ]ボタンをクリックして、保存するフォルダとファイル名を決めます。ここでは、KEY CODE(5つの数字)にしました。[OK]ボタンで保存します。
「名前をつけて保存する」
名前を付けて保存すると
kmlファイル
kmlファイルが準備完了

3.Googleマップに読み込んで、データや表示を編集する

ようやくGoogleマップに移っての作業です。

  1. Googleマップを開いて、ウインドウ左上の「メニュー」を開きます。「マイプレイス」をクリックし、さらに「マイマップ」をクリックして、ウインドウ一番下の[地図を作成]をクリックします。
Googleマップの「マイプレイス」
マイプレイス > マイマップ
  1. 「無題の地図」が開くので、メニュー右側の縦になった[…]で、適当に名前を編集します。
  2. レイヤの[インポート]をクリックし、新しく前面に開いたウインドウに、書き出したkmlファイルをドラッグします。アップロードされると、図形を中心に描き変わります。
読み込み直後のレイヤ
kmlファイルの読み込み直後
  1. 「無題のレイヤ」だったレイヤ名が、kmlファイルの名前に変わります。レイヤ名の右の縦になった[…]をクリックし、「このレイヤの名前を変更」で、適度に編集します。
  2. 不要なデータがあるのと、世帯数「SETAI」が数値として認識されていないのを編集します。もう一度[…]をクリックし、「データビューを開く」をクリックします。
  3. 「MOJI」列のラベルを右クリックし、「タイトル列に設定」します。
「MOJI」のタイトル列設定
属性テーブルの編集、大事
  1. 「SETAI」列を「コピー」し、ラベルを「HOUSEHOLDS」に、タイプを「数字」に設定して、[追加]ボタンをクリックします。
列を「タイプ:数字」でコピー
コピーするときに、タイプを「数字」するのがカギ
  1. 「名前」「説明」「SETAI」列を削除して、データビューを閉じます。(スムーズに再読み込みされないことが何度かありましたが、キャッシュを消去したり操作を繰り返して解決できました)
リロードエラー
エラーも、リロードすればOK
  1. 次に、世帯数ごとに5段階に自動色分けして、丁目や町村名をラベルとして表示します。「個別スタイル」リンクをクリックし、以下のように変更します。
    * 場所のグループ化方法:HOUSEHOLDS
    * 「範囲」オプション:5 任意のグラデーション
    * ラベルを設定:MOJI
スタイルのカラー設定
  1. グラデーションは、暗い色だと見づらいので変更しました。数値が小から大になるに従って、白から黄色、赤になって、半透明で重なるようにしました。5つに分かれた数値それぞれの右端のアイコンをクリックし、開いたパレットでカラーを変更します。色の「範囲別の色を使う」チェックボックスをオフにし、「ポリゴンの透明度」スライダーを中央に設定します。ポリゴンの透明度は1つのレイヤーで共通なので、指標が5つに分かれていても、1回設定すればOKです。
「世帯数マップ」のメニュー
凡例を5段階表示に
  1. 福岡市西区の地図の場合、博多湾上を覆う無意味な海の図形があったので、クリックして削除しました。右クリックでも削除できます。
  2. 重なる背景の地図がデフォルトだと道路や鉄道、文字がうるさいので、「基本地図」から「モノクロ都市」を選択します。
  3. 図形をクリックすると、属性がバルーンで表示されます(なぜか面積まで!)。
世帯数マップ

これで、Googleマップを使った世帯数表示の完成です!ズームやスクロールもスムーズ、文字情報もスケーラブルです。図形をクリックすると、左側にデータが表示されます。もちろん、iPhoneのChromeやGoogleマップでも表示できます。
GISで使えるさまざまなデータは、国内外で広く公開されているので、ぜひチャレンジしてみてください。