駅すぱあと路線図でLeaflet.jsを触ってみる（プラグイン篇）

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

駅すぱあと路線図はLeaflet.jsを利用しています。
それはつまり、Leaflet.js用のプラグインも使えるということ。

ということで、今回はいくつかLeafetのプラグインを駅すぱあと路線図で試してみたいと思います。

# はじめに
## 駅すぱあと路線図とは？
「駅すぱあと路線図」とは、株式会社ヴァル研究所が提供している路線図です。
詳しく知りたい方は、以下の記事をご覧ください。
[今から、すぐに、始める駅すぱあと路線図 - 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)


# プラグインとは？
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3)より引用

```
アプリケーションソフトウェアの機能を拡張するために追加するプログラムの一種。
:
誰でも差し替え可能になっているアプリケーションコードの一部分を、プラグインと呼ぶ。
```

要は、プラグインを使えば簡単に駅すぱあと路線図を拡張できる、ということですね。

# 駅すぱあと路線図でLeaflet.jsのプラグインを使ってみる
ここからはいくつかプラグインを試してみたので、その紹介をします。
なお、プラグインの読み込みについては、基本的に以下の様にjsファイルとcssファイルをダウンロードして読み込むだけなので、割愛します。 
読み込み方法については下部にも記載した [参考サイト](#参考サイト) にも書いてあるので、試してみたい方は参考にしてみてください。

※ 取り込み例

```html
<!-- plugin -->
<link rel="stylesheet" href="css/hogehoge.css" />
<script src="js/hogehoge.js"></script>
<!-- plugin -->
```

## BeautifyMarker
いろいろなマーカーを使える様になるプラグイン。自分でマーカーを作るのが面倒で、「Font Awesome Icons」などを使いたい場合に便利。

- [leaflet入門｜プラグインでマーカーのアイコンを変更する（BeautifyMarker） \| kitanote](https://kita-note.com/leaflet-plugin-beautifymarker)
- [GitHub - marslan390/BeautifyMarker](https://github.com/marslan390/BeautifyMarker)

以下の様な感じで、 `setStationMarker` に設定すればOK。

```javascript
:
    options = {
      prefix: 'fa'
      ,icon: 'utensils'
      ,iconShape: 'marker'
      ,borderColor: '#8D208B'
      ,textColor: '#fff'
      ,backgroundColor: '#8D208B'
    };
    rosen.setStationMarker(
      22671,
      {icon:  L.BeautifyIcon.icon(options), draggable: true }
    );
:
```

こんな感じになる。
<img width="387" alt="スクリーンショット 2019-12-08 16.36.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31425/25c62cdb-7c5b-9a3c-d8e3-2fd0eea98d9d.png">



## icon-pulse
パルス的なアニメーションのマーカーを設定できるプラグイン。自分での実装は難しそうだけど、プラグインを使えば簡単にできる。素晴らしい。

- [leaflet入門｜プラグインで現在地マーカーを表示する（icon-pulse） | kitanote](https://kita-note.com/leaflet-plugin-icon-pulse)
- [mapshakers/leaflet-icon-pulse: Leaflet pulsing icon plugin.](https://github.com/mapshakers/leaflet-icon-pulse)


```javascript
:
    rosen.setStationMarker(
      22671,
      {icon:  L.icon.pulse({iconSize:[20,20],color:'red'}), draggable: true }
    );
:
```
こんな感じ。
<img width="332" alt="スクリーンショット 2019-12-08 16.48.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31425/d4267577-0804-37b5-b8d5-bd9ba2031837.png">

## contextmenu
コンテキストメニューを追加するプラグイン。右クリックメニューを追加したい場合に便利。

- [leaflet入門｜プラグインで右クリックメニューを追加する（contextmenu） | kitanote](https://kita-note.com/leaflet-plugin-contextmenu)
- [aratcliffe/Leaflet.contextmenu: A context menu for Leaflet.](https://github.com/aratcliffe/Leaflet.contextmenu)

```javascript
:
    // コンテキストメニューを定義
    var markerContextMenu = {
            contextmenu: true,
            contextmenuItems: [{
                text: '詳細を表示',
                index: 0,
                callback: showMarkerInfo
            }, {
                separator: true,
                index: 1
            }]
    }

    // マーカーにメニューを設定
    rosen.setStationMarker(
      22671,
      markerContextMenu
    );

    // メニューの動作を定義
    function showMarkerInfo(e){
        alert(e.latlng);
    }
:
```
こんな感じ。
<img width="408" alt="スクリーンショット 2019-12-09 22.54.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31425/5ca9978a-bb5a-8060-aad2-5a99b4c52835.png">

# おわりに
今回はLeafletのプラグインを簡単に使えることを確認してみました。
また、Leafletのプラグインは色々とあるので、駅すぱあと路線図の開発をする場合には合わせてプラグインも見てみると、欲しいものが見つかるかもしれません。

# 参考サイト
Leafletのプラグインはいろいろな方が紹介してくれています。
今回は以下のサイトを参考にさせていただきました。

- [Leaflet入門｜おすすめプラグイン（４２選） | kitanote](https://kita-note.com/leaflet-plugin-all)
- [自作地図: leafletで使えるおすすめプラグインまとめ - Qiita](https://qiita.com/pokohide/items/6329f1f92253ced23599)
- [leaflet > Search & popups プラグイン群 (2018.6.13) - Qiita](https://qiita.com/sugasaki/items/750ca1c899eea9a08e8c)