【问题标题】:Highlighting Leaflet map items when using Marker Cluster plugin使用 Marker Cluster 插件时突出显示 Leaflet 地图项
【发布时间】:2014-08-27 15:31:15
【问题描述】:

我在 AngularJS 应用程序上使用 Leaflet 和 Marker Cluster 插件。

在选择地图的项目时,我需要突出显示它。因为我使用的是 divIcons,所以我正在添加或删除类,如果项目不是标记,也会设置颜色。

为此,我将最后点击的项目保存在内存中,以便在选择下一个项目时,我可以取消突出显示前一个项目并突出显示当前项目。

        // De-highlight previous item
        if (lastClickedLayer) {
            if (lastClickedLayer instanceof L.Marker) {
                lastClickedLayer._icon.classList.remove('marker-highlighted');
            }
            else {
                lastClickedLayer.setStyle({
                    color: (lastClickedLayer.feature.status === 'active') ? '#43A7E0' : '#EB7938'
                });
            }
        }

        // Highlight item on the map
        lastClickedLayer = e.layer;

        if (e.layer instanceof L.Marker) {
            e.layer._icon.classList.add('marker-highlighted');
        }
        else {
            e.layer.setStyle({
                color: '#32C9AC'
            });
        }

如果没有标记聚类,一切都会好起来的!当我缩小并获得一组当前标记(假设我先选择一个标记)然后放大回该群集时,我选择的标记没有分配“标记突出显示”类。

Also, If I'm at the vey end of zoom-in and clusters are showing spider-webs of markers (or how they're called), when cluster in which is selected marker is closed, I can't seem取消设置该层的类 - 它只是未定义。

我怎样才能解决我的问题?

哦,我的地图项保存为新的 L.MarkerClusterGroup()。

【问题讨论】:

    标签: leaflet leaflet.markercluster


    【解决方案1】:

    当标记被选中时,您可以尝试从群集中移除标记...

    markerCluster.removeLayer(selectedMarker);
    map.addLayer(selectedMarker);
    

    并在取消选择时将其放回集群...

    map.removeLayer(selectedMarker);
    markerCluster.addLayer(selectedMarker);
    

    您可以看到一个示例 here 显示单选

    每次创建标记时,都会添加此点击处理程序...

            m.on('click', function(e) {
                if(selectedMarker != false) {
                    map.removeLayer(selectedMarker);
                    markerCluster.addLayer(selectedMarker);
                    selectedMarker.setIcon(unselectedIcon);
                    if(selectedMarker == e.target) {
                        console.log('clear selection');
                        selectedMarker = false;
                    }
                    else {
                        console.log('change selection');
                        selectedMarker = e.target;
                        selectedMarker.setIcon(selectedIcon);
                        markerCluster.removeLayer(selectedMarker);
                        map.addLayer(selectedMarker);
                    }
                }
                else {
                    console.log('new selection');
                    selectedMarker = e.target;
                    selectedMarker.setIcon(selectedIcon);
                    markerCluster.removeLayer(selectedMarker);
                    map.addLayer(selectedMarker);
                }
            });
    

    但是,我可以看到 2 个缺点:

    1. 如果你想要一个弹出窗口,你必须使用另一个事件
    2. 标记从群集中检索或添加到群集时的移动可能会打扰用户

    【讨论】:

    • 您的方法似乎没问题,但有一个但是。当我将选定的标记添加到地图图层时,我需要对其进行一些修改(更改颜色)。所以首先将选定的标记保存到内存中。但显然当我把它放回集群时,不知何故它也改变了颜色。也许您知道如何复制(克隆、复制)我可以将原始副本保存在内存中的标记/特征/子层,并且在删除修改过的副本时,我可以将原始副本放回集群?
    • 您是否点击了我的示例的链接。当您单击一个标记时,它会变为黑色,当您再次单击它或单击另一个标记时,它会再次变为红色并返回到集群。
    • 嗯,每次添加和删除时都会设置图标(或在我的情况下为颜色)。但是没有办法保存标记的原始状态并仅在选择标记时更改标记,但在取消选择时将其恢复为保存在内存标记中的原始状态?在这种情况下,它只使用了两种类型的标记 - 活动和非活动。但我有不同类型的标记,颜色不同)。
    • 我明白你的意思。创建标记时,您可以在引用正确图标的位置添加 2 个属性(marker.selectedIcon 和 marker.unselectedIcon)。你只需要写:selectedMarker.setIcon(selectedMarker.selectedIcon)。你明白我的意思吗?
    • 每次选择和取消选择时,我都遵循您的方法和样式层。这是唯一一种正常工作的方法。谢谢,我会接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多