R Shiny Leaflet地图不显示邮编标记且出现OSGB_1936警告如何解决
问题修复说明
1. 标记无法显示的核心原因
你创建crime数据框时语法错误,Longitude列的赋值少了c()包裹,导致数据结构异常,后续空间筛选无法得到正确结果:
# 原错误写法 Longitude = -2.406439,-2.406439 # 正确写法 Longitude = c(-2.406439,-2.406439)
同时你的地图初始化时仅加载了筛选后的点,没有添加原点邮编的标记,且未对空的筛选结果做兼容处理,也会导致标记不显示。
2. OSGB_1936警告的解决方法
该警告是因为新版PROJ库不再推荐使用+init=epsg:xxx的CRS定义格式,更换为标准的EPSG字符串声明格式即可消除警告。
修复后完整代码
library(shiny) library(leaflet) library(shinyjs) library(rgeos) library(tidyverse) library(sp) # 原点邮编数据 crime_df <- data.frame( Postcode = "WN1 3LU", box = 2, Latitude = 53.546367, Longitude = -2.620909 ) # 其他邮编数据,修正Longitude列的赋值语法 crime <- data.frame( Postcode = c("BL7 9YH","BT36 7WE"), box = c(7,1), Latitude = c(53.613982,54.613982), Longitude = c(-2.406439,-5.406439) ) # 调整CRS声明格式消除警告 coordinates(crime) = ~Longitude+Latitude proj4string(crime) = CRS(SRS_string = "EPSG:4326") crime <- spTransform(x = crime, CRS = CRS(SRS_string = "EPSG:27700")) ui <- fluidPage( shinyjs::useShinyjs(), titlePanel("Crime Map"), mainPanel(leafletOutput("map")), fluidRow(column( 3, sliderInput( "miles", "Miles from location", min = 1, max = 200, value = 100, width = '120px' ) )) ) server <- function (input, output, session) { output$map <- renderLeaflet({ inside_df <- inside_df() # 初始化地图 lf <- leaflet() %>% addTiles() %>% setView(lng = crime_df$Longitude, lat = crime_df$Latitude, zoom = 8) %>% # 先加原点标记 addMarkers( lng = crime_df$Longitude, lat = crime_df$Latitude, popup = paste0("原点:", crime_df$Postcode) ) # 筛选结果非空时添加标记 if(nrow(inside_df) > 0) { lf <- lf %>% addMarkers( lng = inside_df$Longitude, lat = inside_df$Latitude, popup = inside_df$Postcode ) } return(lf) }) circle <- reactive({ location <- crime_df %>% dplyr::select(Latitude, Longitude) coordinates(location) <- ~Longitude+Latitude proj4string(location) = CRS(SRS_string = "EPSG:4326") location <- spTransform(location, CRS = CRS(SRS_string = "EPSG:27700")) circle <- gBuffer(location, width = input$miles * 1609.34) circle }) inside_df <- reactive({ circle = circle() inside = crime[circle,] # 筛选范围内的点 inside = spTransform(inside, CRS(SRS_string = "EPSG:4326")) inside_df = as.data.frame(inside) inside_df }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者awz1
相关产品推荐
相关产品推荐

