ローカル環境にタイルサーバを立ててLeafletを用いてオフラインで地図を描画する

調査に丸一日かかったが、以下の組み合わせでうまく行くことがわかった。

1. タイルサーバにはtileserver-glを使用する
2. ローカルに準備するタイルはMaptiler Dataのサイトから.mbtiles形式のものをダウンロードする
3. LeafletのtleLayer()関数でxyzタイルサーバを呼ぶ

1. tileserver-glのインストール

$ npm i -g tileserver-gl

2. タイルデータのダウンロード

Maptiler DataからDatasetsを選択

OpenStreetMap vector tilesを選択。

ナイロビのデータで31MBくらい。拡張子は.mbtiles。

3. タイルサーバを起動

$ tileserver-gl osm-2020-02-10-v3.11_kenya_nairobi.mbtiles

4. leafletのtileLayerを使って地図をレンダリング

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>test</title>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.0/dist/leaflet.css" />
    <script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js"></script>
    <script>
      function init() {
              var mymap = L.map('mapcontainer');
              mymap.setView([-1.091176, 37.011073], 15,);
              L.tileLayer("http://localhost:8080/styles/basic-preview/{z}/{x}/{y}.png").addTo(mymap);
            }
    </script>
  </head>
  <body onload="init()">
    <div id="mapcontainer" style="width:600px;height:600px"></div>
  </body>
</html>

できた。