リーフレット-既存のマーカーを検索してマーカーを削除する方法


102

オープンソースマップとしてリーフレットを使い始めました。http://leaflet.cloudmade.com/

次のjQueryコードは、マップクリック時にマップ上にマーカーを作成できるようにします。

 map.on('click', onMapClick);
function onMapClick(e) {
        var marker = new L.Marker(e.latlng, {draggable:true});
        map.addLayer(marker);
        marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();
};

しかし、現在のところ(コード内で)既存のマーカーを削除したり、マップ上で作成したすべてのマーカーを見つけて配列に配置したりする方法はありません。誰かがこれを行う方法を理解するのを手伝ってくれる?リーフレットのドキュメントはこちらから入手できます:http : //leaflet.cloudmade.com/reference.html


3
最善の方法は、レイヤーグループを作成することです。次に、マーカーをレイヤーグループに追加できます。レイヤーグループを使用すると、すべてのマーカーを一度に制御できます。
neogeomat 14

1
レイヤーグループは、これを処理する最も確実な方法です。ドキュメントはこちら:leafletjs.com/reference.html#layergroup
Zar

回答:


152

「varマーカー」を関数から除外する必要があります。その後、あなたはそれにアクセスすることができます:

var marker;
function onMapClick(e) {
        marker = new L.Marker(e.latlng, {draggable:true});
        map.addLayer(marker);
        marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();
};

じゃあ後で :

map.removeLayer(marker)

ただし、varマーカーは最新のマーカーによって消去されるため、最新のマーカーを使用できるのはその方法のみです。そのための1つの方法は、マーカーのグローバル配列を作成し、グローバル配列にマーカーを追加することです。


20
Leafletで使用されるすべてのレイヤーを収集する方法である必要があります。:/
jackyalcine

10
レイヤーは内部でに保存されmap._layersます。
2013年

11
@jackyalcine:LayerGroupとFeatureGroupをご覧ください
マイケルウェールズ

54

マーカーを配列にプッシュすることもできます。コード例を参照してください、これは私にとってはうまくいきます:

/*create array:*/
var marker = new Array();

/*Some Coordinates (here simulating somehow json string)*/
var items = [{"lat":"51.000","lon":"13.000"},{"lat":"52.000","lon":"13.010"},{"lat":"52.000","lon":"13.020"}];

/*pushing items into array each by each and then add markers*/
function itemWrap() {
for(i=0;i<items.length;i++){
    var LamMarker = new L.marker([items[i].lat, items[i].lon]);
    marker.push(LamMarker);
    map.addLayer(marker[i]);
    }
}

/*Going through these marker-items again removing them*/
function markerDelAgain() {
for(i=0;i<marker.length;i++) {
    map.removeLayer(marker[i]);
    }  
}

32

ここでのコードとデモであるマーカーの追加マーカーのいずれかを削除するにもおよび全て本/追加のマーカーを得るには

JSFiddleコード全体を次に示します。こちらも全ページのデモです。

マーカーを追加する:

// Script for adding marker on map click
map.on('click', onMapClick);

function onMapClick(e) {

    var geojsonFeature = {

        "type": "Feature",
        "properties": {},
        "geometry": {
                "type": "Point",
                "coordinates": [e.latlng.lat, e.latlng.lng]
        }
    }

    var marker;

    L.geoJson(geojsonFeature, {

        pointToLayer: function(feature, latlng){

            marker = L.marker(e.latlng, {

                title: "Resource Location",
                alt: "Resource Location",
                riseOnHover: true,
                draggable: true,

            }).bindPopup("<input type='button' value='Delete this marker' class='marker-delete-button'/>");

            marker.on("popupopen", onPopupOpen);

            return marker;
        }
    }).addTo(map);
}

マーカーを削除する:

// Function to handle delete as well as other events on marker popup open

function onPopupOpen() {

    var tempMarker = this;

    // To remove marker on click of delete button in the popup of marker
    $(".marker-delete-button:visible").click(function () {
        map.removeLayer(tempMarker);
    });
}

マップ内のすべてのマーカーを取得する:

// getting all the markers at once
function getAllMarkers() {

    var allMarkersObjArray = []; // for marker objects
    var allMarkersGeoJsonArray = []; // for readable geoJson markers

    $.each(map._layers, function (ml) {

        if (map._layers[ml].feature) {

            allMarkersObjArray.push(this)
            allMarkersGeoJsonArray.push(JSON.stringify(this.toGeoJSON()))
        }
    })

    console.log(allMarkersObjArray);
}

// any html element such as button, div to call the function()
$(".get-markers").on("click", getAllMarkers);

1
すべてのマーカーを取得するために、map._layers[ml].feature動作しなくなりました。
サミュエルメンデス2017年

15

ここだjsFiddleあなたが使用してマーカーを作成することができますonMapClickリンクをクリックすることで、それらを削除し、その後、方法が。

