闪亮的leaflet地图瓦片未显示

4

示例数据:

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))

我已经按照这个Stack Overflow帖子中的示例进行了操作(非常感谢您)。我尝试根据此链接的内容更改地图提供商为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注册有关?然而,我使用此SO帖子作为示例已经拥有了一个可用的地图。
我尝试按照链接中的设置地图参数,但这并未奏效(值得一试)。如果我在浏览器中打开或在弹出窗口中打开该地图,我将得到相同的结果。最后,复选框是功能性和响应式的。
我不会撒谎说我确切地知道shinyapp和leaflet地图如何运作,因此任何解释都是惊人的,即使只是教育性评论!
谢谢, Simse

1
你已经检查过环境变量MAPBOX_ACCESS_TOKEN的值是否如预期一样了吗? - IvanSanchez
@IvanSanchez,是的,我已经检查过了 - 我也尝试创建了一个新的令牌,但没有任何运气。非常抱歉在问题中没有解释清楚,但还是谢谢你的建议! - TheNerdyCat
2个回答

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无效、已过期或未按您预期的方式存储/返回为环境变量。
为了消除您是否拥有有效令牌的问题,请尝试在环境变量调用的位置临时将其硬编码。
注意:我在一篇博客文章中找到了一个实际可用的令牌进行测试,以下代码片段包含部分已打马赛克的版本。
library(leaflet)

MBaccessToken <- "pk.eyJxIjxxxWJyZxNraGxiLxxxIjQoxxxxHX1xpRSx9.9xPQxA3xdxyxAxPkxYxYE"

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

显示这个:

map

如果(且仅当)它有效,那么继续以下步骤。
第二部分:潜在的闪亮问题
如果您可以在交互式会话中(我假设是RStudio)正确地渲染地图,但地图无法作为闪亮应用程序呈现,则可能存在故障排除的可能性。
- 应用程序是否仅在交互式RStudio会话、本地管理的闪亮服务器、shinyapps.io或其他第三方云服务上运行? - 当应用程序在该环境中运行时,应用程序作为哪个用户运行?该用户的环境变量如何定义,您是否对其具有控制权?
长话短说,如果应用程序没有部署在您正在测试并以相同用户身份运行的同一服务器上,则当部署时,Sys.getenv()调用将给出与在RStudio中测试时不同的结果。
测试这一点的简单方法是,在示例应用程序中添加以下行以进行测试,以确保从环境变量中读取令牌的方式符合预期。
在UI中的任何位置添加:
textOutput("token")

添加到服务器:

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

非常感谢您提供的精心准备和深思熟虑的答案,现在地图可以正常工作了!真的是非常详细的解释,确实非常有帮助!谢谢! - TheNerdyCat

1

您的应用程序运行良好。我尝试了两个不同的Mapbox令牌,它们都可以正常工作。请尝试以下方法:

accessToken = 'your_token_from_your_mapbox_account')) %>%

解决了!我没有想到要删除 Sys.getenv() 的调用,但这就是解决问题所需的一切。谢谢! - TheNerdyCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接