Google Mapsが新プランになったから、Leafletを試してみた
新年あけましておめでとうございます。
昨年、2018年はGoogle Mapsの料金体系が大きく変更された年でした。
そのため、各Webページを見ていると、「Googleマップが正しく読み込まれませんでした」というエラーが出ているサイトをよく見かけます。
この原因は複数ありますが、大きく分けると下記の3点となります。
- APIキーを利用していない場合
- APIキーを利用しているが、無償枠を超えた場合
- 請求先アカウントの登録がされていない
特に3つ目が曲者でして、「無料超過分のAPI使用数を超えると従量課金される」という点が非常に厄介です。
(詳しい料金・API使用回数等は コチラ をご覧ください)
Google Mapsとほぼ等価の機能が使えて、でもお金はかけたくない!!
そんなワガママな願いを叶える素敵なライブラリがあるので紹介します。
目次
Leaflet とは
Leafletとは、オープンソースのJavascript地図ライブラリです。
このライブラリの特徴は「モバイル向け対応済み」「シンプルで軽量」「機能をプラグインで追加できる」という点です。
特に「機能をプラグインで追加」という点が優秀で、かなり多くのプラグインが存在しています。
ただ逆に、プラグインを入れないと、必要最低限の機能しかないという点も注意です。
Leafletをインストールする
まずはLeaflet1をインストール(ダウンロード)しましょう。
ダウンロードは コチラ です。
※記事執筆時点での最新バージョンは v1.4.0 です
ダウンロードが完了したら、「leaflet.js」「leaflet.css」「images」をHTMLファイルで読み込みます。
(imagesは leaflet.css と同一階層に配置します)
必要ファイルはこれで終了です。
Leafletを表示する
それではLeafletでいろいろ表示してみましょう。
地図を表示
下記のようにすることで地図を表示できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<!DOCTYPE html> <html> <head> <!-- leaflet --> <link rel="stylesheet" href="css/leaflet.css" /> <script src="js/leaflet.js"></script> <style> *{ margin: 0; padding: 0; } html, body { height: 100%; } #myMap { height: 100%; width: 100%; } </style> <script> window.onload = function() { var lat = 35.184522; var lng = 136.900699; var zoom = 16; var maxZoom = 18; // マップオブジェクトを作成 var map = L.map('myMap', { }).setView([lat, lng], zoom); //OSMレイヤー追加 L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>', maxZoom: maxZoom } ).addTo(map); } </script> </head> <body> <div id="myMap"></div> </body> </html> |
ズームコントロールを変更
デフォルトのズームコントロールは左上に固定され、さらにマウスオーバー時のテキストは英語です。
不都合な場合もあるかとおもいますので、変更してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<!DOCTYPE html> <html> <head> <!-- leaflet --> <link rel="stylesheet" href="css/leaflet.css" /> <script src="js/leaflet.js"></script> <style> *{ margin: 0; padding: 0; } html, body { height: 100%; } #myMap { height: 100%; width: 100%; } </style> <script> window.onload = function() { var lat = 35.184522; var lng = 136.900699; var zoom = 16; var maxZoom = 18; // マップオブジェクトを作成 var map = L.map('myMap', { zoomControl: false // デフォルトのズームコントロールを消す }).setView([lat, lng], zoom); //OSMレイヤー追加 L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>', maxZoom: maxZoom } ).addTo(map); // ズームコントロールをカスタマイズして設定 L.control.zoom({ zoomInTitle: '拡大', zoomOutTitle: '縮小', position: 'bottomright' }).addTo(map); } </script> </head> <body> <div id="myMap"></div> </body> </html> |
マーカーを表示
地図の基本となるマーカーを表示します。
また、マーカークリックでのポップアップ表示や、初めからポップアップを出しておく方法もこちらに記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<!DOCTYPE html> <html> <head> <!-- leaflet --> <link rel="stylesheet" href="css/leaflet.css" /> <script src="js/leaflet.js"></script> <style> *{ margin: 0; padding: 0; } html, body { height: 100%; } #myMap { height: 100%; width: 100%; } </style> <script> window.onload = function() { var lat = 35.184522; var lng = 136.900699; var zoom = 16; var maxZoom = 18; // マップオブジェクトを作成 var map = L.map('myMap', { zoomControl: false // デフォルトのズームコントロールを消す }).setView([lat, lng], zoom); //OSMレイヤー追加 L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>', maxZoom: maxZoom } ).addTo(map); // ズームコントロールをカスタマイズして設定 L.control.zoom({ zoomInTitle: '拡大', zoomOutTitle: '縮小', position: 'bottomright' }).addTo(map); // マーカー追加 var marker = L.marker([lat, lng]).addTo(map); // マーカークリックでポップアップテキストを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup."); // 初めからマーカーにポップアップを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup(); } </script> </head> <body> <div id="myMap"></div> </body> </html> |
ポップアップを表示
地図にポップアップのテキストのみを表示したい場合にはこちらを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<!DOCTYPE html> <html> <head> <!-- leaflet --> <link rel="stylesheet" href="css/leaflet.css" /> <script src="js/leaflet.js"></script> <style> *{ margin: 0; padding: 0; } html, body { height: 100%; } #myMap { height: 100%; width: 100%; } </style> <script> window.onload = function() { var lat = 35.184522; var lng = 136.900699; var zoom = 16; var maxZoom = 18; // マップオブジェクトを作成 var map = L.map('myMap', { zoomControl: false // デフォルトのズームコントロールを消す }).setView([lat, lng], zoom); //OSMレイヤー追加 L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>', maxZoom: maxZoom } ).addTo(map); // ズームコントロールをカスタマイズして設定 L.control.zoom({ zoomInTitle: '拡大', zoomOutTitle: '縮小', position: 'bottomright' }).addTo(map); // マーカー追加 var marker = L.marker([lat, lng]).addTo(map); // マーカークリックでポップアップテキストを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup."); // 初めからマーカーにポップアップを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup(); // ポップアップを表示 var popup = L.popup() .setLatLng([lat+0.001, lng+0.001]) .setContent("I am a standalone popup.") .openOn(map); } </script> </head> <body> <div id="myMap"></div> </body> </html> |
マップをクリックした位置を取得 / 移動する
マップをクリックした位置の緯度・軽度を取得したり、その場所へ中心を移動する方法は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<!DOCTYPE html> <html> <head> <!-- leaflet --> <link rel="stylesheet" href="css/leaflet.css" /> <script src="js/leaflet.js"></script> <style> *{ margin: 0; padding: 0; } html, body { height: 100%; } #myMap { height: 100%; width: 100%; } </style> <script> window.onload = function() { var lat = 35.184522; var lng = 136.900699; var zoom = 16; var maxZoom = 18; // マップオブジェクトを作成 var map = L.map('myMap', { zoomControl: false // デフォルトのズームコントロールを消す }).setView([lat, lng], zoom); //OSMレイヤー追加 L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>', maxZoom: maxZoom } ).addTo(map); // ズームコントロールをカスタマイズして設定 L.control.zoom({ zoomInTitle: '拡大', zoomOutTitle: '縮小', position: 'bottomright' }).addTo(map); // マーカー追加 var marker = L.marker([lat, lng]).addTo(map); // マーカークリックでポップアップテキストを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup."); // 初めからマーカーにポップアップを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup(); // ポップアップを表示 var popup = L.popup() .setLatLng([lat+0.001, lng+0.001]) .setContent("I am a standalone popup.") .openOn(map); // マップクリックイベントを追加 map.on('click', function(e) { alert("You clicked the map at " + e.latlng); // クリックした位置へ地図の中心を移動 map.panTo(e.latlng, { animate: true }); }); } </script> </head> <body> <div id="myMap"></div> </body> </html> |
地図に円を描く
地図上で範囲を指定する場合などで使用する、円を描く方法は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<!DOCTYPE html> <html> <head> <!-- leaflet --> <link rel="stylesheet" href="css/leaflet.css" /> <script src="js/leaflet.js"></script> <style> *{ margin: 0; padding: 0; } html, body { height: 100%; } #myMap { height: 100%; width: 100%; } </style> <script> window.onload = function() { var lat = 35.184522; var lng = 136.900699; var zoom = 16; var maxZoom = 18; // マップオブジェクトを作成 var map = L.map('myMap', { zoomControl: false // デフォルトのズームコントロールを消す }).setView([lat, lng], zoom); //OSMレイヤー追加 L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>', maxZoom: maxZoom } ).addTo(map); // ズームコントロールをカスタマイズして設定 L.control.zoom({ zoomInTitle: '拡大', zoomOutTitle: '縮小', position: 'bottomright' }).addTo(map); // マーカー追加 var marker = L.marker([lat, lng]).addTo(map); // マーカークリックでポップアップテキストを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup."); // 初めからマーカーにポップアップを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup(); // ポップアップを表示 var popup = L.popup() .setLatLng([lat+0.001, lng+0.001]) .setContent("I am a standalone popup.") .openOn(map); // マップクリックイベントを追加 map.on('click', function(e) { alert("You clicked the map at " + e.latlng); // クリックした位置へ地図の中心を移動 map.panTo(e.latlng, { animate: true }); }); // 円を描く var circle = L.circle([lat, lng], { color: 'blue', fillColor: '#0091f9', fillOpacity: 0.1, radius: 200 }).addTo(map); } </script> </head> <body> <div id="myMap"></div> </body> </html> |
カスタムマーカーを表示する
独自のマーカーを表示する場合は下記のとおりです。
(今回使用したカスタムアイコンは 100×100 のpng画像です)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<!DOCTYPE html> <html> <head> <!-- leaflet --> <link rel="stylesheet" href="css/leaflet.css" /> <script src="js/leaflet.js"></script> <style> *{ margin: 0; padding: 0; } html, body { height: 100%; } #myMap { height: 100%; width: 100%; } </style> <script> window.onload = function() { var lat = 35.184522; var lng = 136.900699; var zoom = 16; var maxZoom = 18; // マップオブジェクトを作成 var map = L.map('myMap', { zoomControl: false // デフォルトのズームコントロールを消す }).setView([lat, lng], zoom); //OSMレイヤー追加 L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>', maxZoom: maxZoom } ).addTo(map); // ズームコントロールをカスタマイズして設定 L.control.zoom({ zoomInTitle: '拡大', zoomOutTitle: '縮小', position: 'bottomright' }).addTo(map); // マーカー追加 var marker = L.marker([lat, lng]).addTo(map); // マーカークリックでポップアップテキストを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup."); // 初めからマーカーにポップアップを表示する場合 // marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup(); // ポップアップを表示 var popup = L.popup() .setLatLng([lat+0.001, lng+0.001]) .setContent("I am a standalone popup.") .openOn(map); // マップクリックイベントを追加 map.on('click', function(e) { alert("You clicked the map at " + e.latlng); // クリックした位置へ地図の中心を移動 map.panTo(e.latlng, { animate: true }); }); // 円を描く var circle = L.circle([lat, lng], { color: 'blue', fillColor: '#0091f9', fillOpacity: 0.1, radius: 200 }).addTo(map); // カスタムマーカー設定 var customIcon = L.icon({ iconUrl: 'img/custom_pin.png', iconRetinaUrl: 'img/custom_pin.png', iconSize: [50, 50], iconAnchor: [25, 50], popupAnchor: [0, -50], }); var customMarker = L.marker([lat-0.001, lng-0.001], { icon: customIcon }).addTo(map); } </script> </head> <body> <div id="myMap"></div> </body> </html> |
さいごに
無事に地図は表示されましたか?
その他、プラグインについては需要があれば記載していこうかと思いますので、今回はここまで!
- おすすめ記事
-
-
じーよ2018.12.17
-
POPULAR
のえる
Full-stack Developer