【问题标题】:Leaflet - How to match marker and polyline on drag and drop传单 - 如何在拖放时匹配标记和折线
【发布时间】:2016-02-04 10:46:08
【问题描述】:

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

Truong M.

【问题讨论】:

    标签: leaflet marker polyline


    【解决方案1】:

    鉴于以下L.Latlng's、L.Marker's 和L.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);
    

    您需要将事件侦听器和回调附加到您的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);
    

    现在在 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;
            }
        }
    }
    

    现在你知道了折线的 latlng 的关键,你可以在拖动事件上拖动标记时更改它:

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

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

    function dragEndHandler (e) {
    
        // Delete key from marker instance
        delete this.polylineLatlng;
    }
    

    就是这样。这是 Plunker 上的一个工作示例:http://embed.plnkr.co/SJRec3/preview

    【讨论】:

    • 非常感谢#iH8,你是我的偶像:D
    猜你喜欢
    • 2020-10-20
    • 2020-10-27
    • 2018-01-30
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多