You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 03:45:03