Листовка с несколькими поставщиками плиток с лаппли - PullRequest
0 голосов
/ 28 мая 2020

Я хотел бы добавить OpenStreetMap , OpenTopoMap и Stamen.TonerLines в список к карте листовок.

Я получаю те имена с

library("leaflet"); library("leafem")
names(providers)[c(1,10,40)]
[1] "OpenStreetMap"     "OpenTopoMap"       "Stamen.TonerLines"

Моя карта - это

n = leaflet() %>% 
addTiles(group = "Base") %>% 
setView( lng = 1, lat = 40, zoom = 5 ) 
n  

enter image description here

Мой lapply код это

lapply(
  c(1,10,40),  
  function(i) addProviderTiles(map=n, names(providers)[i], layerId = i, group =names(providers)[i]) 
)

lapply(
  c(1,10,40), 
  function(i) addLayersControl(map=n, baseGroups = names(providers)[i]) 
)

Теперь у меня только последний тайл!

enter image description here

Как я могу добавить эти тайлы, используя lapply?

1 Ответ

1 голос
/ 28 мая 2020

Вы можете сделать что-то вроде этого

n = leaflet() %>% 
addTiles(group = "Base") %>% 
setView( lng = 1, lat = 40, zoom = 5 )

n %>% addProviderTiles(providers$OpenStreetMap, group = 'OpenStreetMap') %>% 
  addProviderTiles(providers$OpenTopoMap, group='OpenTopoMap') %>% 
  addLayersControl(baseGroups = c('OpenStreetMap', 'OpenTopoMap'))

Обернуть в индекс вызова функции

layered_map <- function(..., provider=NULL, base_map_name="Base") {
  select_providers <- provider[c(...)]
  iter <- function(providers, layerid) {
    if (length(providers)==0) {
      leaflet() %>% addTiles(group = base_map_name) %>% setView(lng = 1, lat = 40, zoom = 5 )
      } else {
        iter(providers[-length(providers)], layerid-1) %>% 
          addProviderTiles(providers[[length(providers)]], 
                           layerId = layerid, 
                           group = providers[[length(providers)]])
      }
  }

  controlnames <- if (length(select_providers)==0) base_map_name else names(select_providers)
  iter(select_providers, length(select_providers)) %>% addLayersControl(baseGroups = controlnames)
}

Чтобы вызвать функцию:

library("leaflet")
library("leafem")
layered_map(1, 10, 40, provider=providers)

map with multiple layers and controls

Это довольно общий c. Итак, если вы хотите создать базовую карту без дополнительных слоев. Вы можете просто набрать

layered_map()

или

layered_map(base_map_name="My base map") 

, что даст вам base map

...