日本の高速道路整備の変遷をMapbox GL JSで表示してみました

# はじめに

国土数値情報の[高速道路時系列データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N06-v1_2.html)を用いて、高速道路整備の変遷（1962～2020年）をMapbox GL JS（v2）の[タイムスライダー機能](https://docs.mapbox.com/jp/mapbox-gl-js/example/timeline-animation/)で表示してみました。

- [高速道路時系列データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N06-v1_2.html)は以下の国土数値情報の提供サイトよりgeojsonファイル（令和2年）をダウンロードして使用しています。
https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N06-v1_2.html

- 背景地図には[Mapbox](https://www.mapbox.com/)を使用しているため、別途、Mapboxにてアクセストークンの取得及びstyleのURLが必要になります。

★★★↓鉄道バージョンはこちらの記事を参照願います。★★★
[日本の旅客鉄道の変遷をMapbox GL JSで表示してみました](https://qiita.com/syanseto/items/39fe2b52b6366c1b511c)

# アウトプットイメージ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">関西の高速道路整備の変遷（1963～2020年）。データの出典は国土数値情報の高速道路時系列データ。関西出身やけど、路線名はよくわからない🙇‍♂️MapboxGLJSのタイムスライダーは時系列データを表示する際に便利な機能でごわす📝🧐<a href="https://twitter.com/hashtag/BuiltWithMapbox?src=hash&amp;ref_src=twsrc%5Etfw">#BuiltWithMapbox</a> <a href="https://twitter.com/hashtag/Mapbox?src=hash&amp;ref_src=twsrc%5Etfw">#Mapbox</a> <a href="https://twitter.com/hashtag/%E9%AB%98%E9%80%9F%E9%81%93%E8%B7%AF%E6%95%B4%E5%82%99%E3%81%AE%E5%A4%89%E9%81%B7?src=hash&amp;ref_src=twsrc%5Etfw">#高速道路整備の変遷</a> <a href="https://t.co/z1WXysO0I1">pic.twitter.com/z1WXysO0I1</a></p>&mdash; shi_works🌓 (@syanseto) <a href="https://twitter.com/syanseto/status/1429793992363806728?ref_src=twsrc%5Etfw">August 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

※「高速道路時系列データ」(国土交通省) 
(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N06-v1_2.html) を用いて作成

# 前提条件
- [高速道路時系列データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N06-v1_2.html)は令和2年の「N06-20_HighwaySection.geojson」を用いています。
- 下記のコードでMapboxのアクセストークン、styleのURL及びN06-20_HighwaySection.geojsonのパスを入力してください。
- なお、フィルタにはN06-20_HighwaySection.geojsonの属性の「設置期間（開始年）（N06_002）」を用いています。
- また、ラベル（高速道路の名称）にはN06-20_HighwaySection.geojsonの属性の「路線名（N06_007）」を用いています。

# html、CSS、JavaScript
```html:highway_transition.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>日本の高速道路整備の変遷</title>
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
    <link href="https://api.mapbox.com/mapbox-gl-js/v2.4.1/mapbox-gl.css" rel="stylesheet">
    <script src="https://api.mapbox.com/mapbox-gl-js/v2.4.1/mapbox-gl.js"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
        }

        #map {
            position: absolute;
            top: 0;
            bottom: 0;
            width: 100%;
        }
    </style>
</head>

<body>
    <style>
        .map-overlay {
            font: 18px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif;
            position: absolute;
            width: 25%;
            top: 0;
            left: 0;
            padding: 10px;
        }

        .map-overlay .map-overlay-inner {
            background-color: #fff;
            box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
            border-radius: 3px;
            padding: 10px;
            margin-bottom: 10px;
        }

        .map-overlay h2 {
            line-height: 24px;
            display: block;
            margin: 0 0 10px;
        }

        .map-overlay .legend .bar {
            height: 10px;
            width: 100%;
            background: linear-gradient(to right, #006400, #00ff00);
        }

        .map-overlay input {
            background-color: transparent;
            display: inline-block;
            width: 100%;
            position: relative;
            margin: 0;
            cursor: ew-resize;
        }
    </style>

    <div id="map"></div>

    <div class="map-overlay top">
        <div class="map-overlay-inner">
            <h1>日本の高速道路整備の変遷</h1>
            使用データ：<br>
            <a href="https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N06-v1_2.html" target="_blank" rel="noopener">
                国土数値情報, 高速道路時系列データ（国土交通省）</a><br><br>
            <label id="year_label"></label>
            <input id="slider" type="range" min="1962" max="2020" step="1" value="1962">
        </div>
        <div class="map-overlay-inner">
            <div id="legend" class="legend">
                <div class="bar"></div>
                <div align="center">昔（1962年）← → 最近（2020年）</div>
            </div>
        </div>
    </div>

    <script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script>

    <script>
        mapboxgl.accessToken = 'Mapboxのアクセストークンを入力してください';
        const map = new mapboxgl.Map({
            container: 'map',
            style: 'styleのURLを入力してください', // 例）mapbox://styles/mapbox/satellite-v9
            center: [139.7527995, 35.685175],
            zoom: 8
        });

        // ズーム・回転
        map.addControl(new mapboxgl.NavigationControl());

        // フルスクリーンモードのオンオフ
        map.addControl(new mapboxgl.FullscreenControl());

        // スケール表示
        map.addControl(new mapboxgl.ScaleControl({
            maxWidth: 200,
            unit: 'metric'
        }));

        function filterBy(year) {
            const filters = ['all', ['<=', 'N06_002', year]]; // 設置期間（開始年）
            map.setFilter('highway-lines', filters);
            map.setFilter('highway-labels', filters);

            // スライダー表示用ラベル
            document.getElementById('year_label').textContent = year.toString() + '年';
        }

        map.on('load', () => {
            // jsonCallback(highway);
            d3.json(
                'N06-20_HighwaySection.geojsonのパスを入力してください', // 例）data/N06-20_HighwaySection.geojson
                jsonCallback
            );
        });

        function jsonCallback(data) {
            map.addSource('highway', {
                'type': 'geojson',
                'data': data
            });

            // ライン
            map.addLayer({
                'id': 'highway-lines',
                'type': 'line',
                'source': 'highway',
                'layout': {
                    'line-join': 'round',
                    'line-cap': 'round'
                },
                'paint': {
                    'line-color': [
                        'interpolate',
                        ['linear'],
                        ['get', 'N06_002'],
                        1962,
                        '#006400',
                        2020,
                        '#00ff00'
                    ],
                    'line-width': 7,
                    'line-opacity': 0.5
                }
            });

            // ラベル（高速道路の名称）
            map.addLayer({
                'id': 'highway-labels',
                'type': 'symbol',
                'source': 'highway',
                'layout': {
                    'text-field': ['concat', ['to-string', ['get', 'N06_007']]],
                    'text-font': ['Open Sans Bold', 'Arial Unicode MS Bold'],
                    'text-size': 12
                },
                'paint': {
                    'text-color': 'rgba(0,0,0,0.5)'
                }
            });

            // フィルター実行
            filterBy(1962); // 初期表示
            document.getElementById('slider').addEventListener('input', (e) => {
                const year = parseInt(e.target.value, 10); // スライダーで選択した年次を整数化
                filterBy(year);
            });
        }
    </script>

</body>

</html>
```
# 参考文献
https://docs.mapbox.com/jp/mapbox-gl-js/example/timeline-animation/