3

我有想要在地图中渲染的标记列表,但我想要一个一个。在第一次单击时,我想制作新的标记。然后,当我单击另一个位置时,我希望我的标记只移动到新的 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;
}
4

2 回答 2

4

结果的一个简单示例: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;
}
于 2015-11-22T02:28:01.807 回答
0

几年后,一个稍微更统一的解决方案。

var currentMarker;

map2.on('click', function(e) {
    if (currentMarker){
        currentMarker.setLatLng(e.latlng)
    } else {
        currentMarker = new L.marker(e.latlng).addTo(map2);
    };
    
    //console.log('lat, lon: ', e.latlng.lat, e.latlng.lng);
    
  });

传单现在默认平滑地将点拖到新坐标上。

于 2021-10-13T13:50:42.680 回答