【问题标题】:Adding markers from an array into Leaflet将数组中的标记添加到 Leaflet
【发布时间】:2014-11-25 00:23:52
【问题描述】:

我正在尝试将数组中的标记添加到传单地图中。我正在尝试从数组中获取弹出信息、图层和坐标。我一定遗漏了一些明显的东西,因为我无法提取图层信息。

markersArray[i][1] 返回值“layer1”,但在 .addTo 方法中不起作用。

编辑:我已更改代码以解决标记出现在集群外部的问题:

我的代码如下:

var markersList = [];
var markersList = [
[41.15,-8.61,'popup1','layer1'],
[41.15,-8.61,'popup2','layer1'],
[41.15,-8.31,'popup3','layer2'],
[41.15,-8.31,'popup4','layer2']
];

var markers = new L.MarkerClusterGroup();

for (var i = 0; i < markersList.length; i++) {
markers.addLayer(new L.marker([markersList[i][0], markersList[i][1]]).bindPopup(markersList[i][2]));
markers.addTo(layer1); // working
markers.addTo(markersList[i][3]); // not working
map.addLayer(markers);
};

感谢您的帮助。

【问题讨论】:

    标签: arrays leaflet


    【解决方案1】:

    那是因为markersArray[i][1] 是字符串的类型。如果你想用它来引用 layer1 对象,你可以使用 this[markersArray[i][1]];

    因提问者编辑而编辑:

    你还在犯同样的错误。 addTo 方法需要一个层的实例作为参数,而不是一个包含您的层实例的变量名称的字符串。 markerList[i][3] 包含一个字符串,其名称为 layerinstance 的变量名称,而不是该层的实例。如果你想通过字符串获取该层的实例,你应该使用:this[markersList[i][3]]。这将导致以下代码:

    markers.addTo(this[markersList[i][3]]);
    

    这里 'this' 代表您当前的范围,markersList[i][3] 带有您的变量名称的字符串,因此它会导致 'this["layer1"]' 这是对您的 layerinstance 的引用。我假设您已经在该范围内声明了变量 layer1 并且它包含 layerinstance:

    var layer1 = new L.LayerGroup();
    

    但我无法从您当前的代码中扣除这一点,因为您已经删除了创建图层组实例的位置。

    【讨论】:

    • 感谢您的帮助。仍然没有运气,或者我可能不明白你的意思。我已经更改了原始帖子中的代码,因为我遇到了一个标记总是出现在集群之外的问题。 Tks
    • 谢谢。我现在更好地理解它了。它现在没有输出错误,但不知何故,标记被放置在两个图层中;即在 Leaflet 图层控件中隐藏 layer1 或 layer2 隐藏/显示所有标记...我会尝试弄清楚
    • 您可以通过将它们记录到控制台来轻松检查是否将正确的标记添加到正确的图层。例如:console.log(layer1._layers);
    • 是的。所有 4 个对象(标记)都在 layer1 和 layer2 上,它们应该是 layer1 中的 2 和 layer2 中的 2。
    • 由于您的编辑,我对您要完成的工作感到有些困惑。在您使用 layerGroup 之前,现在您突然加入了 MarkerClusterGroup。在我的回答完全有效之前,更改问题的上下文对于我和其他试图帮助或寻找相同解决方案的用户来说并不容易。我建议接受最佳答案和/或使用您的新代码和清晰的问题描述以及 plunkr 上的一个不错的测试用例打开一个新问题。
    【解决方案2】:

    addTo 用于向地图添加标记。传递markersArray 不会像你发现的那样工作。

    我猜你打算有多个图层,每个图层都包含一些你添加到地图的功能。您可能需要使用图层字典,并将每个图层名称映射到相应的传单图层对象。

    var layerLookup {};
    layerLookup["layer1"] = new L.LayerGroup().addTo(map);
    layerLookup["layer2"] = new L.LayerGroup().addTo(map);
    
    ... // other code
    
    for (var i = 0; i < markersArray.length; i++) {
        marker = new L.marker([markersArray[i][2],markersArray[i][3]])
        .bindPopup(markersArray[i][0]).addTo(layerLookup[markersArray[i][1]]);
    };
    

    【讨论】:

    • 您能详细说明一下吗?我更改了一些代码以使集群与图层一起工作(有一个问题:1 个标记总是在集群“外部”)。我已经编辑了原始帖子中的代码。谢谢。
    • 看起来您选择了另一个答案并打开了一个新问题。希望你能搞清楚。
    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多