emscriptenでFOSS4Gのススメ(2年ぶり2回目)

  • 2
    Like
  • 0
    Comment
More than 1 year has passed since last update.

kochizufanです。
なんと2年前の記事の焼き直しですが、まだそれほど認知されてないないのと、いくつか実際のプロダクトも出てきたのでそれの紹介していきます。

実際の使用例:奈良ハッカソン「ここ掘れワイワイ」プロトタイプ

とりあえず実際の使用例を一つ。
今年の12月奈良で開かれた、JIPDECや奈良女子大、Code for Nara等が主催共催協力したイベント、「奈良 オープンデータ ハッカソン/データソン」で、私の属したチームが作成した「ここ掘れワイワイ」のプロトタイプです。
奈良の現代地図と古地図が準備されて、下のタイムラインを切り替えるとある時代より前は古地図に切り替わり、また両地図の中心が同期されて動く、というものになっています1
nyampireさんに「謎技術」と評していただいたこの実現方法ですが、みんな大好きgdalのc++によるthinplatespline変換関数を、emscriptenを使ってJavaScriptに変換したものになってます2
QGISのジオリファレンサー等でも中で動作しているであろうロジックを、そのままJavaScriptに持ってきて、リアルタイムに座標変換を行っているのが、「ここ掘れワイワイ」の実現している事です。

で、あらためてemscriptenって何

こちらで開発されている、c、c++で開発されているコードをJavaScript環境で動く形にコンパイルする技術です。
JavaScript化するといっても、cのfor文をJavaScriptのfor文に変換して...といったものではなく、c/c++をllvmで中間コードにコンパイルし、そのコンパイルされたバイナリロジックを、JavaScriptのTypedArray等を駆使して作られた仮想マシン的なものの上で動くようにするものです。
2年前に紹介して以降、Webブラウザ上で走らせるバイナリ規格のようなものも議論が進んでいて、emscriptenも吐けるasm.js規格等の延長線上に、次世代規格としてWebAssemblyという規格が整ったりもしていますが、これまでの経緯から考えても、WebAssemblyへのコンパイルもemscriptenでできるようになると思われます。
なので、今のうちから覚えておいても損はない技術かなと思います。

FOSS4Gをemscriptenでコンパイル実例

実際にFOSS4Gをemscriptenでコンパイルしている実例を紹介しますが、数を紹介するよりこれ1つで十分だろみたいなのを1つ...。

spatiasql.js

これはすごいです。proj、geos、sqlite、zlib、spatilaiteを全部emscriptenでコンパイルしてリンクしてます。
まあ、その分ファイルサイズもでかくて読み込みもデカイですがw。
実際のデモはこんな感じ:デモ
spatiasql.jsデモ
とりあえずサンプルのspatialiteファイルを読み込んでいるようですが、自分の持っているspatialiteファイルも左下から読み込ませる事ができます。
spatialiteファイルを読み込ませた(or デフォルト)上で、画面上半分の領域に空間検索クエリを入力してやって「run」すれば、右下にクエリ結果がjsonで吐かれ、左下の地図にそのjsonをマッピングしたものが出てきます。
これが全部、ブラウザサイドで動いています。

また、メンテできてませんが拙作も一つ...

mbtiles.js

mbtiles仕様のsqliteファイルをクライアントサイドで読み込んで、ブラウザ側で地図タイルとして展開するライブラリです。
小さな地図であれば、タイルサーバを用意しなくても、mbtilesファイルをコロッとした地図提供媒体として、流通させてどこでも展開できます。

デモ

mbtiles.jsデモ

FOSS4Gがどんどんブラウザサイドコンパイルされればいいな

2年前に引き続き、emscriptenのダイマさせていただきましたが、FOSS4G界隈ではWindows向けコンパイルなどコンパイル/リンクに強い人がたくさんいる印象なので、emscriptenコンパイルにも力を入れてくれて、FOSS4Gがどんどんブラウザサイドにポートされればいいなあ、と思ってます。


  1. 何かのサービスに似ている、とか言わない。アイデアは私じゃなく別のハッカソン参加者から出てきたものです。実現するノウハウは私が持ってたので合流しましたが。 

  2. ベースはここで公開してます。今回の適用にあたっては、いろいろ問題が出てきたので手を加えてますが、それはまだ反映できてません。