微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 json 文件中过滤掉区域

如何解决从 json 文件中过滤掉区域

我是 R Shiny 的新手,我正在尝试在我的应用中添加一个功能,我可以在其中选择城市内社区的下拉菜单认选择是整个城市本身 SURREY。预计当我从 SURREY 以外的下拉菜单中选择一个街区时,我希望它过滤掉其他街区,因此只显示所选街区的轮廓。但是,当我尝试这样做时,我的地图会完全停止渲染。 JSON 文件here,我提取了它并将其放在我的相对 data 路径中。我的完整代码如下:

library(shiny)
library(shinydashboard)
library(shinyjs)
library(leaflet)
library(leaflet.extras)
library(sf)
library(ggplot2)
library(dplyr)
library(lubridate)
library(rgdal)

##constants

SURREY_LAT <- 49.15
SURREY_LNG <- -122.8
ZOOM_MIN = 10
ZOOM_MAX = 18
##

neighbourhood <- st_read("data/surrey_city_boundary.json",quiet = TRUE) %>%
  st_transform(crs = 4326)%>%
  select(NAME,geometry)

neighbourhood_names <- neighbourhood$NAME %>%
  as.character(.) %>%
  sort()
##basemap

basemap<-leaflet() %>%
  addProviderTiles(providers$CartoDB.Positron)%>%
  setView(lng = SURREY_LNG,lat =SURREY_LAT,zoom= 10)

ui <- bootstrapPage(
  tags$style(type = "text/css","html,body {width:100%;height:100%}"),leafletoutput("basemap",width = "100%",height = "100%"),absolutePanel(id = "controls",class = "panel panel-default",top = 60,left = 55,width = 250,fixed = TRUE,draggable = TRUE,height = "auto",selectInput(
      "neighbourhood_names",label = "Select a Neighbourhood:",choices=(neighbourhood_names),selected= "SURREY")
  )
)



#server
server <- function(input,output) {
  
  output$mymap <- renderLeaflet(basemap)
  
  observeEvent(input$neighbourhood_names,{
    
    if(input$neighbourhood_names =="SURREY"){
      data<- neighbourhood %>%
        filter(NAME %in% c("CITY CENTRE","ClovERDale","FLEETWOOD","GUILDFORD","NEWTON","SOUTH SURREY","WHALLEY"))}
    
    else{
      data <- neighbourhood %>% 
        filter(NAME == input$neighbourhood_names)}
    
    leafletProxy("mymap",data= neighbourhood) %>%
      setView(lng = ifelse(input$neighbourhood_names == "Surrey",-122.7953,49.15),lat = ifelse(input$neighbourhood_names == "Surrey",49.10714,zoom = ifelse(input$neighbourhood_names == "Surrey",11,12)) %>%
      clearShapes() %>%
      addpolygons(color = "#141722",weight = 3,smoothFactor = 0.5,fillOpacity = 0.1,opacity = 1)

    
  })
  
}


shinyApp(ui = ui,server = server)

解决方法

你有一些错别字。此外,您需要将 lnglat 放在数据框中,以便每个选择都有自己的坐标。目前,您将其定义为 setView 中的 49.15。修复数据框后,这应该可以工作。

SURREY_LAT <- 49.15
SURREY_LNG <- -122.8
ZOOM_MIN = 10
ZOOM_MAX = 18
##

neighbourhood <- st_read("./surrey_city_boundary.json",quiet = TRUE) %>%
  st_transform(crs = 4326) %>%
  select(NAME,geometry)

neighbourhood_names <- neighbourhood$NAME %>%
  as.character(.) %>%
  sort()
##basemap

basemap<-leaflet() %>%
  addProviderTiles(providers$CartoDB.Positron)%>%
  setView(lng = SURREY_LNG,lat =SURREY_LAT,zoom= 10)

ui <- bootstrapPage(
  tags$style(type = "text/css","html,body {width:100%;height:100%}"),leafletOutput("mymap",width = "100%",height = "100%"),absolutePanel(id = "controls",class = "panel panel-default",top = 60,left = 55,width = 250,fixed = TRUE,draggable = FALSE,height = "auto",shiny::selectInput(
                  "neighbourhood_names",label = "Select a Neighbourhood:",choices=(neighbourhood_names),selected= "SURREY"
                  
                  )
                
  )
)

#server
server <- function(input,output) {
  
  output$mymap <- renderLeaflet(basemap)
  
  observeEvent(input$neighbourhood_names,{
    req(input$neighbourhood_names)
    if(input$neighbourhood_names =="SURREY"){
      data<- neighbourhood %>%
        dplyr::filter(NAME %in% c("CITY CENTRE","CLOVERDALE","FLEETWOOD","GUILDFORD","NEWTON","SOUTH SURREY","WHALLEY"))
    } else{
      data <- neighbourhood %>% 
        dplyr::filter(NAME == input$neighbourhood_names)}
    
    leafletProxy("mymap",data= data) %>%
      setView(lng = ifelse(input$neighbourhood_names == "SURREY",-122.7953,49.15),lat = ifelse(input$neighbourhood_names == "SURREY",49.10714,zoom = ifelse(input$neighbourhood_names == "SURREY",11,12)) %>%
      clearShapes() %>%
      addPolygons(color = "#141722",weight = 3,smoothFactor = 0.5,fillOpacity = 0.1,opacity = 1)
    
    
  })
  
}

shinyApp(ui = ui,server = server)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。