Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to "addTiles" on top of "addPolygons" in R's Leaflet?

Tags:

r

leaflet

How do you set the layer order in R's leaflet package so that tiles show up on top of polygons filled with color?

Here's what I've got so far:

require(leaflet)
require(acs)
require(tigris)
require(rgdal)
census.income.end.year = 2015
county = 17
nd.counties=acs.fetch(geography=geo.make(state="ND", county=county), 
                      table.number="B01003", endyear = 2015)

tracts <- tigris::tracts(state = 'ND', county = county, cb=FALSE, year = 2015)

# create a geographic set to grab tabular data (acs)
geo<-geo.make(state=c("ND"),
              county = county,
              tract="*")

# add in median income
median.income <- acs.fetch(endyear = census.income.end.year, 
                           geography = geo, 
                           variable = c("B19013_001"))
income_df <- data.frame(paste0(as.character(median.income@geography$state), 
                               str_pad(as.character(median.income@geography$county), 3, 'left', '0'), 
                               str_pad(as.character(median.income@geography$tract), 5, 'left', '0')), 
                        median.income@estimate)

rownames(income_df)<-1:nrow(income_df)
names(income_df)<-c("GEOID", "hhincome")
income_merged <- geo_join(tracts, income_df, "GEOID", "GEOID")

income_merged <- spTransform(income_merged, CRS("+init=epsg:4326"))

qpal <- colorQuantile("plasma", income_df$hhincome, n = 4)

leaflet() %>% 
  setView( -96.7898, 46.8772, zoom=11) %>% 
  addPolygons(data = income_merged, 
              fillColor = qpal(income_merged$hhincome), 
              fillOpacity = 1, 
              weight = 0.3) %>%
  addProviderTiles(providers$Hydda.RoadsAndLabels) 

Ultimately, I'ld like to do this with addTiles (instead of addProviderTiles as in the above code) using a custom MapBox, but I can't figure out how to make that reproducible for this example... given that you need a key to access custom MapBox tiles (BTW, I've created a custom MapBox tile that should be transparent except for roads and labels, so the underlying polygons should "show thru.")

Here is one way to do add a tile on top of a circle with the non-R version of leaflet: http://jsfiddle.net/dcu9pz2w/, but I don't see how to make that work in my context. I think adding "panes" may be the way to go, but I don't see that functionality in R leaflet. Also, I explored z-index values, but that seemed to be a dead end.

Any help is much appreciated!

like image 789
dca Avatar asked May 09 '17 22:05

dca


1 Answers

R leaflet now includes addMapPane function. The solution to this problem is to first set up pane order and then add tiles/polygons. Reproducible example:

library(leaflet)
library(geojsonio)

# get polygon data
# https://github.com/simonepri/geo-maps/blob/master/info/countries-land.md
world <- geojson_read(
  "https://github.com/simonepri/geo-maps/releases/download/v0.6.0/countries-land-10km.geo.json", 
  what = "sp"
)

# generate random values
world@data$value <- runif(nrow(world@data))

# get color palette
color_pal <- colorNumeric(palette = "YlOrRd", domain = NULL)

# get leaflet map
leaflet() %>%
  setView(lat = 50, lng = 15, zoom = 4) %>%
  addMapPane("background_map", zIndex = 410) %>%  # Level 1: bottom
  addMapPane("polygons", zIndex = 420) %>%        # Level 2: middle
  addMapPane("labels", zIndex = 430) %>%          # Level 3: top
  addProviderTiles(
    providers$Esri.WorldTerrain,
    options = pathOptions(pane = "background_map")
  ) %>%
  addPolygons(
    data = world, stroke = FALSE, smoothFactor = 0.2,
    fillOpacity = 0.6, fillColor = ~color_pal(value),
    options = pathOptions(pane = "polygons")
  ) %>%
  addProviderTiles(
    providers$Stamen.TonerLabels,
    options = pathOptions(pane = "labels")
  )
like image 58
pieca Avatar answered Nov 11 '22 09:11

pieca