【问题标题】:Shiny leaflet map tiles not appearing闪亮的传单地图图块没有出现
【发布时间】:2018-07-09 03:43:14
【问题描述】:

示例数据:

tab1_data <- data.table( id = c(1,2,3,4),
                         londd = c(-1.610245, -0.242566, -0.136315, -0.730095),
                         latdd = c(52.98752, 54.04599, 50.79249, 51.16059),
                         type = c("A", "B", "C", "D"),
                         price = c(175000, 61000, 62500, 72500))

我已按照this SO post 中的示例进行操作(非常感谢,谢谢)。我尝试根据我在this link 中看到的内容将地图提供程序更改为 MapBox,但在输出时,地图不会呈现。请看下图,代码也在下面。

代码:

library(leaflet)
library(data.table)

#Set up ui
ui <- fluidPage(
    titlePanel("Panel"),
    sidebarPanel(h5("", width=1),
                 checkboxGroupInput(inputId = "TypeFlag",label = h4("Type"), 
                                    choices = setNames(object = c("A", "B", "C", "D"),
                                                       nm = c("A", "B", "C", "D")),
                                    selected = c("A", "B", "C", "D")
                 ),
                 position="left"),
    
    #App mainPanel content and styles
    mainPanel(fluidRow(leafletOutput(outputId = "map")))
  )

#Set up server
server <- function(input, output){
  #Build leaflet map
  map <- leaflet(data = tab1_data) %>%
    addProviderTiles("MapBox", 
                     options = providerTileOptions(id = "mapbox.light", noWrap = FALSE, 
                                                   accessToken = Sys.getenv('MAPBOX_ACCESS_TOKEN'))) %>%
    fitBounds(~min(londd), ~min(latdd), ~max(londd), ~max(latdd))

  #Filter data
  datFilt <- reactive({
    MatSearch <- paste0(c('xxx', input$TypeFlag), collapse = "|")
    tab1_data[grepl(MatSearch,type)]
  })

  #Add markers based on selected flags
  observe({
    if(nrow(datFilt()) == 0) {
      print("Nothing selected")
      leafletProxy("map") %>%
        clearMarkerClusters()
    } else { #print(paste0("Selected: ", unique(input$InFlags&input$InFlags2)))
      print("Something Selected")
      leafletProxy("map", data=datFilt()) %>% 
        clearMarkerClusters() %>% 
        addCircleMarkers(lng = ~londd, lat = ~latdd,
                         clusterOptions = markerClusterOptions(), weight=3,
                         color = "#90EE90", opacity=1, fillColor = "#228B22", 
                         fillOpacity = 0.8)
    }
  })

  output$map <- renderLeaflet(map)
}

#Run app
shinyApp(ui = ui, server = server)

值得注意的是,如果我将addProviderTiles() 中的代码替换为下面的代码,它确实可以工作(但我更喜欢 MapBox 的美学,希望我可以使用它!):

"Stamen.TonerLite", options = providerTileOptions(noWrap = TRUE)

我认为这与注册 MapBox 有关系吗?但是,我有一个功能正常的地图,没有使用this SO post 作为示例进行注册。

我已尝试在帖子开头为the link 设置地图参数,但这不起作用(值得一试)。如果我在浏览器中打开与在弹出窗口中一样,我会得到相同的结果。最后,复选框具有功能性和反应性。

我不会撒谎说我确切地知道 shinyapp 和传单地图是如何运作的,所以任何解释都会令人惊叹,即使它只是一个教育评论!

谢谢, 西姆斯

【问题讨论】:

  • 您已经检查了环境变量MAPBOX_ACCESS_TOKEN 的值是预期值,对吧?
  • @IvanSanchez,是的,检查过 - 我也尝试过创建一个新令牌,但没有任何运气。很抱歉没有在问题中解释这一点,但感谢您的建议!

标签: r shiny leaflet mapbox


【解决方案1】:

虽然这里可能存在一些闪亮的相关问题(稍后会详细介绍),但问题似乎可以简化为以下内容:

library(leaflet)

## Works
leaflet() %>%
  addProviderTiles("Stamen.TonerLite") 

## Doesn't Work
leaflet() %>%
  addProviderTiles("MapBox", 
                   options = providerTileOptions(id = "mapbox.light",
                                                 noWrap = FALSE, 
                                                 accessToken = Sys.getenv('MAPBOX_ACCESS_TOKEN'))) 

如果使用 Mapbox 的第二个仍然不适合您,则您的 accessToken 无效、已过期或未按您期望的方式作为环境变量存储/返回。

要消除您是否拥有有效令牌的问题,请尝试临时对其进行硬编码以代替环境变量调用。

注意:我在一篇博文中找到了一个实际工作的令牌来测试,以下 sn-p 包含一个部分编辑的版本。

library(leaflet)

MBaccessToken <- "pk.eyJxIjxxxWJyZxNraGxiLxxxIjQoxxxxHX1xpRSx9.9xPQxA3xdxyxAxPkxYxYE"

leaflet() %>%
  addProviderTiles("MapBox", 
                   options = providerTileOptions(id = "mapbox.light",
                                                 noWrap = FALSE, 
                                                 accessToken = MBaccessToken)) 

显示如下:

如果 (且仅当) 有效,则继续执行以下操作。

第 2 部分:潜在的shiny 问题

如果在交互式会话(我假设为 RStudio)中运行时可以正确呈现地图,但地图不会呈现为 shiny 应用程序,则可以进行故障排除。

  • 应用程序是否仅在交互式 RStudio 会话、本地管理的 Shiny-server、shinyapps.io 或其他第 3 方云服务上运行?
  • 当应用程序在该环境中运行时,应用程序是以什么用户身份运行的?该用户的环境变量是如何定义的,您是否可以控制它们?

长话短说,如果应用程序未部署在您正在测试的同一台服务器上并以同一用户身份运行,那么在部署时Sys.getenv() 调用将给出与在 RStudio 中测试时不同的结果.

一种简单的测试方法是将以下行添加到您的示例应用程序中以进行测试,以确保按预期从环境变量中读取令牌。

在 ui 中添加某处:

textOutput("token")

添加到服务器:

output$token <- renderText(Sys.getenv('MAPBOX_ACCESS_TOKEN'))

【讨论】:

  • 感谢您精心呈现和深思熟虑的答案,地图现在可以正常工作了!真正深入的解释,确实非常有帮助!
【解决方案2】:

您的应用程序运行良好。我尝试了两种不同的 mapbox 令牌,它们都在工作。试试这个:

accessToken = 'your_token_from_your_mapbox_account')) %>%

【讨论】:

  • 解决了!我没想过要删除Sys.getenv() 电话,但仅此而已。谢谢!
猜你喜欢
  • 2021-12-30
  • 2019-09-03
  • 2023-01-11
  • 1970-01-01
  • 2018-10-30
  • 2016-12-29
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多