Leaflet - 如何在拖放时匹配标记和折线

Tru*_*Mai 7 polyline marker leaflet

我有一个带有leafletJS的项目.例如,我在地图中有2个点(A,B).我将其显示为2个标记我必须绘制从A到B的折线.我移动了标记A,我想要标记A的折线头部与标记A匹配(移动后跟标记A).我怎样才能做到这一点?对不起,我的英语不好.非常感谢.

Truong M.

iH8*_*iH8 9

鉴于以下L.Latlng的,L.MarkerL.Polyline:

var a = new L.LatLng(-45, -90),
    b = new L.LatLng(45, 0),
    c = new L.LatLng(-45, 90);

var marker_a = new L.Marker(a, {draggable: true}).addTo(map),
    marker_b = new L.Marker(b, {draggable: true}).addTo(map),
    marker_c = new L.Marker(c, {draggable: true}).addTo(map);

var polyline = new L.Polyline([a, b, c]).addTo(map);
Run Code Online (Sandbox Code Playgroud)

你需要将eventlisteners和回调附加到你L.Marker的.你可以自动化这个,但我现在会保持简单:

marker_a
    .on('dragstart', dragStartHandler)
    .on('drag', dragHandler)
    .on('dragend', dragEndHandler);

marker_b
    .on('dragstart', dragStartHandler)
    .on('drag', dragHandler)
    .on('dragend', dragEndHandler);

marker_c
    .on('dragstart', dragStartHandler)
    .on('drag', dragHandler)
    .on('dragend', dragEndHandler);
Run Code Online (Sandbox Code Playgroud)

现在在dragstart上你需要找到折线的latlng,它与你的标记的latlng相对应,并将它的密钥存储在你的标记实例中,以便你以后可以使用它:

function dragStartHandler (e) {

    // Get the polyline's latlngs
    var latlngs = polyline.getLatLngs(),

        // Get the marker's start latlng
        latlng = this.getLatLng();

    // Iterate the polyline's latlngs
    for (var i = 0; i < latlngs.length; i++) {

        // Compare each to the marker's latlng
        if (latlng.equals(latlngs[i])) {

            // If equals store key in marker instance
            this.polylineLatlng = i;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你知道折线的latlng的关键,你可以在dragevent上拖动标记时改变它:

function dragHandler (e) {

    // Get the polyline's latlngs
    var latlngs = polyline.getLatLngs(),

        // Get the marker's current latlng
        latlng = this.getLatLng();

    // Replace the old latlng with the new
    latlngs.splice(this.polylineLatlng, 1, latlng);

    // Update the polyline with the new latlngs
    polyline.setLatLngs(latlngs);
}
Run Code Online (Sandbox Code Playgroud)

只是为了干净整洁,删除dragend上存储的密钥:

function dragEndHandler (e) {

    // Delete key from marker instance
    delete this.polylineLatlng;
}
Run Code Online (Sandbox Code Playgroud)

而已.以下是Plunker的一个工作示例:http://embed.plnkr.co/SJRec3/preview