駅すぱあと路線図でLeaflet.jsを触ってみる（Tooltip篇）

[ヴァル研究所 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/val) 5日目の記事です。

駅すぱあと路線図はLeaflet.jsを利用しています。
駅すぱあと路線図のリファレンスにはないけど、Leaflet.jsのリファレンスにはある機能を触っていきたいと思います。
今回は、Tooletipという機能を利用してみます。

# はじめに
## 駅すぱあと路線図とは？
「駅すぱあと路線図」とは、株式会社ヴァル研究所が提供している路線図です。
詳しく知りたい方は、以下の記事をご覧ください。
[今から、すぐに、始める駅すぱあと路線図 - Qiita](https://qiita.com/zaki_taka4/items/8370b02450c2f46943de)

## Leaflet.jsとは？
Leaflet.jsは、JavaScriptの地図のオープンソースライブラリになります。
駅すぱあと路線図は、このLeaflet.jsを利用しています。

Leaflet.jsについて知りたい方は、以下の記事が参考になりそうです。
[地図ライブラリの本命「Leaflet」を5分で理解&導入する - Qiita](https://qiita.com/mitch0807/items/7ed4eaf6253a9b879ae7)

なお、駅すぱあと路線図は2019年12月3日現在で、Leaflet.jsのバージョン1.5.1を利用しているので、参考にするドキュメントは以下のバージョン1.5.0及び1.5.1用のものを参照します。
[Documentation - Leaflet - a JavaScript library for interactive maps](https://leafletjs.com/reference-1.5.0.html)

# ツールチップとは？
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%84%E3%83%BC%E3%83%AB%E3%83%81%E3%83%83%E3%83%97)より引用。

```
ツールチップ（英: tooltip）とは、マウスオーバーした際に表示される枠内の補足説明などのことである。
```

GithubやSlackなんかで「○ days ago」みたいなところにマウスを当てると、タイムスタンプが表示されたりするやつですね。
（↓ こんなやつ）
<img width="697" alt="スクリーンショット 2019-12-03 18.59.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31425/ea22cc3a-dfbe-0b5d-397b-2f02ce23189f.png">


Leaflet.jsにもTooltip機能はありますが、駅すぱあと路線図のリファレンスにはありません。

# 駅すぱあと路線図からLeaflet.jsのTooltipを触ってみる
今回は、駅すぱあと路線図の駅のマーカーにツールチップを設定してみます。

Leaflet.jsのTooltipは、Markerオブジェクトに設定できるものになります。
https://leafletjs.com/reference-1.5.0.html#tooltip

駅すぱあと路線図では、setStationMarkerのようなメソッドの戻り値で、Leaflet.jsのMarkerオブジェクトを取得することができます。
ただし、メソッドの戻り値自体はPromiseオブジェクトになるため、Promiseの知識が多少必要になります。ただ、Promiseの使い方についても、駅すぱあと路線図のリファレンスに説明があるので、それを見れば大体わかります。
http://rmap.ekispert.jp/production/doc/document.html#preface

## サンプルコード
駅すぱあと路線図を表示するテンプレートは[駅すぱあと路線図サンプル集](http://rmap.ekispert.jp/sample/)のサイトからダウンロードできます。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello.html</title>

<link rel="stylesheet" href="https://rmap.ekispert.jp/production/rosen.css" />
<script src="https://rmap.ekispert.jp/production/rosen.js"></script>

<style>

  html, body { width: 100%; height: 100%; }
  #map { width: 100%; height: 100%; }
  /* ツールチップにCSSを適用することもできる */
  .custom-tooltip {background-color: rgba(255,0,0); color: white;}

</style>

<script type="text/javascript">

  var rosen;

  function init() {
    rosen = new Rosen("map", {            
      apiKey: "************",             // アクセスキー
      apiSetting: "https",                // HTTPS版のAPIサーバを指定
      tileSetting: "https",               // HTTPS版のタイルサーバを指定
      centerStation: 22671                // 初期表示の位置を高円寺駅に設定
    });

    // 高円寺駅にカスタムマーカーをセット
    rosen.setStationMarker(22671).then(function (marker) {
      // カスタムマーカーにツールチップを設定
      marker.bindTooltip("高円寺", {
        offset: [0,0],
        direction: "center",
        // permanent: true,
        // sticky: false,
        // opacity: 1.0,
        // className: 'custom-tooltip'
      });
    });
  }

  window.addEventListener('load', init);

</script>
</head>
<body>
  <div id="map"></div>
</body>
</html>
```

## サンプルコードのポイント
### PromiseからMarkerオブジェクトを取得してTooltipを設定する
```javascript
:
    rosen.setStationMarker(22671).then(function (marker) {
      // カスタムマーカーにツールチップを設定
      marker.bindTooltip("高円寺", {
        offset: [0,0],
        direction: "center",
      });
    });
:
```

駅すぱあと路線図の[setStationMarkerのリファレンス](http://rmap.ekispert.jp/production/doc/document.html#rosen-setstationmarker)に、`指定した駅コードの駅にマーカーをセットします。 成功時コールバックの引数は L.Marker オブジェクトです。` という説明があるので、成功時のコールバック引数に `bindTooltip` を設定します。

## デモ
こんな感じで簡単に駅すぱあと路線図にLeaflet.jsのTooltipを適用することができました。
<img width="517" alt="スクリーンショット 2019-12-03 18.43.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31425/56859470-9547-8996-460f-3216a2cf2a62.png">

駅すぱあと路線図はズームアウトするとピンを立てた駅が何か分かりづらくなってしまいますが、Tooltipを利用するとマウスオーバーするだけで何駅かを表示することもできたりするので便利ですね。

<img width="669" alt="スクリーンショット 2019-12-03 18.51.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31425/8762c6c7-b2ed-70c9-9c6b-249fcb4f907c.png">

# おわりに
自分はJavaScriptもLeaflet.jsも詳しくないため、今回は簡単になりましたが、Leaflet.jsのドキュメントを見るとTooltipにイベントを設定することもできたりするなど、色々と拡張することができそうです。

とりあえず今回は、簡単に駅すぱあと路線図からLeaflet.jsを触ってみることが分かったので、他にも試してみたいと思います。