バス路線データの取得

バスの路線ルートは、国土交通省の国土数値情報からダウンロードしています。

国土数値情報から、バスルートのデータをXML形式でダウンロードできます。そこに、バス路線のルートを示す点が、大量に登録されています。点の座標は、緯度、経度で(43.22877827, 141.90759511)のように表されています。

全国のバスルートをダウンロードしてみると、ルートの本数は、119,579本あり、そのルート上の点の数は全てで19,441,980個にもなりました。

バス路線タイルの作成

Googleマップでは、256×256ピクセルの正方形タイルと呼ばれる単位で、地図が用意されています。自分で、バス路線用のタイルを作成すれば、地図上に重ねて表示することができます。

正方形タイルの説明などは、こちらを御覧ください。

バスルートでは、ズームレベル6〜15までの路線をタイルで表示するようにしています。国土数値情報からダウンロードした路線の座標データから、ズームレベル6〜15のタイルを作成します。

まずは、XMLから取り込んだルート情報をDBに登録していきます。その際、データサイズを抑えるため、実数の緯度、経度(lat, lon)を、整数のズームレベル15のピクセル座標(x, y)に置き換えて登録しています。

また、各ルートの最小x, 最大x, 最小y, 最大yを求めて、一緒にDBに登録します。そうすることで、1枚のタイル(x, y)-(x+255, y+255)を作成する際、そのタイル上に含まれる可能性のあるルートを絞り込むことができます。

タイルを1枚ずつ作成するのは無駄が多いため、4096×4096の透明なキャンバスを用意し、その範囲に含まれるルートをDBから検索して、ルートを青線で描画しています。そこから、256×256のタイルを16個×16個切り出して、PNGファイルに保存すれば、バス路線のタイルが生成できます。
ズーム10とズーム15のタイルx, タイルyを16の倍数に合わせることで、以下のように同じ範囲のタイルをズーム10〜6とズーム15〜11の2段階で作成できます。

ズームレベル キャンバスサイズ ズームレベル キャンバスサイズ
ズーム10 4096×4096 ズーム15 4096×4096
ズーム9 2048×2048 ズーム14 2048×2048
ズーム8 1024×1024 ズーム13 1024×1024
ズーム7 512×512 ズーム12 512×512
ズーム6 256×256 ズーム11 256×256

作成の際、タイル上にバス路線(青線)が含まれないタイル(完全に透明なタイル)は保存しないようにしています。

これを、ズームレベル6〜15に対して行なったところ、各レベルでの、タイル数、ファイルサイズは以下のようになりました。

ズームレベル タイル枚数 ファイルサイズ
6 20枚 86KB
7 41枚 193KB
8 94枚 532KB
9 236枚 1.3MB
10 670枚 3.5MB
11 2,066枚 9.6MB
12 6,387枚 27.5MB
13 18,926枚 78.0MB
14 52,381枚 211.6MB
15 136,227枚 551.2MB

なお、PNGのデータは、pngquantによって、圧縮しています。これで、1/3ほどのファイルサイズにしています。

同様にして、鉄道路線、バス停、駅のタイルを作成しています。

タイルの表示

生成したタイルは、以下のようになります。あとは、このタイルにアクセスするURLをGoogle Maps APIに渡してやれば、地図の描画などはすべておまかせです。

ズームレベル8のタイル 地図の上に載せた状態

左は、作成したタイルで、右が国土地理院の地形図に載せた状態です。タイルの透過度を指定して、半透明で地図にかぶせることができます。

ズーム16以上でのルート表示

タイルを用意すれば、ルートが地図上に描画されますが、タイルは、ズームレベルが上がると、爆発的に数が増えていきます。

もし、Googleマップが表示できるズームレベル20までのバス路線のタイルを作成しようと思ったら、合計で1000万枚以上のタイルが必要になるでしょう。
個人のサイトで、それだけのタイルを置いておくのは難しいですし、路線の追加や削除を行なった時にタイルを再作成するのも大変になります。

そのため、ズーム16以上では、ルートは線で描画しています。幸い、地図が拡大されているため、表示されている範囲のバス路線のルートを構成する点を全てダウンロードしても、それほど大きなデータにはなりません。

ただし、路線単位でデータをダウンロードすると、長距離路線の場合、ものすごく画面から溢れた、無駄の多いデータがダウンロードされてしまいます。
そのため、すべてのルートを32ポイント未満に収まるように分割して、管理しています。そうすれば、長距離路線でも、表示に必要な部分だけを取得できます。