国土交通省国土計画局という国の組織が運営している、国土数値情報ダウンロードサービスというサイト(国土数値)には、さまざまな GIS データが公開されている。GIS というのは、geographical information system(地理情報システム)のことで、乱暴に言えば、地図情報(とそれにリンクしている情報)を管理する仕組みのこと...だと思う。
Mathematica は ver.7 で、このような GIS データを扱うための機能を数多く搭載した。これは、GIS データの入出力に関する機能だけにとどまらず、各種図法にのっとって座標を変換する機能なんてのまであって、僕のような門外漢にはかなりにちんぷんかんぷんである。ただ、残念なことに、Mathematica の内蔵データのように使えるデータに、日本の都道府県や市区町村に関するものは多くないようだ。そこで、上で紹介した国土数値の公開データを Mathematica で使えないかを試してみることにした。
国土数値が公開しているデータは、JPGIS という日本独自の XML フォーマット。Mathematica でこれを利用するには、1)Mathematica が対応している GIS フォーマットに変換してから読み込む。または、2)Mathematica の XML 機能を使って読み込んで解析する。の2つが考えられそうだ。まずは、簡単そうな気がする「1)変換してから読み込む」をやってみることにする。
変換といっても別途ソフトを買う必要はなく、国土数値のサイトに、JPGIS 形式のファイルを、Mathematica が対応しているシェープという GIS データの形式(各種 GIS ソフトウェアで広く使われているらしい)に変換するツールが無料で公開されている(2009/11 現在は「試作版」と書かれている)ので、これを使うことにする。
まず国土数値のサイトから「行政区域(面)」のデータをダウンロードする。この「行政区域(面)」のデータは都道府県ごとに分かれている。今回は、形が特徴的で分かりやすい北海道でやってみた。
ダウンロードして展開した平成 20 年の北海道区域データ N03-090320_01.xml を、インストールした変換ツール KsjTool の変換元に指定し、変換先に新規に作成したフォルダを指定。Mathematica での読み込みトラブルを避けるため、変換先のパスに日本語文字列が入らないようにするのがポイント(Windows XP 日本語版のデスクトップに配置したフォルダでは、パスに「デスクトップ」が含まれてしまうので駄目)。変換ボタンをクリックして待つこと 80 秒。指定したフォルダに3つのファイルができた。
Mathematica でこのシェープ形式データを読み込むときには、作成された3つのファイルを含むディレクトリパスを指定する。単に読みこんで地図を表示したいだけなら、次の1行で OK だ。
Import["C:\\TEMP\\Hokkaidou", "Graphics"]
表示された画像を選択して [ファイル] メニューの [選択範囲の形式保存...] で PDF や Enhanced Meta で保存すれば、かなり精度の高い地図情報が他のソフトで自由に使えるようになる。なんだかとっても簡単。
元の JPGIS データには区域名のデータも含まれていて、変換されたシェープ形式データにはこれがメタデータとして含まれている。せっかくなので、これを Mathematica で利用することも試してみよう。
まずは、メタデータを使えるように、別の方法でシェープデータを読み込み、データの構成を変換しておく。
data = Import["C:\\TEMP\\Hokkaidou", "Data"];
myHokkaidou = Transpose[{"Geometry" /. data[[1]],
FromCharacterCode[ToCharacterCode[#], "ShiftJIS"] &
/@ ("CN2" /. ("LabeledData" /. data[[1]]))}];
これで、区域名と地形をリンクして扱えるようになった。まずは、マウスカーソルを当てたところの区域名をツールチップとして表示するような地図。
Graphics[{EdgeForm[Thin], FaceForm[LightGreen],
Tooltip[#[[1]], #[[2]]] & /@ myHokkaidou}]
次は Manipulate を使ってみる。Manipulate を使えば、ポップアップメニューで選んだ区域名の地図だけを単独で表示するものも、簡単に作れる。
cityNames = Union[myHokkaidou[[All, 2]]];
Manipulate[
Graphics[{EdgeForm[Thin], FaceForm[LightGreen],
Cases[myHokkaidou, {poly_, city} :> poly]}], {city, cityNames}]
各区域ごとのデータを別途読み込めば、データに連動させて区域を色分けしたりなど、いろいろ楽しいことができそうだ。


