从JSON文件中过滤掉区域 [英] Filter out areas from json file

查看:0
本文介绍了从JSON文件中过滤掉区域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我还是个新手,我正在尝试在我的应用程序上增加一个功能,让我可以选择一个城市里的社区的下拉菜单。默认选择为整个城市本身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,  49.15),
              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,  49.15),
              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)

这篇关于从JSON文件中过滤掉区域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