【Leaflet】地図に独自のUIを追加する

ネコニウム研究所

PCを利用したモノづくりに関連する情報を掲載するブログ

【Leaflet】地図に独自のUIを追加する

2022-8-22 | ,

Leafletで作った地図に独自のUIを追加したい!

概要

今回の記事では、Leafletで作った地図に独自のUIを追加する手順を掲載する。

仕様書

環境

  • Leaflet 1.7.1

手順書

今回は、地図の左上と右上に独自のUIを追加してみる。(左上はズームイン・アウトのコントロールの下に追加される)

コードは下記のようになる。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Leaflet Test</title>
    <style>
      .menu-right {
        border: solid 1px;
        background-color: #ffffff;
        border-radius: 4px;
        padding: 8px;
        color: #000000;
      }
    </style>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
    <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
    <script>
      function init() {
        var image = {
          url: "https://blog.nekonium.com/wp-content/uploads/catacombs_of_the_cursed_witch.png",
          width: 2030,
          height: 2730,
        };

        var map = L.map("leaflet-container", {
          crs: L.CRS.Simple,
          minZoom: -1,
          maxZoom: 5,
        });

        var imageBounds = L.latLngBounds([
          map.unproject([0, image.height], 4),
          map.unproject([image.width, 0], 4),
        ]);

        map.fitBounds(imageBounds);
        map.setMaxBounds(imageBounds.pad(0.5));

        L.imageOverlay(image.url, imageBounds).addTo(map);

        var menuRight = L.control({ position: "topright" });
        menuRight.onAdd = function (map) {
          this.ele = L.DomUtil.create("div", "menu-right");
          this.ele.id = "id_menu_right";
          return this.ele;
        };
        menuRight.addTo(map);

        document.getElementById("id_menu_right").innerHTML = "<a target='_blank' href='https://blog.nekonium.com'>ネコニウム研究所</a>";

        var menuLeft = L.control({ position: "topleft" });
        menuLeft.onAdd = function (map) {
          this.ele = L.DomUtil.create("div");
          this.ele.id = "id_menu_left";
          return this.ele;
        };
        menuLeft.addTo(map);

        document.getElementById("id_menu_left").innerHTML = "<a target='_blank' href='https://blog.nekonium.com'><img src='https://blog.nekonium.com/favicon.png' width='30px' height='30px' /></a>";
      }
    </script>
  </head>
  <body onload="init()">
    <div
      id="leaflet-container"
      style="position: absolute; top: 0; left: 0; right: 0; bottom: 0"
    ></div>
  </body>
</html>

右上のUIを追加する部分。

        var menuRight = L.control({ position: "topright" });
        menuRight.onAdd = function (map) {
          this.ele = L.DomUtil.create("div", "menu-right");
          this.ele.id = "id_menu_right";
          return this.ele;
        };
        menuRight.addTo(map);

L.control({ position: "topright" })positionの値に追加するUIの位置を文字列で設定する。
指定できる文字列と一の一覧は下記のとおり。

文字列 位置
topleft 左上
topright 右上
bottomleft 左下
bottomright 右下

L.DomUtil.create("div", "menu-right")の第1引数は追加するタグ(要素)を、第2引数は追加するタグ(要素)のクラス(CSS)を設定する。

this.ele.id = "id_menu_right"で追加するタグ(要素)のIDを設定する。

右上のUIの内容を設定する部分。

        document.getElementById("id_menu_right").innerHTML = "<a target='_blank' href='https://blog.nekonium.com'>ネコニウム研究所</a>";

IDから要素を取得して、要素の内部のHTMLを代入する。
お試しに当サイト名とリンクを代入した。

左上のUIを追加する部分。

var menuLeft = L.control({ position: "topleft" });
        menuLeft.onAdd = function (map) {
          this.ele = L.DomUtil.create("div");
          this.ele.id = "id_menu_left";
          return this.ele;
        };
        menuLeft.addTo(map);

やってることは右上のUIを追加したときとほとんど同じ。

L.DomUtil.create("div")の部分、今回は第2引数を省略してクラス(CSS)の設定を行わない。

        document.getElementById("id_menu_left").innerHTML = "<a target='_blank' href='https://blog.nekonium.com'><img src='https://blog.nekonium.com/favicon.png' width='30px' height='30px' /></a>";

左上のUIの内容を設定する部分。
こちらも右上とほとんど同様。
当サイトのアイコン(画像)を表示してみた。

デモ

CODEPENで動かしてみると下記のような感じ。

See the Pen
Untitled
by 108nen (@108nen)
on CodePen.

CODEPEN上では、JSで追加した要素に対するCSSが効いてない。(編集画面では効いてたんだけども)

まとめ(感想文)

Leafletのライブラリに含まれてる機能でUIを追加してみた。

標準のCSSだけでUIのように表示させる方法もあるので、次回掲載する。