【问题标题】:select two markers & draw line between them in leaflet在传单中选择两个标记并在它们之间画线
【发布时间】:2013-03-05 18:35:02
【问题描述】:

我对传单非常陌生。

我在传单的地图上绘制了多个标记/圆圈标记。

现在,当我选择它们时,我必须在两个标记//圆形标记之间画线。

任何人都可以帮忙吗?

var map = L.map('map').setView([51.49521, -0.10062], 13);
L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', {
        maxZoom: 18,
        attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>'
    }).addTo(map);

 // get all 6 points
  var points = new Array(
[51.49346, -0.11518],
[51.49827, -0.06763],
[51.48331, -0.08154],
[51.52284, -0.09974],
[51.51932, -0.06695],
[51.50949, -0.1363]
   );

  // centerpoint
  var centerPoint = new L.LatLng(51.49521, -0.10062);
  var marker1 = L.marker([51.49521, -0.10062]).addTo(map);


  // adding allo points to map
  for (var i =0 ; i < points.length; i++)
  { 
     // here I can use marker also(if solution is possible with markers)
L.circleMarker([points[i][0],points[i][1]]).addTo(map);
var point = new L.LatLng(points[i][0],points[i][1]);
var pointList = [point, centerPoint];

    var firstpolyline = new L.Polyline(pointList, {
    color: 'red',
    weight: 5,
    smoothFactor: 1

   }).addTo(map);
  }

【问题讨论】:

    标签: leaflet


    【解决方案1】:

    您必须存储选择(但可以是标记中的polyline 点或标志)。当您选择两个或更多标记时,您必须向您添加点 polyline - 它会在地图上绘制线,否则您必须从 polyline 中删除点。查看polyline的详细信息:http://leafletjs.com/reference.html#polyline

    参见下一个代码示例:

    // Init map
    var map = L.map('map').setView([53.902257, 27.561640], 13);
    L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
    
    // Init selection and lines logic
    var selection = [];
    var polyline = L.polyline([], {color: 'red'}).addTo(map);
    
    var onClick = function () {
        var index = selection.indexOf(this);
        if (index !== -1) {
            this.setRadius(10);
            selection.splice(index, 1);
            polyline.spliceLatLngs(index, 1);
        } else {
            this.setRadius(25);
            selection.push(this);
            polyline.addLatLng(this.getLatLng())
        }
    };
    
    // Init circle markers
    L.circleMarker([53.90, 27.56]).on('click', onClick).addTo(map);
    L.circleMarker([53.92, 27.60]).on('click', onClick).addTo(map);
    L.circleMarker([53.88, 27.60]).on('click', onClick).addTo(map);
    
    // Init selection droping on ESC pressed
    L.DomEvent.on(document, 'keydown', function (e) {
        if (e.keyCode === 27) {
            var oldSelection = selection.slice(0);
            for (var i = 0, l = oldSelection.length; i < l; i++) {
                oldSelection[i].fire('click');
            }
        }
    });
    

    UPD:

    类推,见更新代码:

    var map = L.map('map').setView([51.49521, -0.10062], 13);
    L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', {
        maxZoom: 18,
        attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>'
    }).addTo(map);
    
    // get all 6 points
    var points = [
        [51.49346, -0.11518],
        [51.49827, -0.06763],
        [51.48331, -0.08154],
        [51.52284, -0.09974],
        [51.51932, -0.06695],
        [51.50949, -0.1363]
    ];
    
    // polyline
    var selection = [];
    var polyline = new L.Polyline([], {
        color: 'red',
        weight: 5,
        smoothFactor: 1
    }).addTo(map);
    
    var changeMarkerState = function (marker, select) {
        if (marker instanceof L.CircleMarker) {
            if (select) {
                marker.setRadius(25);
            } else {
                marker.setRadius(10);
            }
        }
        if (marker instanceof L.Marker) {
            if (select) {
                marker.options.title = 'selected';
            } else {
                marker.options.title = 'unselected';
            }
            marker.setIcon(new L.Icon.Default());
        }
    };
    
    var onClick = function () {
        var index = selection.indexOf(this);
        if (index !== -1) {
            changeMarkerState(this, false);
            selection.splice(index, 1);
            polyline.spliceLatLngs(index, 1);
        } else {
            changeMarkerState(this, true);
            selection.push(this);
            polyline.addLatLng(this.getLatLng())
        }
    };
    
    // centerpoint
    var centerPoint = new L.LatLng(51.49521, -0.10062);
    var marker1 = L.marker([51.49521, -0.10062],
            {title: 'unselected'}).on('click', onClick).addTo(map);
    
    
    // adding allo points to map
    for (var i = 0, l = points.length; i < l; i++)
    {
        // here I can use marker also(if solution is possible with markers)
        L.circleMarker(points[i]).on('click', onClick).addTo(map);
    }
    

    【讨论】:

    • 它单独工作正常,但与我的脚本集成时它无法正常工作。让我更新一下我的问题。
    • 在您的代码中,您创建从中心到所有点的线。 now I have to draw line between two markers//circle Markers when I select them. 是否意味着只要选择(单击)点就可以在中心和点之间画线?
    • 不,当我选择两个点时,我想在两个点(不是中心)之间创建线。这里我总共有 6 个点和 1 个中心点,所以如果我从这 6 个点中选择任何 2 个点,它应该能够在它们之间画线。
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2013-09-15
    相关资源
    最近更新 更多