Leafletjs:如何在第一次点击时有新标记,然后在第二次点击时更新标记的latlng

时间:2015-11-19 18:52:35

标签: leaflet marker angular-leaflet-directive

我有要在地图中渲染的标记列表,但我想逐一进行渲染。在第一次点击我想制作新的标记。然后,当我点击另一个位置时,我希望我的标记只是移动到新的latLng而不是创建另一个标记。这是我的代码:

function (licon, coord, data) {
    var self = jQuery(this);
    var map = self.data("map");
    var latlng = new L.LatLng(coord[0], coord[1]);
    //Create Marker

    if (licon) {
        var leafIcon = L.icon(licon);
        console.log(typeof (marker));
        if (typeof (marker) === 'undefined') {
            var marker = L.marker(latlng, {
                icon: leafIcon,
                    "markerData": data,
                draggable: true
            });

        } else {
            console.log('not undefined');
            map.removeLayer(marker);
            marker = L.marker(latlng, {
                icon: leafIcon,
                    "markerData": data,
                draggable: true
            });
        }
    } else {
        var marker = L.marker(latlng, {
            "markerData": data,
            draggable: true
        });

    }

    marker.addTo(map);
    return marker;
}

1 个答案:

答案 0 :(得分:2)

结果的简短示例:http://jsfiddle.net/ve2huzxw/43/

var currentMarker;

map.on("click", function (event) {
    if (currentMarker) {
        currentMarker.setLatLng(event.latlng);
        return;
    }

    currentMarker = L.marker(event.latlng, {
        draggable: true
    }).addTo(map).on("click", function () {
        event.originalEvent.stopPropagation();
    });
});

document.getElementById("done").addEventListener("click", function () {
    currentMarker = null;
});

您还可以添加平滑过渡以显示标记移动到新位置:

if (currentMarker) {
    currentMarker._icon.style.transition = "transform 0.3s ease-out";
    currentMarker._shadow.style.transition = "transform 0.3s ease-out";

    currentMarker.setLatLng(event.latlng);

    setTimeout(function () {
        currentMarker._icon.style.transition = null;
        currentMarker._shadow.style.transition = null;
    }, 300);
    return;
}