LoginSignup
2
0

More than 3 years have passed since last update.

Leaflet を使ってみる

Last updated at Posted at 2020-03-20

Leaflet という地図描画ライブラリ https://leafletjs.com/ を使って、地図上で次のようなことをやってみました。

  • OpenStreetMap を表示する
  • マーカーを置く
  • マーカーをクリックしたときの説明・写真を追加する
  • 円を描く
  • 多角形を描く

上記のようなことであれば、短いコードで表現できるため便利だなと感じました。

ほんとうは、「あるエリア」(たとえば「北海道だけ」とか) を塗りつぶすというのがやりたかったのですが、今回はあきらめてます。ただ、「多角形を描く」の応用のような気がしますので、データさえそろえば達成できそうな感触はつかめました。

また、今回の記事は、次のサイトを参考にしました。大変わかりやすかったです。

OpenStreetMap を表示する

OpenStreetMap https://www.openstreetmap.org/ は、地図データを供給してくれるサイト。Google Map の代替として最近よく目にします。

Leaflet 自体は地図データを持っていないので、OpenStreetMap を地図データの供給元として設定してみる、というのが以下のサンプルコードになります。

image.png

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.0/dist/leaflet.css" />
    <script src="https://unpkg.com/leaflet@1.3.0/dist/leaflet.js"></script>
    <script>
      function init() {
        //地図を表示するdiv要素のidを設定
        var map = L.map('mapcontainer', {zoomControl:false});
        // 縮尺表示
        L.control.scale({maxWidth:200,position:'bottomright',imperial:false}).addTo(map);
        // ズームコントロール (マウスのホイールコロコロがあれば不要。デフォルトは左上)
        L.control.zoom({position:'bottomleft'}).addTo(map);


        // オープンストリートマップ
        var osm = L.tileLayer('http://tile.openstreetmap.jp/{z}/{x}/{y}.png',
          {attribution: "<a href='http://osm.org/copyright' target='_blank'>OpenStreetMap</a> contributors" });
        osm.addTo(map);
        var mpoint = [50.086474, 14.411526]; // プラハ、カレル橋
        map.setView(mpoint, 15);
      }
    </script>
  </head>
  <body onload="init()">
    <div id="mapcontainer" style="position:absolute;top:0;left:0;right:0;bottom:0;"></div> <!-- ページに目いっぱい表示 -->
  </body>
</html>

マーカーを置く

image.png

        var mpoint = [50.086474, 14.411526]; // プラハ、カレル橋
        map.setView(mpoint, 15);

// ★ 以下を追記
        // クリック時の写真を追加 (写真データは tabinaka.co.jp から拝借)
        var pop1 = L.popup({maxWidth:550}).setContent(`カレル橋 (チェコ / プラハ)<br><img src="https://tabinaka.co.jp/magazine/wp-content/uploads/2019/09/shutterstock_369258188.jpg" style="width:240px;">`);
        L.marker(mpoint, {title:"カレル橋"}).bindPopup(pop1).addTo(map);

円や多角形を描く

image.png

        L.marker(mpoint, {title:"カレル橋"}).bindPopup(pop1).addTo(map);

// ★ 以下を追記
        // 円を描く (赤の円。同心円で2つ。内側は「塗り」あり)
        L.circle(mpoint, { radius: 500, color: "red", fill: true, weight: 2 }).addTo(map);
        L.circle(mpoint, { radius: 1000, color: "red", fill: false, weight: 1 }).addTo(map);

        // 多角形を描く (正方形になるかな?と思ったけど、緯度が高いせいか縦長になっている。赤道付近で試すと正方形になった)
        var delta = 0.005;
        var arealatlons = [mpoint, [mpoint[0], mpoint[1]-delta], [mpoint[0]-delta, mpoint[1]-delta], [mpoint[0]-delta, mpoint[1]]];
        L.polygon(arealatlons, { color: 'blue', weight: 2, fill: true, fillColor: 'blue', opacity: 0.5 }).addTo(map);

完成版のソースコード全文

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.0/dist/leaflet.css" />
    <script src="https://unpkg.com/leaflet@1.3.0/dist/leaflet.js"></script>
    <script>
      function init() {
        //地図を表示するdiv要素のidを設定
        var map = L.map('mapcontainer', {zoomControl:false});
        // 縮尺表示
        L.control.scale({maxWidth:200,position:'bottomright',imperial:false}).addTo(map);
        // ズームコントロール (マウスのホイールコロコロがあれば不要。デフォルトは左上)
        L.control.zoom({position:'bottomleft'}).addTo(map);


        // オープンストリートマップ
        var osm = L.tileLayer('http://tile.openstreetmap.jp/{z}/{x}/{y}.png',
          {attribution: "<a href='http://osm.org/copyright' target='_blank'>OpenStreetMap</a> contributors" });
        osm.addTo(map);
        var mpoint = [50.086474, 14.411526]; // プラハ、カレル橋
        map.setView(mpoint, 15);

        // クリック時の写真を追加 (写真データは tabinaka.co.jp から拝借)
        var pop1 = L.popup({maxWidth:550}).setContent(`カレル橋 (チェコ / プラハ)<br><img src="https://tabinaka.co.jp/magazine/wp-content/uploads/2019/09/shutterstock_369258188.jpg" style="width:240px;">`);
        L.marker(mpoint, {title:"カレル橋"}).bindPopup(pop1).addTo(map);

        // 円を描く (赤の円。同心円で2つ。内側は「塗り」あり)
        L.circle(mpoint, { radius: 500, color: "red", fill: true, weight: 2 }).addTo(map);
        L.circle(mpoint, { radius: 1000, color: "red", fill: false, weight: 1 }).addTo(map);

        // 多角形を描く (正方形になるはずだけど、緯度が高いせいか縦長になっている。赤道付近で試すと正方形になった)
        var delta = 0.005;
        var arealatlons = [mpoint, [mpoint[0], mpoint[1]-delta], [mpoint[0]-delta, mpoint[1]-delta], [mpoint[0]-delta, mpoint[1]]];
        L.polygon(arealatlons, { color: 'blue', weight: 2, fill: true, fillColor: 'blue', opacity: 0.5 }).addTo(map);
      }
    </script>
  </head>
  <body onload="init()">
    <div id="mapcontainer" style="position:absolute;top:0;left:0;right:0;bottom:0;"></div> <!-- ページに目いっぱい表示 -->
  </body>
</html>

以上です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0