プロセスはundefinedのプロセスに似ています。新しいマーカーをそれぞれmarkers配列に追加して、後で操作したいときに特定のマーカーにアクセスできるようにします。


1
いいね!ただ1つの質問、markers()配列は削除されたものを保持します。どのようにマーカーも配列から削除しますか?ありがとう!
ミゲルスティーブンス

deleteアイテムの削除に使用できます。例えばdelete markers[$(this).attr('id')];
Brett DeWoody

この例のタイルに含まれているcloudmade APIは、現在非アクティブになっているようです。これはまったく同じフォークですが、cloudmadeではなくmapquestタイルサーバーを使用しているため、APIキーは必要ありません。jsfiddle.net/nqDKU
FoamyGuy

7

(1)レイヤーグループと配列を追加して、レイヤーを保持し、グローバル変数としてレイヤーを参照します。

var search_group = new L.LayerGroup(); var clickArr = new Array();

(2)地図を追加

(3)マップにグループレイヤーを追加する

map.addLayer(search_group);

(4)マップへの追加機能。リンクを含むポップアップがあり、クリックすると削除オプションが表示されます。このリンクには、そのIDとしてポイントの緯度経度があります。このIDは、作成したマーカーの1つをクリックしてそれを削除する場合と比較されます。

 map.on('click', function(e) {
        var clickPositionMarker = L.marker([e.latlng.lat,e.latlng.lng],{icon: idMarker});
        clickArr.push(clickPositionMarker);
        mapLat = e.latlng.lat;
        mapLon = e.latlng.lng;
        clickPositionMarker.addTo(search_group).bindPopup("<a name='removeClickM' id="+e.latlng.lat+"_"+e.latlng.lng+">Remove Me</a>")
                .openPopup();   

                /*   clickPositionMarker.on('click', function(e) {
                  markerDelAgain(); 
                }); */


});

(5)削除機能では、マーカーlat longを削除で発生したIDと比較します。

$(document).on("click","a[name='removeClickM']", function (e) {

      // Stop form from submitting normally
    e.preventDefault();

    for(i=0;i<clickArr.length;i++) {

    if(search_group.hasLayer(clickArr[i]))
    {
        if(clickArr[i]._latlng.lat+"_"+clickArr[i]._latlng.lng==$(this).attr('id'))
            {
                hideLayer(search_group,clickArr[i]);
                clickArr.splice(clickArr.indexOf(clickArr[i]), 1);
            }

    }

    }  

1

追加機能でマーカーへの敬意を保存すると、マーカーがマーカーを削除できます。アレイは必要ありません。

function addPump(){
   var pump = L.marker(cords,{icon: truckPump}).addTo(map).bindPopup($('<a href="#" class="speciallink">Remove ME</a>').click(function() {
            map.removeLayer(pump);
          })[0]);
        }

1

もう試しましたlayerGroupか?

ここにドキュメントhttps://leafletjs.com/reference-1.2.0.html#layergroup

レイヤーを作成し、すべてのマーカーをこのレイヤーに追加するだけで、マーカーを簡単に見つけて破壊できます。

var markers = L.layerGroup()
const marker = L.marker([], {})
markers.addLayer(marker)

0

私の場合、ユーザーが同様のタイプマーカーのクラスターを表示/非表示できるように、さまざまなレイヤーグループがあります。ただし、いずれの場合も、レイヤーグループをループしてマーカーを見つけて削除することにより、個々のマーカーを削除します。ループ中に、マーカーがレイヤーグループに追加されたときに追加されたカスタム属性(私の場合は「キー」)を持つマーカーを検索します。タイトル属性を追加するのと同じように、「キー」を追加します。後でこれはレイヤーオプションを取得しました。一致するものが見つかったら、.removeLayer()を実行すると、その特定のマーカーが削除されます。お役に立てれば幸いです。

eventsLayerGroup.addLayer(L.marker([tag.latitude, tag.longitude],{title:tag.title, layer:tag.layer, timestamp:tag.timestamp, key:tag.key, bounceOnAdd: true, icon: L.AwesomeMarkers.icon({icon: 'vignette', markerColor: 'blue', prefix: '', iconColor: 'white'}) }).bindPopup(customPopup(tag),customOptions).on('click', markerClick)); 

function removeMarker(id){
    var layerGroupsArray = [eventsLayerGroup,landmarksLayerGroup,travelerLayerGroup,marketplaceLayerGroup,myLayerGroup];
    $.each(layerGroupsArray, function (key, value) {
        value.eachLayer(function (layer) {
            if(typeof value !== "undefined"){
                if (layer.options.layer){
                    console.log(layer.options.key);
                    console.log(id);
                    if (id === layer.options.key){
                        value.removeLayer(layer);
                    }
                }
            }
        });
    });
}

0

私にはこれには遅すぎるかもしれませんが、それでも私は他のいくつかのものと同じことを行うために1つのオープンソースプロジェクトを作成しました

https://github.com/ikishanoza/ionic-leaflet

よろしければチェックアウトしてスターを付けてください:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.