見出し画像

Mapshaperを使ってGeoJSONファイルの加工を行う

データ可視化で多く使われる手法のひとつが色分け地図(Choropleth map)です。都道府県、市区町村、選挙区といった区域を色で塗り分けて統計データや選挙結果などの地理的なデータを表現します。

色分け地図を作るためには、区域ごとの統計データ(たとえば「神奈川県横浜市は200」など)とあわせて、区域の境界線を示すデータが必要です。Google マップやTableauなど、各種のウェブサービスやBIツールにおいては、ツール側で区域データを持っている場合があります。たとえばGoogle マップで「東京都渋谷区」と検索すると、渋谷区の区域(境界線)がハイライトされます。

しかしツール側で用意されていない区域を塗り分けたい場合や、そもそも区域データがないツールを使う場合、区域データを自分で用意する必要があります。

日本の場合、最も使う機会が多いであろう市区町村の区域データは国土交通省から公開されています。しかしこれらの元データは、多くの場合極めて精密でファイル容量が大きく、またデータによっては離島や飛び地(同じ市区町村が2つ以上の区域を持っているケース)が異なる区域として扱われている場合があります。

そこで今回は、Mapshaperというツールを使って国土数値情報の行政区域データを加工・軽量化する方法を解説します。


区域データのダウンロード

まずは区域データをダウンロードします。国土交通省が公開する「国土数値情報」からは全国の市区町村の行政区域データがダウンロード可能です。以下のURLから国土数値情報にアクセスしてください。

下にスクロールして「データ一覧」→「政策区域」→「行政区域」→「行政区域(ポリゴン)」をクリックします。今回は2024年(令和6年)の「全国」ファイルをダウンロードします。

ZIPファイルの容量は583MB、解凍すると2.76GBのフォルダになります。もしネットワークやPC性能的にファイルが大きすぎる場合、代わりに「神奈川県」のデータをダウンロードしてください。


Mapshaperで読み込む

次にMapshaperを開きます。Mapshaperとは、GIS(地理情報システム)データを加工・編集するためのオープンソースのウェブサービスです。ShapefileやGeoJSONなど、様々な地理情報ファイルを開いて加工することが可能です。

上のページを開くと「Import files」というダイアログが表示されるので、先ほどダウンロードしたフォルダから「N03-20240101.geojson」をドラッグ&ドロップして開きます。神奈川県の場合はファイル名「N03-20240101_14.geojson」です。開くと以下のような日本の白地図が表示されます。

まずデータの属性を確認します。画面右側の縦に並んだアイコンからマウスカーソルのような矢印アイコンを選択します。いくつかメニューが表示されるので「inspect features」を選択します。

その状態で市区町村をマウスホバーすると、そのポリゴンの情報が左上に表示されます。

ここに表示される項目名と値の意味は、先ほどデータをダウンロードした国土数値情報のページに解説されています。


飛び地の統一

ここからデータの加工に入ります。最初に飛び地や、複数の島にまたがって市区町村が存在するケースの調整を行います。たとえば神奈川県川崎市川崎区は複数の島を含んでいますが、マウスホバーすると個々の島だけがハイライトされます。

これは複数のポリゴン(境界線で囲まれた範囲)が別々の市区町村と見なされているためです。これらが1つのポリゴンとして認識されるように結合処理を行います。右上のメニューバー「Console」をクリックし、左側に黒いサイドバーを表示させてください。ここにコマンドを入力して地図の加工を行います。以下のコマンドを入力してください。

dissolve N03_001,N03_002,N03_003,N03_004,N03_005,N03_007

dissolveとは指定したポリゴンをひとつのポリゴンとしてマージするコマンドです。後ろにN03_001…と属性の項目名を書いていますが、「この項目名がすべて同じならマージする」という意味です。これですべての項目名が同じポリゴン=同じ市区町村を統一できます。

Enterを押すとコマンドが実行され、「Dissolved 124,133 features into 1,905 features」というメッセージが表示されます。ここで再度川崎市をマウスホバーすると、今度はすべての区域が同時にハイライトされます。これで飛び地や離島などの調整は完了です。


データの軽量化

