Code for History

"Code for History"はIT技術を歴史学上の問題の解決に使うコミュニティです。強調したいのは、我々にとってIT技術は「手段」であって「目的」ではありません。「目的」は歴史学上の問題を解決する事であって、必要であればITでない手段も活用します。常に最優先なのは、問題を解決することです。

MBTilesをサーバレスでパースできるライブラリ作りました。

id:hfuさんと先日Twitterで以下のようなやり取りを行いました。

コロッとした地図ファイルの仕様案
一部抜粋

地図が一般人の表現手段として根付くためには、画像や動画、音声と同様、コロッとしたファイル形式とmimetypeが必要だと思うのだけど、そのベースとしてmbtilesというのはどうだろう。
地図の汎用ファイル形式+MIME-TYPEとしてはSVGMAPに期待してたんだけどどうもそういう方向に行きそうにない感じだけど、今ならむしろmbtilesの方が近いところにいる感じがする。

私は地図に関しては、汎用的に扱えるラスタ地図が画像におけるjpeg,pngや動画におけるmpeg,flvのように一般人の扱えるレベルにまで下りてくると思っているのですが、その際に必要なのがコロッとしたファイル仕様だろうと思っています。
バラバラのファイルを大量に配置したり、tilestreamのような配信サーバを用意しないといけなかったり、MapBoxのような配信サービスに預ける意外に配信方法がないというのはまだまだ敷居が高くて、画像や動画のように、個人サーバの上にコロッとしたファイル置いているだけでも配信できるようになり、かつそのファイルを簡単に編集できる編集ツールが準備されて、初めて一般人の手にまで地図が落ちてくるのではないかと思っています。
SVGMAPの開発者の方とも懇意にさせていただいているので、ずっとSVGMAPの複雑なファイル間設定を隠蔽する汎用ファイル形式+MIME-TYPEを作りましょうと言ってきてたのですが、よく考えると今だとmbtilesの方がよほどその立場に近いところにいるんじゃないか?という気がしてきました。

mbtilesは先にも挙げたtilestreamやmapboxのバックエンドに使われているファイル形式ですが、sqliteデータベースの中にタイル化されたファイルを格納する事で、地図を一つのファイル化できている仕様です。
一つのファイル化する事で、地図タイルをバラバラに持つ事による管理の煩雑さ、ファイルシステム上でのシークの速度低下等を解決し、また地図のメタデータUTFGrid等の拡張データも同梱できるようになっています。
編集ツールとしても、まだラウンドトリップできるような編集ツールはないようですが、パブリッシュだけなら、TileMillという編集ツールがあります、という具合に、コロッとしたファイル生成、その編集ツールの存在、という点でも、かなり地図配信のコロッとした仕様の叩き台としてはいい位置にいると思います。

が、残念ながら今のところ、mbtilesでコロッとしたファイルを作っても、sqliteというミドルウェアファイル仕様に依存しているため、ブラウザサイドでのパース方法がなく、配信するにはtilestreamのようなサーバを立てるか、MapBoxのような配信サービスに預けるかしかありませんでした。
何か叩き台レベルでブラウザサイドパース実装ができないかと思っていたところ、sql.jsというブラウザサイドでsqliteを動かすガッツのある実装がありましたので、これをベースに開発してみて、ブラウザサイドでMBTilesをパースできるmbtiles.jsというのを作ってみました。*1
可動サンプルはjbFiddle上で準備しました。
一応、Mac上のChrome25, Safari6.0.3, FireFox19.0.2, Opera12.14, Windows7上のIE10, iOS6上のMobile Safariで動作確認しています。
逆に、動かないのが判ってるのはIE9以下、Androidで、IE9AndroidネイティブブラウザはArrayBuffer周りの実装対応不足、Android ChromeHTML5仕様的には満たしているはずなのですが、メモリオーバーか何かでOS引き連れて落ちてしまいます。
JavaScriptのサイズが2MB、読んでいるmbtilesが10MBあるので、初回アクセス時は結構待たされますが、後はブラウザ側でキャッシュされるので、2回目からはサクサク動くと思います*2
mbtilesを受け渡している以外、一切サーバサイドからのタイルストリームは行っていません。

sqliteという仕様依存のため、当然読んでいる途中からストリーミング的にタイル画像表示と言った事はできず、全部読み込んでからはじめて地図表示開始になります。
またブラウザメモリ空間中にmbtilesファイルを保持展開しますので、当然むちゃくちゃでっかいmbtilesファイルだと確実にブラウザが落ちるだろうと思います。
ですので、1GB近いmbtilesを作った人*3とか知ってますが、そういうのの配信の基盤として想定しているわけではなく、一般の人が作るであろう大きくても10MB程度の地図配信、そういうのの配信にいちいちtilestreamサーバ立てたり、配信サービスに預けたりするのではなく、自分の持ってるストレージにポンと置けばそれで地図配信できるようになる、という状況の叩きにできれば、と思ってます。
もしそういうのが必要というコンセンサスができれば、次は読んでる途中からストリーミングするにはどんな仕様が必要か、とかはじめてそういう議論に行き着けると思うので、その前段階としてのバージョン0.01という事で。

*1:手が回ってなくて、現時点でドキュメントとか未整備ですみません。サンプルで雰囲気掴んでもらえれば幸いです。また、まだタイルとメタデータしか読めなくて、UTFGrid等は未整備です

*2:少なくともうちのMacBookAir, Windows7, iOS6ではサクサク動いています

*3:id:hfu、お前だーw

© Code for History