古地図ビューアライブラリMaplatの紹介

これは [FOSS4G アドベントカレンダー 2018](https://qiita.com/advent-calendar/2018/foss4g) の 24 日目の記事です。
と書きつつ予定通りの日程であげられませんでした、すみません。

私が開発しているFOSS4Gプロジェクト[^1]である、古地図ビューアライブラリ**Maplat**の紹介記事を書きます。
どんな方向性で書こうか、ハンズオン的なものにしようかなどと悩みましたが、<ruby>まだ十分な知名度もないだろうと思い<rp>（</rp><rt>ハンズオン用データ作成するの面倒臭かったので</rt><rp>）</rp></ruby>、やはり一度紹介をメインにした記事をFOSS4Gアドベントカレンダーの場で書くことにしました。

### Maplatとは？

古地図や絵地図といった、必ずしも正確な縮尺で描かれているわけではない地図を、正確な地図とぴったり重なるように切り替えたり、GPSで地図の上に現在地を表示したりして、観光街歩きや地域学習などに利用できるようにするビューアライブラリです。
Githubの[こちらのレポジトリ](https://github.com/code4nara/Maplat/wiki)で、MITライセンスでオープンソース公開されているライブラリで、れっきとしたFOSS4Gプロダクトです。
既存のGISだと、古地図のような不正確な地図を正確な地図やGPSと連携させようとすると、下の画像のように、古地図の側を歪めて無理やり正確な位置に合わせてやる手法しかありませんでした。
これは古地図などが持つ美的特性などを著しく損ない、それが古地図などを観光や教育の場などで利用する機会が増えることを妨げていました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10108/6f608dd2-ec61-e9a5-6dc7-ecc47bcf6bbd.png)
これに対し、Maplatでは古地図は歪めず、そのまま使います。
また、古地図と正確な地図の間の座標変換計算手法も、既存のGISと同じ枯れた計算方法を用いています。
ではどのようにして古地図と正確な地図を重ね合わせているかと言うと、常に表示されている地図の中心点ではリアルタイムに座標変換計算を行い、古地図と正確な地図の間でぴったりと位置を合わせつつ、その周辺では周辺点の座標変換結果からざっくりと方角と縮尺を算出し、それを適用することで、ふわっと「なんとなく重なっている」感じを実現しています[^2]。
これにより、古地図などを美的価値を保ったまま、観光や教育で利用されやすくすることを狙っています。
下の図は、実際にMaplatを使って、複数の古地図と現代地図を切り替えた様子を示しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10108/f4f2d78e-b266-4a2d-88e1-44b0e6d59be3.png)
このMaplatの手法は、国土地理院主催のGeoアクティビティコンテスト2018で、最優秀賞、教育効果賞、来場者賞の史上初の三冠をいただくことができました[^3]。
特に、国土地理院長など国土地理院の方々より、ぴったり合わせることにこだわらず大まかに合わせることにより、古地図を歪めずに重ね合わせる手法について、地図を正確に合わせることだけを常に考えている国土地理院の中では出てこない発想だ、との評をいただきました。

実際に使ってどんなものかを試したい方々は、ぜひ以下の公式デモサイト群を試してみてください。

