Leafletで「leaflet-search」プラグインを導入してマーカーの検索機能を追加する方法
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が検索対象になっているっぽい)。
関連記事
-
Leafletで「leaflet.sprite」プラグインを導入してマーカーの色を変更する方法
LeafletとOpenStreetMapでマップ上にマーカーを複数設置したい。 ...
-
Leafletで表示したマップにジェスチャーハンドリングを追加する方法(Leaflet.GestureHandling)
GoogleMapをズームする際にPCだと「Ctrl+スクロール」、スマホだと「 ...
-
Leafletでマーカークリック時に当該マーカーをバウンド(跳ねる動作を)させる方法
LeafletとOpenStreetMapでマップ上にマーカーを複数設置した上で ...
-
Leafletでマップ上に通知(トースト)機能を追加する方法(Leaflet.Notifications)
Leafletでマーカー内のボタンクリック時等、ユーザーが何らかのアクションを行 ...
-
Leafletでマーカーをグループ化し、チェックボックスの状態により表示非表示を切り替える方法
LeafletとOpenStreetMapでマップ上にマーカーを複数設置した上で ...