Folheto - Como encontrar marcadores existentes e excluí-los?

102

Comecei a usar o folheto como um mapa de código aberto, http://leaflet.cloudmade.com/

O seguinte código jQuery permitirá a criação de marcadores no mapa no clique do mapa:

 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();
};

Mas atualmente não há como (no meu código) excluir os marcadores existentes ou encontrar todos os marcadores que criei em um mapa e colocá-los em uma matriz. Alguém pode me ajudar a entender como fazer isso? A documentação do folheto está disponível aqui: http://leaflet.cloudmade.com/reference.html

gaio
fonte
3
A melhor maneira é criar um grupo de camadas. Então podemos adicionar marcadores ao grupo de camadas. O grupo de camadas permite controlar todos os marcadores de uma vez.
neogeomat
1
Grupos de camadas são definitivamente a maneira mais limpa de lidar com isso. Documentos aqui: leafletjs.com/reference.html#layergroup
Zar Shardan

Respostas:

152

você tem que colocar seu "marcador var" fora da função. Depois, você pode acessá-lo:

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();
};

então mais tarde:

map.removeLayer(marker)

Mas você só pode ter o marcador mais recente dessa forma, porque a cada vez, o marcador var é apagado pelo último. Portanto, uma maneira de fazer isso é criar uma matriz global de marcador e adicionar seu marcador na matriz global.

Laurent Debricon
fonte
20
Deve ser uma forma de coletar todas as camadas utilizadas pelo Folheto. : /
jackyalcine 01 de
10
As camadas são armazenadas internamente em map._layers.
flup
11
@jackyalcine: Olhe para LayerGroup e FeatureGroup
Michael Wales,
54

Você também pode inserir marcadores em uma matriz. Veja o exemplo de código, isso funciona para mim:

/*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]);
    }  
}
Indefinido
fonte
32

Aqui está o código e a demonstração para adicionar o marcador , excluir qualquer um dos marcadores e também obter todos os marcadores presentes / adicionados :

Aqui está o código JSFiddle completo . Também aqui está a demonstração de página inteira .

Adicionando o marcador:

// 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);
}

Excluindo o marcador:

// 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);
    });
}

Obtendo todos os marcadores no mapa:

// 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);
Kedar.Aitawdekar
fonte
1
Para obter todos os marcadores, map._layers[ml].featurenão funciona mais.
Samuel Méndez
15

Aqui está um jsFiddle que permite criar marcadores usando seu onMapClickmétodo e, em seguida, excluí-los clicando em um link.

O processo é semelhante ao de undefined - adicione cada novo marcador a um markersarray para que você possa acessar um marcador específico quando quiser interagir com ele mais tarde.

Brett DeWoody
fonte
1
Agradável! Apenas uma pergunta, o array markers () ainda mantém os excluídos, como você excluiria os marcadores também do array? Obrigado!
Miguel Stevens
Você pode usar deletepara remover o item. Por exemplo delete markers[$(this).attr('id')];.
Brett DeWoody
A API criada em nuvem que está incluída para os blocos neste exemplo parece estar inativa agora. Aqui está um fork que é exatamente o mesmo, mas usa o servidor de blocos mapquest em vez de feito em nuvem, portanto, nenhuma chave de API é necessária. jsfiddle.net/nqDKU
FoamyGuy
7

(1) adicionar grupo de camadas e matriz para manter camadas e fazer referência a camadas como variáveis ​​globais:

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

(2) adicionar mapa

(3) Adicionar camada de grupo ao mapa

map.addLayer (search_group);

(4) a função adicionar ao mapa, com um pop-up que contém um link, que ao ser clicado terá a opção de remover. Este link terá, como id, a lat long do ponto. Este id será então comparado a quando você clica em um dos marcadores criados e deseja excluí-lo.

 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) A função remove, compare o marcador lat long com o id disparado no remove:

$(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);
            }

    }

    }  
droid-zilla
fonte
1

Quando você salva a reverência ao marcador na função de adição, o marcador pode removê-lo sozinho. Não há necessidade de matrizes.

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]);
        }
F6F
fonte
1

Você já tentou layerGroup?

Docs aqui https://leafletjs.com/reference-1.2.0.html#layergroup

Basta criar uma camada, adicionar todos os marcadores a esta camada, então você pode encontrar e destruir o marcador facilmente.

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

No meu caso, tenho vários grupos de camadas para que os usuários possam mostrar / ocultar clusters de marcadores de tipo semelhantes. Mas, em qualquer caso, você exclui um marcador individual percorrendo seus grupos de camadas para localizá-lo e excluí-lo. Durante o loop, procure um marcador com um atributo personalizado, no meu caso uma 'chave', adicionado quando o marcador foi adicionado ao grupo de camadas. Adicione sua 'chave' assim como adiciona um atributo de título. Mais tarde, é obtida uma opção de camada. Quando você encontra essa correspondência, remove .removeLayer () e ele se livra desse marcador específico. Espero que ajude você!

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);
                    }
                }
            }
        });
    });
}
Ronnie Royston
fonte
0

Pode ser que eu seja tarde demais para isso, mas ainda criei um projeto open sorce para fazer o mesmo junto com alguma outra coisa

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

por favor verifique e faça uma estrela se quiser :)

Kishan Oza
fonte