Maplat UI（UIあり版）をCDNから設定

さて、相変わらず1日遅れのMaplat Advent Calendarですが、20日目はいよいよ、UI付きのMaplatを設定してみましょう。
動くものはこちらになります。 => [CodeSandBox Maplat Advent Calendar day 20](https://codesandbox.io/s/maplat-advent-calendar-day20-0bssw)

UI付きMaplat設定の初日は、CDN経由で設定する方法ですが、これも結局、Maplat Coreの時と同様、CDN経由で指定すると言いながら、パッケージに同梱し切れていないだけにローカルに配置しないといけないファイルがたくさんあります。
しかもUI版の場合、使い方のヘルプに含まれる画面キャプチャ画像などもあるので、結構な数のローカルファイルを配置しないといけません。
[こちらのリンク](https://github.com/code4history/Maplat/blob/master/distribution.zip?raw=true)からダウンロードできる、`distribution.zip`というzipファイルを解凍し、その中にある`parts`、`locales`、`fonts`というフォルダを、index.htmlと同じ階層に配置します[^1]。
![スクリーンショット 2019-12-21 19.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/0e949435-30ee-2724-f283-814cd531803d.png)
上記のように、`parts`、`locales`、`fonts`を配置します。`tmbs`については後で説明します。

その上で、`index.html`、`app.js`、`app.css`及びMaplat設定ファイルを以下のように設定します。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Maplat Advent Calendar Day 20</title>
    <link
      rel="stylesheet"
      href="https://unpkg.com/@maplat/ui@0.6.4/dist/maplat.css"
    />
    <link rel="stylesheet" href="app.css" />
  </head>
  <body>
    <div class="mainview">
      <div id="map_div"></div>
    </div>
  </body>
  <script src="https://unpkg.com/@maplat/ui@0.6.4/dist/maplat.js"></script>
  <script src="app.js"></script>
</html>
```
UI付きMaplat、Maplat UIのCDNは、`https://unpkg.com/@maplat/ui@0.6.4/dist/maplat.css`と`https://unpkg.com/@maplat/ui@0.6.4/dist/maplat.js`になります。

```app.js
var option = {
  appid: "maplat_ac_day20"
};

Maplat.createObject(option).then(function(app) {});
```
Maplat Coreと同様、Maplat UIでも`Maplat.createObject`で`Promise`を受け取ります。

```app.cs
.mainview {
  position: absolute;
  top: 5%;
  bottom: 5%;
  left: 5%;
  right: 5%;
}
```
特に問題なし。

```maplat_ac_day20.json
{
  "app_name": "Maplat Advent Calendar Day20",
  "home_position": [139.5321, 36.249302],
  "default_zoom": 17,
  "start_from": "tatebayashi_ojozu",
  "sources": [
    {
      "mapID": "tatebayashi_ojozu",
      "label": "綱吉時代",
      "setting_file": "https://s.maplat.jp/r/tatebayashimap/maps/tatebayashi_ojozu.json"
    },
    {
      "mapID": "tatebayashi_castle_akimoto",
      "label": "秋元時代",
      "setting_file": "https://s.maplat.jp/r/tatebayashimap/maps/tatebayashi_castle_akimoto.json"
    },
    "osm",
    "gsi"
  ]
}
```
設定はMaplat Coreとあまり変わりませんが、特記すべきは個々の古地図の設定に`label`という設定があること。
これは、地図のセレクタUIの上にラベルとして表示する文字を指定します。
![スクリーンショット 2019-12-21 20.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/6094a86a-f0ac-fa1d-9940-5b8101ebba55.png)
このUIで、サムネイルの上に表示されているラベルを`label`属性で指定します。
また、`app_name`は、スプラッシュスクリーンに表示されるアプリ名に使われます。

さて、これだけ設定すれば動くはず...だといいのですが、実はまだ配置しないといけないファイルがあります。
それは、上記の地図のセレクタUIのサムネイルとして表示する画像です。
これは、`tmbs`フォルダの下に、`tmbs/[地図ID]_menu.png`と言う名前で設定したファイルが読み込まれることになっています。
間抜けなことに、このサムネイルファイルは、地図設定はライブラリに標準同梱されている`osm`、`gsi`、`gsi_ortho`などに対しても、同梱する形では一切用意されていないので、利用者がそれらの標準地図に対するサムネイルも用意して`tmbs`下に配置してやる必要があります。
この辺も近い将来、最低限ライブラリ標準の地図設定に内応するものだけでもなんとかしたいですが、今のところは自前で用意してください。
以下に、ライブラリ標準の地図設定に対応するサムネイルを一応置いておきます。

`tmbs/osm_menu.png`
![osm_menu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/10c923fe-70a8-b90c-cead-42ba11d3ddee.jpeg)
`tmbs/gsi_menu.png`
![gsi_menu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/05401402-fba0-def5-5dab-ec5d7d3dac10.jpeg)
`tmbs/gsi_ortho_menu.png`
![gsi_ortho_menu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/8bba261c-38e4-d403-f834-60195c925911.jpeg)
サムネイルの仕様は、長辺52ピクセルのPNGファイルなので、ご自分の地図を用いられる場合はそれに合わせたものを配置してください。

ここまで設定してやれば、UI付きMaplatが動作します。

![UI付きMaplat動作](https://t.tilemap.jp/maplat/maplat_advent_day20.gif)

UIそのものの使い方は、UI左下の「？」マークボタンを押せば、ヘルプが出るのでそちらを参考にしてください。
![スクリーンショット 2019-12-21 20.21.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/6e96305d-ab2d-6bb5-bb4c-369b06f36897.png)

21日目は、Maplat Coreの時と同様、`npm`経由で設定する方法を書きます。

[^1]: CodeSandboxに設置する際には、`locales`の下のファイルはアップロードではなく、新規ファイルを作って中身をコピーしてください。<br>CodeSandboxのアップロード機能には問題があるようで、アップロード経由だとマルチバイト文字が文字化けしてしまいます。