javascript - 传单 - 如何自动删除以前的标记

标签 javascript node.js leaflet mapbox

以下 javascript 代码将启用在 map 上创建标记,在 map 上单击本地和全局实时使用 node.js/socket.io。这工作正常,但每个添加的标记都是可见的。

像这个例子:http://jsfiddle.net/brettdewoody/LK35U/

现在,将第二个标记添加到 map 后,我需要自动移除前一个标记(第一个),然后添加第三个标记 -> 移除第二个标记,依此类推。任何人都可以帮助我了解如何执行此操作吗?也许与grouplayer?它是如何工作的?

// generate unique user id
var userId = Math.random().toString(16).substring(2,15);

var socket = io.connect('http://localhost:4000');
var doc = $(document);

// custom marker's icon styles
var tinyIcon = L.Icon.extend({
    options: {
        iconSize: [25, 39],
        iconAnchor:   [12, 36],
        shadowSize: [41, 41],
        shadowAnchor: [12, 38],
        popupAnchor: [0, -30]
    }
});
var anyIcon = new tinyIcon({ iconUrl: "assets/img/icon.png" });

var sentData = {}

var connects = {};
var markers = {};
var active = false;

// for node.js send coords and set marker (global)
socket.on("load:coords", function(data) {
    setMarker(data);

    connects[data.id] = data;
    connects[data.id].updated = $.now(); // shorthand for (new Date).getTime()
    console.log(data);
});


// set marker (local)
function addMarker(position) {
    var lat = position.latlng.lat;
    var lng = position.latlng.lng;

    // mark user's position
    var userMarker = L.marker([lat, lng], {
        icon: myIcon,
    });

    userMarker.addTo(map);
    userMarker.bindPopup("<p>Your ID is " + userId + "</p>").openPopup();

    // send coords on when user is active
    doc.on("click", function() {
        active = true; 

        sentData = {
            id: userId,
            active: active,
            coords: [{
                lat: lat,
                lng: lng,
            }]
        }
        socket.emit("send:coords", sentData);
    });
}

doc.bind("mouseup mouseleave", function() {
    active = false;
});

// showing markers for connections
function setMarker(data) {
    for (i = 0; i < data.coords.length; i++) {
        var marker = L.marker([data.coords[i].lat, data.coords[i].lng], { icon: yellowIcon}).addTo(map);
        marker.bindPopup("<p>Your ID is " + data.id + "</p>").openPopup();
        markers[data.id] = marker;
    }
}

map.on('click', addMarker);

编辑:

感谢@iH8 的快速回答!你的解决方案对我来说很好用。但是现在当其他用户加入(通过 node.js)并向 map 添加标记时,唯一 userId 的标记(lat/lng)将保存在一个数组中。

// for node.js send coords and set marker (global)
socket.on("load:coords", function(data) {
setMarker(data);

connects[data.id] = data;
connects[data.id].updated = $.now(); // shorthand for (new Date).getTime()
console.log(data);
});

这将发送 userId 的 data.coords (lat/lng) 并添加到 map 中:

// showing markers for connections
function setMarker(data) {
    for (i = 0; i < data.coords.length; i++) {
        var marker = L.marker([data.coords[i].lat, data.coords[i].lng], { icon: yellowIcon}).addTo(map);
        marker.bindPopup("<p>Your ID is " + data.id + "</p>").openPopup();
        markers[data.id] = marker;
        console.log('ID: ' + data.id + ' LAT: ' + data.coords[i].lat + ' LNG: ' + data.coords[i].lng);
    }
}

第一次添加到 map 点击还是可以的

控制台日志:

ID: 74274f99 LAT: 46.34692761055676 LNG: 8.8330078125

现在第二次点击同一用户/唯一用户 ID 控制台日志:

ID: 74274f99 LAT: 46.34692761055676 LNG: 8.8330078125
ID: 74274f99 LAT: 44.5278427984555 LNG: 9.404296875

由于第二次点击,这里的 console.log 向我显示了具有两个不同 LAT/LNG 的相同用户 ID。结果是,现在我在 map 上看到 2 个具有不同 LAT/LNG 的标记。 但我只想看到最新的:

ID: 74274f99 LAT: 44.5278427984555 LNG: 9.404296875

如何删除第一个/旧的? 我很困惑。

最佳答案

您可以使用 removeLayer 从 map 中删除图层L.Map的功能。标记在 Leaflet 中也被视为一层。因此,在您的 onclick 处理程序中,首先删除当前标记,然后创建一个新标记并添加到 map 中。像这样的东西就可以了:

var marker = null;

map.on('click', function (e) {
    if (marker !== null) {
        map.removeLayer(marker);
    }
    marker = L.marker(e.latlng).addTo(map);
});

Plunker 上的工作示例:http://plnkr.co/edit/NRl0VQi3wSGK3p8aHlHs?p=preview

编辑:重读你的问题后,我对你想要完成的事情有了更好的理解。我想这就是您要找的:

var myId = 'abc'; // My user id

// other user id's and their markers
var markers = {
    'def': L.marker([51.441767, 5.470247]).addTo(map),
    'ghi': L.marker([51.441767, 5.480247]).addTo(map),
    'jkl': L.marker([51.441767, 5.490247]).addTo(map)
};

map.on('click', function (e) {
    // check if my user id in marker object and thus on the map
    if (markers.hasOwnProperty(myId)) {
        // remove the marker
        map.removeLayer(markers[myId]);
    }
    // place (or overwrite) marker with my uid in object and add to map
    markers[myId] = L.marker(e.latlng).addTo(map);
});

这是关于 Plunker 的另一个工作示例:http://plnkr.co/edit/X8NQVF1FDbNKTV5a5nwn?p=preview

关于javascript - 传单 - 如何自动删除以前的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207390/

相关文章:

javascript - 函数类型的流联合

node.js - 从 Google Compute Engine 外部访问 Node.js 服务器

javascript - 如何在 react 传单中选择一个区域

javascript - 使用传单显示半径内的标记

javascript - 如何使 laravel 中的对象在 JavaScript laravel blade 中使用?

javascript - 如何防止使用 jquery 和 socket.io 添加多个事件监听器

node.js - 尝试在我的 PC 上公开部署 nodejs 应用程序

javascript - 制作新圆标记时删除圆标记

javascript - 使用 mongoose 中间件验证密码是否错误?

javascript - 如何从浏览器启动已浏览化的脚本