【问题标题】:Clustering multiple layer groups together in Leaflet R在 Leaflet R 中将多个图层组聚类在一起
【发布时间】:2017-11-16 09:54:38
【问题描述】:

对于我目前正在进行的项目,我正在尝试将多个标记层添加到 Leaflet 地图,以便最终用户可以选择他或她想要查看的标记。由于总共有很多标记,我还想将它们聚集在一起达到一定的缩放级别。然而,问题是,当我将我的标记划分为几个图层组时,它们都是单独聚集的。

具体来说,当我将标记绘制为一个图层组时,在对 addMarkers 的调用中使用 clusterOptions 时,聚类会按照我的意愿工作。当我为我的制造商使用多个图层组以便让最终用户选择他/她想要查看的标记时,在每个图层组中都会创建集群,而我希望它们都聚集在一起。

为了使这更具体,我想出了以下可重现的示例:

# Library
library(leaflet)
library(dplyr)

# Data
df <- quakes

# Plot
leaflet(df) %>%
    setView(lng=181.462, lat=-23.64275, zoom=4) %>%
    addProviderTiles("Stamen.Terrain") %>%
    addCircleMarkers(~long, ~lat, weight=2, color="Red", radius=2,
               data=filter(df, mag>=4 & mag<5),
               clusterOptions=markerClusterOptions(disableClusteringAtZoom=6),
               group="Magnitude between 4 and 5") %>%
    addCircleMarkers(~long, ~lat, weight=2, color="Blue", radius=2,
                     data=filter(df, mag>=5 & mag<6),
                     clusterOptions=markerClusterOptions(disableClusteringAtZoom=6),
                     group="Magnitude between 5 and 6")%>%
    addLayersControl(
        overlayGroups=c("Magnitude between 4 and 5", "Magnitude between 5 and 6"),
        options=layersControlOptions(collapsed=FALSE)
    )

如果您在 R 中运行此代码,您将获得一张显示斐济附近地震的地图。我添加了两个图层组来显示不同震级的地震:一组震级在 4 到 5 之间,另一组震级在 5 到 6 之间。我还添加了集群,因此地图不会被标记淹没,但类似于我在工作,为每个单独的图层组制作集群。这会导致可以彼此相邻的单独集群,而我希望将它们放在一个集群中。

所以归结为我希望将所有标记(来自多个图层组)放在同一个集群组中,因此它们都聚集在一起,而不是为每个图层组单独集群。换句话说,我想为最终用户选项保留多个标记组,但我希望所有这些标记组都在同一个集群组中,因此在选择时它们会聚集在一起。

任何帮助将不胜感激!

【问题讨论】:

    标签: r leaflet


    【解决方案1】:

    您可以只做您所做的,在叠加部分创建假图层并从中删除您的主要图层组。在集群中添加您的主要层组。然后,您可以使用地图的layer events 简单地检测删除或添加了哪个图层,如下所示。因此,您的所有标记都在一个集群中,您可以删除或添加图层。

    注意,这是java代码,把它翻译成你自己的。

    map.on("overlayadd", (e) =>{
      if (e.layer === fake_layer_4_5) markersCluster.addLayer(main_layer_4_5);
      if (e.layer === fake_layer_5_6) markersCluster.addLayer(main_layer_5_6);
    });
    map.on("overlayremove", (e) =>{
      if (e.layer === fake_layer_4_5) markersCluster.removeLayer(main_layer_4_5);
      if (e.layer === fake_layer_5_6) markersCluster.removeLayer(main_layer_5_6);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 2018-04-23
      • 2015-06-02
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多