Maplat、2019年の更新について

例年、[FOSS4G Advent Calendar](https://qiita.com/advent-calendar/2019/foss4g) の中で枠をもらっていた[Maplat](https://github.com/code4history/Maplat/wiki)です。
当然今年も書くつもりだったところ、12月1日にAdvent Calendarが始まっていることに気付いて見てみると...全枠埋まってたムキー！！

どうしたもんかと思いましたが、もうMaplatの5年の蓄積があれば、小ネタであれば単独でAdvent Calendarネタだって立ち上げてられるんじゃないか？と思って立ち上げてみました！
果たして一人でどこまで埋められるのか！
それとも、もしかして1人、2人でも参加者は現れてくれるのか！

さて、ほとんどの人にとってMaplatとは初耳だと思いますので、初日は簡単に紹介をいたします。
といっても大筋は、実は去年のFOSS4G Advent Calerndar記事で紹介されてしまっています（[古地図ビューアライブラリMaplatの紹介](https://qiita.com/kochizufan/items/b830594b482d6555e977)）。

なので今年はまずは、昨年度の機能追加を含む、昨年度作った資料の紹介から。

* [Maplat紹介パンフレット（日本語版）](http://bit.ly/maplat_flyer)
* [Maplat紹介パンフレット（英語版）](http://bit.ly/maplat_flyer_en)
* 昨年東京で行われた、国際地図学会での[口頭発表資料（英語）](http://bit.ly/maplat_icc)
* 秋の[FOSS4Gで発表されたMaplat資料](http://bit.ly/maplat_f4g_kbe)

上記資料に目を通していただければ、この記事の内容プラス昨年の紹介記事の内容は網羅していますが、一応本記事でも今年の差分を簡単にピックアップします。

#### 全単射変換から同相変換へ
これは新たに何かを開発したわけではなく、名乗りを変えただけです。
Maplatの特徴として、トポロジーエラーのないデータを作るという条件を満たせば、異なる座標系の地図間で1対1変換が可能（これを数学用語で[全単射](https://ja.wikipedia.org/wiki/%E5%85%A8%E5%8D%98%E5%B0%84)といいます）なため、何度座標変換を繰り返しても、必ず元の座標に返ってくるという特徴があります。
なので全単射変換保証と名乗っていたのですが、今年、国土地理院の鎌田参事官より、Maplatは「全単射」だけでなく「[連続](https://ja.wikipedia.org/wiki/%E9%80%A3%E7%B6%9A_(%E6%95%B0%E5%AD%A6))」（座標系上の隣の点が、変換先でも必ず隣に来る）も実現しているよね、「全単射かつ連続性の維持」を実現していれば、それは「[同相](https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%9B%B8%E5%90%8C%E5%9E%8B)」というより高度な概念を実現していることになるので、そう名乗った方がいいんじゃないか、とアドバイスを受けました。
それゆえ、今年からは同相を実現するライブラリと名乗っています。

#### 1枚の画像に複数の地図が含まれるケースに対応
「1枚の画像に複数の地図が含まれる」と言ってもイメージが湧かないかもしれませんが、昔の地図帳なんかで、日本全図なんだけど、北海道が日本海あたりに描かれて、沖縄が小笠原の東あたりに描かれるような地図って見覚えないでしょうか？
そんな感じで、1枚の画像の中で不連続に、異なる地域の地図が描かれたり、あるいは拡大図、縮小図が描かれるようなケースに対応しました。
もっとも、これは新機能というよりは、対抗技術であるStrolyという技術では既に実現できていたことなので、それに追いついたという位置付けになります。

#### 線を線に変換する機能に対応
これまでは現実には曲線な道路が、古地図や絵地図上で省略して直線で表現されていたような場合、ユーザがその道路の上を歩いている時にそのGPS位置を常に道路上に表示しようとすると、地図データを作る際に職人芸が必要でした。
2019年より、これを明示的に簡単に指定できるような機能を作りました。
原理などは[この資料](https://speakerdeck.com/kochizufan/maplatfalsezui-xin-zhuang-kuang-liu-xing-rifalsegtfstomokorabositemita-shen-hu-baziyon?slide=20)に詳しく述べられています。
この機能を利用して、バス路線図の経緯度データやバスの現在地を、抽象的な路線図の上の表示したりなどというようなことも実現できるようになりました。
といいつつ、[デモサイト](https://s.maplat.jp/r/uno_bus.html)が今、バスの現在地を取る部分がうまく動かなくなっていて動作しないので、[こちらの資料](https://speakerdeck.com/kochizufan/maplatfalsezui-xin-zhuang-kuang-liu-xing-rifalsegtfstomokorabositemita-shen-hu-baziyon?slide=23)で雰囲気を掴んでください。
早急に直すようにします。

#### JavaScriptライブラリの構成が、ES2015のモジュール構成に対応

元々、Maplatは[単独リポジトリ](https://github.com/code4history/Maplat/wiki)の中に、基本となる座標変換ライブラリも、地図APIも、地図UIも、はてはiOS/Android対応SDKまで書き散らかした構成だったのですが、リポジトリを整理し、JavaScriptは

* [maplat_tin](https://github.com/code4history/MaplatTin): 座標変換を担う心臓部ライブラリ。
* [maplat_core](https://github.com/code4history/MaplatCore): 地図の表示とAPI提供を担う。UIのないMaplat。
* [maplat_ui](https://github.com/code4history/Maplat): MaplatのUIを提供するライブラリ。これまでのMaplatレポジトリを受け継ぐ。

に再編しました。
またその際、ES2015のモジュール構成に対応し、[npm](https://www.npmjs.com/)にもそれぞれ登録しましたので、webpack/babel環境などでも使ってもらえるようになっています。
（もちろん、従来のES5でのscript呼び出しで動くJSファイルも提供しています。）

もっとも、外形だけ辻褄合わせただけで中身はバリバリまだES5構文が残っていたりするので、それを今後は整理するのと、Maplatのデータエディタであるところの[MaplatEditor](https://github.com/code4history/MaplatEditor)がまだES2015モジュール利用の構成になっていないので、その辺をちゃんとするのが今後の課題です。

#### モバイルライブラリが、KotlinやSwiftに対応した
JavaScriptライブラリと同様、モバイルネイティブライブラリもリポジトリを分離しましたが、

* [MaplatAndroid](https://github.com/code4history/MaplatAndroid): Android向けMaplatViewライブラリ。
* [MaplatiOS](https://github.com/code4history/MaplatiOS): iOS向けMaplatViewライブラリ。

その時ほぼ同時に、地味に各プラットフォームの新言語であるSwiftやKotlinベースに書き換えました。
既存のObjective-CやJavaでも動くように作ってありますので、旧環境新環境双方で使っていただくことが可能です。

-----
といったあたりが今年のMaplatの進化の一覧です。
では、次の記事から、簡単な利用法などを毎日少しずつ述べていきたいと思います！