* [ぷらっと奈良](https://s.maplat.jp/r/naramap/)
* [ぷらっと会津若松](https://s.maplat.jp/r/aizumap/)
* [ぷらっといわき](https://s.maplat.jp/r/iwakimap/)
* [ぷらっと館林](https://s.maplat.jp/r/tatebayashimap/)
* [ぷらっと東京中央区](https://s.maplat.jp/r/chuokumap/)

### 既存技術との比較

ここまで読んで、どこかで見たことのある技術だな、と思われた方もいるかもしれません。
実は古地図を歪めずに現在地や正確な地図と連携させる技術には、他に京都のStroly社によるStrolyというサービスが存在します[^4]。

StrolyとMaplatの大きな違いは、Strolyはサービスであるのに対しMaplatはライブラリであるという点です。
StrolyもMaplatも、古地図などを正確な地図と連携させるために、データエディタを使って古地図上の点と正確な地図上の対応点のリストを作る点では変わりありません。
が、Strolyではそのエディタがオンライン提供されていて、エディタでの編集が終わればすぐに古地図アプリをパブリッシュして利用することが可能なのに対し、Maplatではエディタがオンラインではなくローカルアプリ[^5]での提供で、エディタで生成した設定ファイルを仕様に従ってサーバ上に配置しなければ動作しません。

そこだけ注目するとStrolyの方が良さそうですが、Strolyはサービスの悲しさ、簡単に編集公開できる代わりに、決められた以上のことはできません。
インターネット経由でのサービスなので当然、イントラやローカル環境で動作させることはできませんし、IFRAME経由以外でWebページへの埋め込みもできません。
APIを通じて外部から制御することもできませんし、Stroly社に直接依頼してアプリを作ってもらうことを除いて、ネイティブアプリに埋め込んだりすることもできません。
が、Maplatは設定方法さえ覚えればなんでもできます。
喩えるならば、Strolyは古地図のブログサービス、Maplatは古地図のWebサーバ(Apacheやnginx)のようなもの、とも言えるかもしれません。
また、下の機能差一覧表を見ていただければわかる通り、実際Maplatの方が提供している機能も圧倒的に豊富です。
簡易に取り組むにはStrolyが便利ですが、Maplatの使い方を覚えればStrolyを選ぶ必然性は全くありません[^6]。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10108/a0422331-f3fc-3a8a-7479-6242169e2df2.png)
また、Maplatが地図の座標変換は枯れたGISで実績のある手法[^7]を使っているのに対し、Strolyは独自で実績のない計算手法を用いているため、地図座標の変換性能にも両者には大きな差があります。
下の図はパリの古地図の上に格子状に定義した点群を、一旦経緯度に変換し、その後再度古地図側の座標系に逆変換した結果をプロットしたもので、黄色がStroly、赤色がMaplatの変換結果を示しています。
当然、格子状に戻ってきた方が正確に座標を変換できたことになりますが、一目瞭然にStrolyでの変換結果は大きな乱れが発生しており、変換後の平均のピクセル誤差も、Maplatでは丸め誤差範囲に収まりますが、Strolyでは11ピクセル以上の誤差が発生しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10108/2bc65dbe-2f8c-631c-bbeb-9924ca848a8a.png)
このように既存の類似技術と比較しても、Maplatは大きなアドバンテージを持っています。
このような技術比較含め、Strolyの特徴をまとめたパンフレットのpdfは[ここ](https://drive.google.com/file/d/1rEjkN2d5AvVhB0nY8OUvwZaCxQIHe9TD/view)で見ることができますので、ぜひご一覧ください。

### Maplatサイトの作成方法

では実際にMaplatで古地図サイトを公開する際の手順について、示したいと思います。
新たに手順書を起こすというよりは、あちこちに書き散らかした手順を集約する形で示します。
記載内容が不十分でわかりにくいところもあるかもしれませんが、わからないところがあれば遠慮なくgithubのIssues（エディタの使い方の場合は[こちら](https://github.com/code4nara/MaplatEditor/issues)、ライブラリの使い方の場合は[こちら](https://github.com/code4nara/Maplat/issues)）で問い合わせてください。

#### MaplatEditorをダウンロード

古地図データを作成するには、データエディタであるMaplatEditorをダウンロードします。
ダウンロードするには、[こちらのページ](https://github.com/code4nara/MaplatEditor/wiki)に最新版のダウンロードリンクがありますので、そちらからMac/Windows対応のバイナリをダウンロードしてください。
この記事を書いている時点での最新版は0.2.0になっています。

#### 古地図データを作成する

次に、MaplatEditorを使って古地図の対応点データを作成します。
作成方法は[こちらのページの記述](https://github.com/code4nara/MaplatEditor/wiki/How-To-Use-(1)-Basic-Usage)を参考にしてください。
いくつかの地図データの作成が完了したら、アプリの設定に移ります。

#### アプリを設定する

Maplatアプリの設定方法は[こちらのページ](https://github.com/code4nara/Maplat/wiki/How-to-set-up-Maplat-Application)に記述されています。

#### ドキュメンテーションに参加してください

Maplatの設定方法に関するドキュメントは現状、以上程度しかありません。
言い訳になりますが、1人で開発していますので、自分で実現したい機能の実装に追われドキュメンテーションが十分にできていません。
が、オープンソースですので、開発だけでなくドキュメンテーションを含む様々な必要な作業が、広く万人に開かれています。
ぜひMaplatに一度接していただいて、ドキュメンテーションその他の貢献に参加いただければ大変嬉しいです。

### Maplatの今後

Maplatの今後の方向性について述べて、今回の記事を終わりにしたいと思います。
Maplatのライブラリを開発するだけでなく、いくつかのデモサイトを準備する中でいくつかの古地図に深く接してみて気づいたのですが、どの古地図にも、深く調べれば調べるほど、新たな発見があります。
たとえば、この[奈良の古地図のこの場所](https://s.maplat.jp/r/naramap/#!s:nara_ezuya/b:osm/x:13149521.787804788/y:12044692.006800443/z:4.263598430979017)には、変体仮名で「きかいが嶋」と書かれています。
ここは以前私が奈良に住んでいた頃家があった場所の近くなのですが、現在、この場所にこのような名前の地物は残っていません。
なので、なんだこれは？と思って奈良の歴史書、地誌などをひっくり返して調べてみたところ、[このWikipediaの記事](https://ja.wikipedia.org/wiki/%E9%AC%BC%E7%95%8C%E3%83%B6%E5%B3%B6_(%E5%A5%88%E8%89%AF%E5%B8%82))がまるまる一つ起こせるくらいの記録が判明したりもしました。
このように、各々の古地図は単に現代地図と切り替えて楽しい、現在地を表示して楽しいというだけではなく、それぞれの中に深いストーリー性、コンテンツ性を隠し持っています。
そのようなコンテンツ性をうまく閲覧者に伝えられるツール、単なる地図ビューアではなく一種のプレゼン能力も持ったツールとして、Maplatを今後発展させていきたいと考えています。

[^1]: なんと、ちゃんと[OSgeoWikiページ](https://wiki.osgeo.org/wiki/Maplat)もあるのです、一応。
[^2]: 特許出願中技術です。特願2017-218223。
[^3]: [Geoアクティビティコンテストの結果ページ](http://www.g-expo.jp/geocon/award.html)、[インターネットWatchのレポート記事](https://internet.watch.impress.co.jp/docs/column/chizu3/1155651.html)、[私のブログでの報告記事](https://blog.chizuburari.jp/entry/2018/12/14/164016)などを参照してください。
[^4]: というか、私自身が元々Stroly社の前身に一時期在籍した者です。Maplatも、元々は私が同社合流前に思いついていた手法で、私が同社に居続けていればStroly2.0になるはずだった技術です。アイデアを思いついていただけで当時は実装まで持っていく力がなく、同社退社後にアイデアを形にしたので、Stroly2.0にはなりませんでしたが。
[^5]: MaplatEditorといい、[こちらのgithubレポジトリ](https://github.com/code4nara/MaplatEditor/wiki)で配布しています。WindowsとMac双方に対応しています（ただしWindowsは64ビットのみ）。
[^6]: MaplatがStrolyに劣っているすぐに公開可能なオンラインエディタについても、2019年にクラウドファンディングで対応することを現在検討しています。
[^7]: 対応点による三角網を用いた座標補完計算。