次にデータの軽量化を行います。右上のメニューから「Simplify」を選択してください。軽量化のアルゴリズムを指定できる細かなオプション画面が表示されますが、そのまま「Apply」をクリックしてください。「CALCULATING」というメッセージが表示された後、ページの中央上部に0%から100%のスライダーが表示されます。これを初期値の100%から下げることでポリゴンが単純化が行われ、ファイル容量が軽くなります。

たとえば神奈川県の江ノ島を見ながらSimplifyのスライダーを調整してください。初期状態では複雑な海岸線が精度高く表現されていましたが、スライダーを右に動かすほど海岸線が単純化されていくことがわかります。

江ノ島だけ見ると5%の軽量化でかなり境界線が単純になったように感じられますが、おそらく全国単位で見ると肉眼ではほとんど違いがわからないと思います。適切なSimplifyの加減はファイル容量と使い道のバランスですが、たとえば私が全国の市区町村マップで単純化するのは1%程度です。


政令指定都市の結合

地域別の統計データは、政令指定都市が1つの単位として扱われている場合(例:神奈川県横浜市)と、その下の行政区まで区別されている場合(例:神奈川県横浜市緑区)があります。元データでは行政区まで分かれているので、て政令指定都市を結合する方法を解決します。飛び地の調整と同様にConsoleを開き、以下のコマンドを入力してください。

dissolve where='N03_004 == "横浜市"' copy-fields=N03_001,N03_002,N03_003,N03_004 calc='N03_005 = null; N03_007 = "14100"'

同じdissolveコマンドですが先ほどと少し条件が異なります。まず「where」の部分で「N03_004の値が横浜市である市区町村」に区切っています。これは後で横浜市の市区町村コードを入れるためです。copy-fieldsとは「結合前後で変化させない項目」です。たとえば都道府県名(N03_001)は結合前後で変わらないのでここで指定しています。calcとは「結合後の値を個別に指定する項目」です。行政区名(N03_005)は「横浜市」になってしまえば該当がないのでnull(ざっくり言うと「値が存在しない」という意味です)、市区町村コード(N03_007)は横浜市のコードである「14100」としています。

これで横浜市が1つのポリゴンとして扱われるようになりました。


都道府県別・特定の地域だけ残す

市区町村ではなく都道府県別のマップが必要な場合、全国版のフォルダに入っている「N03-20240101_prefecture.geojson」を使うことができます。

都道府県や市区町村を指定して特定の地域だけ扱いたい場合は、「filter」コマンドを使うことができます。例えば一都三県(東京都、千葉県、神奈川県、埼玉県)だけを残す場合、以下のコマンドを使用します:

filter 'N03_001=="東京都" || N03_001=="千葉県" || N03_001=="神奈川県" || N03_001=="埼玉県"'

「||」は「OR」を示します。すなわち都道府県名が東京都、千葉県、神奈川県、埼玉県のいずれかに当てはまるものをfilterする(=残す)、という処理を行っています。これで、特定の地域だけのマップを作成することが可能です。


データをクリーニングしてエクスポート

続いてデータのクリーニングを行います。左上に表示されているメッセージ「Check line intersections」を表示します。Simplifyなどの際に隣同士の区域で境界線が若干ずれた際に表示されるものです。「XX line intersections」という表示に変わるので、「Repair」をクリックすると自動で修復が行われます(たまにすべて修復できない場合がありますが、その際は再度Repairを押すかConsoleで「clean」コマンドを実行すると直ります)。

最後にデータをエクスポートします。右上メニュー「Export」を押して書き出しメニューを表示させます。書き出すファイル形式などの指定もできますが、今回の場合はGeoJSONからGeoJSONへの書き出しなので、何もせず「Export」をクリックします。Simplifyの程度にもよりますが、おそらくファイル容量は元の数%程度になっているはずです。

出来上がったGeoJSONファイルは、Flourishなどデータ可視化ツールに読み込んで使うこともできますし、JavaScriptで表示するならD3.jsなどのライブラリで扱うことも可能です。属性データに市区町村コードが含まれているので、統計データと紐づける際はコードを使うとよいでしょう。


Google News Labでは報道に役立つデジタル技術のワークショップやレクチャーを無償で行っています。オンラインで誰でも参加できる形や、報道機関や大学に訪問して開催する形があります。興味のある方はX(旧Twitter)FacebookLinkedInなどからご連絡ください。

この記事が気に入ったらサポートをしてみませんか?