Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grouped layer control in Leaflet R

Tags:

r

leaflet

There is a plug-in for Leaflet JS that allows to group the layers in the layer control. https://github.com/ismyrnow/Leaflet.groupedlayercontrol

This plug-in does not seem to exist for Leaflet R but I found this post saying that there is a way to use arbitraty Leaflet JS plug-in in Leaflet R. https://gist.github.com/jcheng5/c084a59717f18e947a17955007dc5f92

I tried to apply this method to the Leaflet.groupedlayercontrol plug-in but did not succeed. Do you have any idea how I can possibly use this plug-in or any other way to group my layers in the layercontrol generated by Leaflet R? Thank you.

like image 599
CYC Avatar asked Aug 01 '16 14:08

CYC


2 Answers

I know this is an old question but I didn't find a good answer elsewhere - this may help others in the future.

Here is a reprex with comments that explains the code:

#load library
library(tidyverse)
library(leaflet)

#load data
data("quakes")

#map all points
# quakes %>% 
#   leaflet() %>% 
#   addProviderTiles(providers$CartoDB.Positron) %>% 
#   addCircleMarkers(lng = ~long, lat = ~lat, radius = 1)

#create a grouping variable -- this can be whatever you want to filter by 
quakes <- quakes %>% 
  mutate(groups = case_when(
    stations < 30 ~ 1,
    stations < 50 ~ 2,
    TRUE ~ 3
  ))


#function to plot a map with layer selection 
map_layers <- function() {

  #number of groups
  k <- n_distinct(quakes$groups)

  #base map
  map <- leaflet() %>%
    addProviderTiles(providers$CartoDB.Positron)

  #loop through all groups and add a layer one at a time
  for (i in 1:k) {
    map <- map %>% 
      addCircleMarkers(
        data = quakes %>% filter(groups == i), group = as.character(i),
        lng = ~long, lat = ~lat, radius = 1
      )
  }

  #create layer control
  map %>% 
    addLayersControl(
      overlayGroups = c(1:k),
      options = layersControlOptions(collapsed = FALSE)) %>% 
    hideGroup(as.character(c(2:k))) #hide all groups except the 1st one

}

#plot the map
map_layers()
like image 78
M_M Avatar answered Nov 06 '22 22:11

M_M


You definitely can do layer control in leafletR. If you version does not have it, then you need to update, probably from the most recent GITHUB version.

I am working on a map right now that has layer controls, see the photograph. Here is the code that makes it happen. As you can see each of the addPolygons has a group = " A Name" This is where you identify the layers in the check boxes on my image.

map<-leaflet()%>%
addTiles()%>%
addPolygons(data = plotMerge,
            fillColor = ~pal(plotMerge$incomePerCapita),
            color = "#000000", #this is an outline color
            fillOpacity = 0.8,
            group="Tract",
            weight = 0.2,
            popup=popup)%>%
addPolygons(data = countyPoly,
            fillColor = "transparent",
            color = "#000000", #this is an outline color
            fillOpacity = 0.8,
            group="County",
            popup=countyPoly@data$NAME,
            weight = 2)%>%
addPolygons(data = townPoly,
            fillColor = "transparent",
            color = "#000000", #this is an outline color
            fillOpacity = 0.8,
            group="Town",
            weight = .8,
            popup=townPoly@data$TOWN)%>%
addPolygons(data = rphnPoly,
            fillColor = "transparent",
            color = "#000000", #this is an outline color
            fillOpacity = 0.8,
            group="Public Health Region",
            weight = .8,
            popup=rphnPoly@data$PHN)%>%
addLegend(pal = pal,
          values  = plotMerge$incomePerCapita,
          position = "bottomright",
          title = "State-wide Income Percentiles",
          labFormat = labelFormat(digits=1))%>%
addLayersControl(
          overlayGroups =c("County", "Town", "Public Health Region", "Tract"),
          options = layersControlOptions(collapsed=FALSE)
          )
saveWidget(map, file="map1.html", selfcontained=FALSE)

Here is what it looks like: ACS Social Vulnerability Index Made on R & LEaflet

You can also add other controls check it out here:

Leaflet R Hidden Layers

like image 27
sconfluentus Avatar answered Nov 06 '22 21:11

sconfluentus