質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Leaflet

Leafletは、Web上で地図を作成するためのJavaScriptライブラリ。人気のあるJavaScript地図ライブラリのうちの一つでオープンソースです。軽量でインタラクティブな地図を手軽に表示することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1105閲覧

Leafletのマーカーの削除方法

Hys

総合スコア1

Leaflet

Leafletは、Web上で地図を作成するためのJavaScriptライブラリ。人気のあるJavaScript地図ライブラリのうちの一つでオープンソースです。軽量でインタラクティブな地図を手軽に表示することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2023/10/29 16:18

編集2023/10/30 11:50

実現したいこと

Leafletでマーカーを削除する。
removeLayerを用いてマーカーを削除したいと考えているのですが、うまく削除することができません。どのようにすればレイヤーを変更した際に対象でないマーカーを削除することができるでしょうか。もちろん、removeLayerを用いずに上記を実現させる書き方があればそちらでも構いません。

該当のソースコード

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset = "utf-8"> 5 <meta name = "viewport" content = "width = device-width, initial-scale = 1"> 6 <link rel = "stylesheet" href = "https://unpkg.com/leaflet@1.3.0/dist/leaflet.css" /> 7 <script src = "https://unpkg.com/leaflet@1.3.0/dist/leaflet.js"></script> 8 <title>マップ</title> 9 <style> 10 html, body, #map { 11 height: 100%; 12 margin: 0; 13 padding: 0; 14 } 15 </style> 16</head> 17<body> 18 <div id = "map"></div> 19 <script> 20 features = { 21 Tokyo: [ 22 ["東京", [35.6896, 139.6918], "地理院地図"] 23 ], 24 Kanagawa: [ 25 ["川崎", [35.5299, 139.7024], "OpenStreetMap"], 26 ["横浜", [35.4477, 139.6425], "地理院地図"], 27 ], 28 Chiba: [ 29 ["千葉", [35.6050, 140.1234], "地理院地図"] 30 ], 31 }; 32 var map = L.map('map').setView([35.6896, 139.6918],10); 33 var gsi =L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {minZoom:2,maxZoom:18,attribution: "<a href='https://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>"}); 34 var osm = L.tileLayer('http://tile.openstreetmap.jp/{z}/{x}/{y}.png', {attribution: "<a href='#' target='_blank'>OpenStreetMap</a> contributors" }).addTo(map); 35 L.control.layers({ 36 "地理院地図": gsi, 37 "OpenStreetMap": osm 38 }).addTo(map); 39 var tileSelectName; 40 map.on('baselayerchange',function(e){ 41 tileSelectName = e.name; 42 tileChange(); 43 }); 44 function tileChange(){ 45 Object.keys(features).forEach(function(value){ 46 var category = this[value]; 47 for (var i = 0; i < category.length; i++) { 48 var marker = L.marker(category[i][1], { title: category[i][0]}); 49 if(tileSelectName === category[i][2]){ 50 map.addLayer(marker); 51 } else { 52 map.removeLayer(marker); 53 } 54 } 55 },features); 56 } 57 </script> 58</body> 59</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmp

2023/10/30 08:58

私の思い違いかもしれませんが、 恐らくちょっとした思い違い?勘違い?だとおもうのですが、48行目で、新規にマーカーを作成しています。新規に作成したマーカーは、作成時にはまだ、マップにも追加されていません、また、既にマップに追加されているマーカーとは別ものなので、削除できません。 自己解決できなければ、タグにjavascriptを追加すると、答えてくれる人がいると思います。
Hys

2023/10/30 11:55

コメントありがとうございます。タグにjavascriptを追加しました。どのように書けばよいのか分からなかったのですが、考えていただけないでしょうか。
guest

回答1

0

ベストアンサー

tileChange()が呼ばれるたびに新しくマーカーを作っているのが原因です。
何度かレイヤーを変更した後にdevtoolなどで確認すれば、同じ場所にたくさんのマーカーが重なっていることが分かると思います。

解決方法としては、マーカーを一度だけ生成して(たとえばfeaturesの中などに)保持しておいて、その表示を切り替えるようにするのがいいかと思います。
たとえば:

js

1map.on('baselayerchange', function (e) { 2 tileSelectName = e.name; 3 tileChange(); 4}); 5Object.keys(features).forEach(function (value) { 6 var category = this[value]; 7 for (var i = 0; i < category.length; i++) { 8 var marker = category[i][3] = L.marker(category[i][1], { title: category[i][0] }); 9 } 10}, features); 11function tileChange() { 12 Object.keys(features).forEach(function (value) { 13 var category = this[value]; 14 for (var i = 0; i < category.length; i++) { 15 var marker = category[i][3]; 16 17 if (tileSelectName === category[i][2]) { 18 map.addLayer(marker); 19 } else { 20 map.removeLayer(marker); 21 } 22 } 23 }, features); 24}

投稿2023/10/31 01:31

Lhankor_Mhy

総合スコア36898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hys

2023/10/31 02:10

回答ありがとうございます。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問