勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

Leafletで「leaflet-search」プラグインを導入してマーカーの検索機能を追加する方法

  JavaScript

LeafletとOpenStreetMapでマップ上にマーカーを複数設置した上で、マーカーの検索機能を追加したい。調べたところ「leaflet-search」プラグインを導入することで実装できる模様。以下にサンプル及びソースコードをメモ。

 

leaflet-search

公式ページ

https://opengeo.tech/maps/leaflet-search/

GitHub

https://github.com/stefanocudini/leaflet-search

CDN

CDNで使う場合は以下を記述する。

<script src="https://cdn.jsdelivr.net/npm/leaflet-search@4.0.0/dist/leaflet-search.src.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/leaflet-search@4.0.0/dist/leaflet-search.src.min.css" rel="stylesheet">

 

サンプル

https://taitan916.info/sample/leaflet.js/plugin/leaflet-search/

マップ右上に虫眼鏡アイコン表示→アイコンをクリックするとテキストボックス表示→テキストボックス内に東京と入力すると「東京駅」「東京タワー」が選択肢として表示→選択肢をクリックするとマップが拡大されて中心地が選択内容の場所になる筈。

 

実装方法

ソースコード

<div id="map"></div>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.js"></script>
<script src="https://cdn.jsdelivr.net/npm/leaflet-sprite@1.0.0/dist/leaflet.sprite.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/leaflet-search@4.0.0/dist/leaflet-search.src.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/leaflet-search@4.0.0/dist/leaflet-search.src.min.css" rel="stylesheet">
<script>
let map;
map = L.map('map');

//中心の経度緯度
const center = ['35.681236', '139.767125'];

//ズームレベル
const zoom = 12;

//マップの中心地とズームレベルを指定
map.setView(center, zoom);

const tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{
    attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
    maxZoom: 19
});
tileLayer.addTo(map);

//検索用のコントローラー設定
let markersLayer = new L.LayerGroup();
map.addLayer(markersLayer);
const controlSearch = new L.Control.Search({
    position:'topright',
    layer: markersLayer,
    initial: false,
    zoom: 15,
    marker: false,
    textErr: '場所が見つかりません'
});
map.addControl( controlSearch );

//マーカー生成
const mapData = [
    { 'lat' : '35.689607', 'lng' : '139.700571', 'title' : '新宿駅', }, 
    { 'lat' : '35.681236', 'lng' : '139.767125', 'title' : '東京駅', 'icon' : 'green'}, 
    { 'lat' : '35.628471', 'lng' : '139.73876', 'title' : '品川駅', 'icon' : 'orange'}, 
    { 'lat' : '35.658581', 'lng' : '139.745433', 'title' : '東京タワー', 'icon' : 'yellow'}, 
    { 'lat' : '35.660238', 'lng' : '139.730077', 'title' : '六本木ヒルズ', 'icon' : 'red'}, 
    { 'lat' : '35.714765', 'lng' : '139.796655', 'title' : '浅草寺', 'icon' : 'purple'}, 
    { 'lat' : '35.636564', 'lng' : '139.763144', 'title' : 'レインボーブリッジ', 'icon' : 'violet'}, 
];
var marker;
for( key in mapData ){
    marker = makeMarker(mapData[key]);

    //検索用のデータセット
    markersLayer.addLayer(marker);
}

function makeMarker( mapData ){
    const icon = L.spriteIcon(mapData.icon);

    //ポップアップの表示位置調整
    icon.options.popupAnchor = [2, -35];
    const marker =  L.marker([mapData.lat, mapData.lng], {icon: icon, title : mapData.title})
    .bindPopup(mapData.title)
    .addTo(map);

    return marker;
}
</script>

解説等

「//検索用のコントローラー設定」部分のオプション項目についてはこちらのページを参照。

検索用のデータセットするためにマーカー作成時にtitleを指定する必要あり(titleが検索対象になっているっぽい)。

 - JavaScript

  関連記事

leaflet.jsとOSMでマーカーの画像をそれぞれ指定する

leaflet.jsとOpenStreetMapでマップ上にマーカーを複数設置し ...

Leafletでマーカークリック時に当該マーカーをバウンド(跳ねる動作を)させる方法

LeafletとOpenStreetMapでマップ上にマーカーを複数設置した上で ...

Leafletで「Leaflet-MiniMap」プラグインを導入し通常のマップと連動するミニマップを表示する方法

Leafletでマップを表示した上で、そのマップと連動したミニマップを表示させた ...

Leafletで「leaflet-locatecontrol」プラグインを導入して現在地表示機能を追加する方法

LeafletとOpenStreetMapでマップ表示させ、特定のアイコンをクリ ...

Leafletのマップ状況をブラウザに保存し、再表示時に復元する「Leaflet.RestoreView」の利用方法

Leafletのマップ状況をブラウザ(cookie等)に保存し、ページリロード時 ...