リーフレット(leaflet)は軽量、多機能、拡張性、スマホ対応している地図の機能を持った、JavaScriptライブラリです。この記事では、リーフレットで作成した地図上にマーカーを配置、マーカーの見た目を変更、ポップアップを表示、ドラッグさせる方法を確認していきます
JS地図ライブラリ・リーフレットを使って特定の位置のマップを表示する
2023年01月10日
leafletデモ
See the Pen Untitled by logsuke (@design-list) on CodePen.
マーカー追加とカスタマイズ
var map = L.map('myMap', {
center: [32.639884, 130.987154],
zoom: 8,
})
var layer_1 = L.marker([33,129]).addTo(map);
var layer_2 = L.marker([33,130]).bindPopup('popup').openPopup().addTo(map);
var layer_3 = L.marker([33,131]).bindTooltip('tooltip', {direction: 'bottom', offset: L.point(-15, 30)}).addTo(map);
var Icon = L.icon({
iconUrl: 'https://leafletjs.com/examples/custom-icons/leaf-green.png',
shadowUrl: 'https://leafletjs.com/examples/custom-icons/leaf-shadow.png',
iconSize: [38, 95],
shadowSize: [50, 64],
iconAnchor: [22, 94],
shadowAnchor: [4, 62],
popupAnchor: [-3, -76]
});
var layer_4 = L.marker([33,132], {icon: Icon}).addTo(map);
var layer_5 = L.marker([33,133], {draggable: true}).addTo(map);
// event
layer_5.addEventListener('moveend', (e) => {
alert(e.target._latlng);
})
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
7 : マーカーをマップに追加
9 : クリックすると、ポップアップを表示
11 : ホバー中ツールチップを表示
13 ~ 22 : マーカーを独自のアイコンに置き換える
custom-maker
24 : マーカーをドラッグ可能にする
27 ~ 29 : マーカーがドラッグ後にマーカーの座標を警告する。
マーカーをコントロール
マーカーをグループにまとめて、非表示の切り替えをコントロールすることができます。
var layer_1 = L.marker([33,129]);
var layer_2 = L.marker([33,130]).bindPopup('popup').openPopup();
var layer_3 = L.marker([33,131]).bindTooltip('tooltip', {direction: 'bottom', offset: L.point(-15, 30)});
var Icon = L.icon({
iconUrl: 'https://leafletjs.com/examples/custom-icons/leaf-green.png',
shadowUrl: 'https://leafletjs.com/examples/custom-icons/leaf-shadow.png',
iconSize: [38, 95],
shadowSize: [50, 64],
iconAnchor: [22, 94],
shadowAnchor: [4, 62],
popupAnchor: [-3, -76]
});
var layer_4 = L.marker([33,132], {icon: Icon});
var layer_5 = L.marker([33,133], {draggable: true});
// event
layer_5.addEventListener('moveend', (e) => {
alert(e.target._latlng);
})
var layers = L.layerGroup([layer_1, layer_2, layer_3, layer_4, layer_5]);
var overlays = { "Icons": layers }
setTimeout(function(){
layers.removeLayer(layer_4)
}, 2.5*1000);
const osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
});
var baseMaps = {
"osm": osm,
}
var map = L.map('myMap', {
center: [32.639884, 130.987154],
zoom: 8,
layers: [osm, layers]
})
var layerControl = L.control.layers(baseMaps, overlays).addTo(map);
25 ~ 26 : マーカーをそれぞれマップに表示させるのではなく、まずグループ化してオブジェクトを作成します。
LayerGroup
※ グループに追加またはグループから削除されたレイヤーは、マップ上でも追加/削除されます。
28 ~ 30 : しばらくして、layer_4のマーカーを削除すると、地図上のマーカーも削除されています。
36 ~ 38 : タイルマップもオブジェクトの形に
43 : 初期のタイルレイヤー、レイヤーグループ
46 : レイヤーとマップを追加します。右上にアイコンが作成され、レイヤーをコントロールすることができます。
デモ
See the Pen leaflet 4 by logsuke (@design-list) on CodePen.
マーカーにHTML要素を使う
画像の代わりに単純な HTML 要素を使用して、マーカーを軽量化することができます。
const osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
});
var map = L.map('myMap', {
center: [32.639884, 130.987154],
zoom: 8,
layers: [osm]
})
function customIcon(latLng, text, size, type) {
var customIcon = L.divIcon({
html: `<span>${text}</span>`,
className: type,
iconSize: [size, size]
});
var marker = L.marker(latLng, {icon: customIcon});
return marker;
}
customIcon([32.87036022808352, 131.02844238281253], '90', 100, 'circle').addTo(map);
11 ~ 19 : マーカーをhtml 要素に変更しています。
デモ
See the Pen leaflet 8 by logsuke (@design-list) on CodePen.