mapboxを使って、簡単なルート検索と避難所マップを作る。

# mapboxとは
Mapboxは、地図や位置情報に関連するデータを提供するためのプラットフォームです。
開発者がWebサイトやモバイルアプリケーションにカスタマイズ可能なインタラクティブマップを組み込むためのツールやAPIを提供しています。

今回の記事はWebでの組み込みを想定しています。

料金などは公式サイトをご確認ください。

https://www.mapbox.com/

# 1. 基本の操作

## 地図表示
```html:HTML
<div id="map"></div>
```

```js:JS
import mapboxgl from 'mapbox-gl';
import 'mapbox-gl/dist/mapbox-gl.css';

mapboxgl.accessToken = 'Access tokens', //アクセストークンは管理画面から取得

const map = new mapboxgl.Map({
  container: 'map',
  center: [139.7683016334902, 35.683571330189196],  //初期表示の座標[経度,緯度]
  zoom: 15,  //ズームレベル
  style: 'mapbox://styles/mapbox/streets-v12', //地図のスタイル
  language: 'ja', //言語設定
});
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/551d89ba-7305-a99c-3027-d0b84fee0efa.png)

## コントローラーをつける
```js:JS
//コントローラー - デフォルトではズームボタンとコンパスが表示される
map.addControl(new mapboxgl.NavigationControl());
//フルスクリーンボタン
map.addControl(new mapboxgl.FullscreenControl());
```

| option | value | 説明 |
|:--|:--|:--|
| showCompass | `true` `false`  | コンパスの表示設定。<br>defaultは`true`|
| showZoom | `true` `false`    | ズームインボタンとズームアウトボタンの表示設定。<br>defaultは`true` |
| visualizePitch | `true` `false`    | コンパスのX軸を回転させてピッチを視覚化・<br>defaultは`false`|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/0c8f1571-f99b-6b8c-65ba-b9817658a929.png)

## マーカーをつける
```js:JS
//マーカー
const marker = new mapboxgl.Marker()
  .setLngLat([139.7683016334902, 35.683571330189196]) //マーカーの座標
  .addTo(map);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/de1df987-a61a-f927-3ebf-e56e79b576c0.png)

## マーカーのデザインを変更する
### 1. 色変更
```js:JS
//マーカー
const marker = new mapboxgl.Marker({
  color: '#FF0000', //マーカーの色
})
.setLngLat([139.7683016334902, 35.683571330189196]) //マーカーの座標
.addTo(map);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/35afe594-c892-c1ef-4a97-2e3dbbebb39e.png)

### 2. 任意のHTML要素をマーカーに指定
```html:HTML
<div id="map" class="map"></div>
<!-- マーカー -->
<div id="marker" class="marker">😃</div>
```

```js:JS
const marker = new mapboxgl.Marker({
  element: document.querySelector('#marker'), //マーカーの要素を指定
})
.setLngLat([139.7683016334902, 35.683571330189196]) //マーカーの座標
.addTo(map);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/f18b40c2-48f1-3db8-12d5-f775d9ceae2d.png)

# 2. ルート検索機能
簡単に実装するならプラグインのmapbox-gl-directionsを使用。
ただしカスタマイズに制限があったり、一部使用できないAPIがあります。

https://github.com/mapbox/mapbox-gl-directions


```
npm install @mapbox/mapbox-gl-directions
```

```html:HTML
<div id="map" class="map"></div>
```
```js:JS
import mapboxgl from 'mapbox-gl';
import 'mapbox-gl/dist/mapbox-gl.css';
import MapboxDirections from '@mapbox/mapbox-gl-directions/dist/mapbox-gl-directions';
import '@mapbox/mapbox-gl-directions/dist/mapbox-gl-directions.css';

mapboxgl.accessToken = 'Access tokens', //アクセストークンは管理画面から取得

const map = new mapboxgl.Map({
  container: 'map',
  center: [139.7683016334902, 35.683571330189196],  //初期表示の座標[経度,緯度]
  zoom: 15,  //ズームレベル
  style: 'mapbox://styles/mapbox/streets-v12', //地図のスタイル
  language: 'ja', //言語設定
});

// コントローラー
map.addControl(new mapboxgl.NavigationControl()); //ズームボタン、コンパス
map.addControl(new mapboxgl.FullscreenControl()); //フルスクリーンボタン

// ルート検索機能
map.addControl(
  new MapboxDirections({
    accessToken: mapboxgl.accessToken,
    language: 'ja', //言語設定
  }),
  'top-left' //表示位置
);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/a38423fd-d12b-6d89-b80a-47e1beef3398.png)

言語設定をしても入力欄などは英語のまま。
日本語には対応できないため、デザインにこだわりたい方や機能を充実させたい場合はMapbox Directions APIを使って自作したほうがいいでしょう。

https://docs.mapbox.com/help/tutorials/getting-started-directions-api/

# 3.避難所マップ

避難所のデータをダウンロード。
使用許諾条件があるので、確認して使用してください。

https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P20.html

ダウンロードしたZipファイルを「Resources」>「Tilesets」>「New tileset」からアップロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/187e786d-8129-0b02-990e-fc447199a056.png)

アップロード可能なフォーマットやファイルサイズの制限はこちらに。

https://docs.mapbox.com/studio-manual/guides/geospatial-data/#accepting-file-types-and-transfer-limits

「Styles」>「New style」で新しいスタイルを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/ea330719-324b-37a5-6aed-42db9f177c04.png)


「Untitled」を編集して、スタイルの名前をつけておきます。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_588611_c0a73db5-bb76-901c-3b35-a1020febcdca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/eec1e2f6-9e38-cb80-7440-9e52f3288484.png)


「+」マークから新規レイヤーを追加。
「Source」から先ほどアップしたデータを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/3f533836-7afc-fa61-7a3c-cfe0dee6af17.png)

レイヤーを選択すると、スタイルの調整ができる。
今回はデフォルトで用意されているアイコンに変更しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/b5740324-b4f8-301a-2fc0-32db3d73dd15.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/5de0e045-1772-64ed-d080-30934c0c671e.png)

スタイルが調整できたら、「Publish」ボタンをクリック。
スタイルを公開する。

![名称未設定-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/90a5a71a-7920-9061-de13-0b5e0df3524c.png)

管理画面から作成したスタイルのURLをコピーし、コードに貼り付ける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/e9c56cb2-2914-522d-4486-0bcfe065688a.png)

```js:JS

const map = new mapboxgl.Map({
  container: 'map-hazard',
  center: [139.7683016334902, 35.683571330189196], //初期表示の中心座標[経度,緯度]
  zoom: 15, //ズームレベル
  style: 'スタイルのURL', //地図のスタイル
  language: 'ja', //言語設定
});

```

反映まで少し時間がかかりますがこれで完成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588611/4e8f6e5b-1c32-596c-ebbe-0c8139254d0f.png)

# 最後に
最近mapboxを触り始めましたがなかなかに好印象。
プラグインも今回紹介したルート検索以外にも色々あるので試していきたい。

https://docs.mapbox.com/mapbox-gl-js/ja/plugins/