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

如何从JSON提取地理坐标并用R Leaflet重现加拿大LTE覆盖地图

解决步骤

1. 先明确JSON数据的结构

解析JSON后,先用str(json_data, max.level = 2)或glimpse(json_data)查看整体结构,确认地理坐标的存储层级——比如是GeoJSON标准的features -> geometry -> coordinates,还是自定义的嵌套字段。

2. 提取多边形坐标

情况1:数据是标准GeoJSON

如果解析后是GeoJSON格式,直接用sf::st_read()读取(可跳过jsonlite解析,直接读URL或本地文件):

library(sf)
lte_sf <- st_read("path/to/your/lte_data.json")

这样会直接得到带地理属性的sf对象,坐标已自动处理完成。

情况2:自定义嵌套结构的JSON

如果是非标准结构,比如坐标存在data$regions$polygons$points这类嵌套列表里,用purrr包递归提取:

library(purrr)
# 假设坐标在features下的geometry$coordinates
coords_list <- map(json_data$features, ~ .x$geometry$coordinates)
# 转换为sf多边形对象
polygons <- map(coords_list, ~ st_polygon(list(.x)))
lte_sf <- st_sfc(polygons, crs = 4326) %>% 
  st_sf() %>% 
  # 绑定其他属性(比如年份、地区)
  mutate(region = map_chr(json_data$features, ~ .x$properties$region),
         year = map_int(json_data$features, ~ .x$properties$year))

3. 用leaflet绘制地图

基于sf对象直接绘制,按年份或地区区分样式:

library(leaflet)

# 创建颜色映射(按年份区分)
pal <- colorFactor(viridis::viridis(length(unique(lte_sf$year))), domain = lte_sf$year)

leaflet(lte_sf) %>%
  addTiles() %>%  # 添加底图
  addPolygons(
    fillColor = ~pal(year),
    fillOpacity = 0.7,
    color = "#444444",
    weight = 1,
    popup = ~paste("地区:", region, "<br>年份:", year)
  ) %>%
  addLegend(pal = pal, values = ~year, title = "LTE覆盖年份")

常见问题排查

  • 如果坐标提取后显示位置异常,确认CRS为WGS84(EPSG:4326),leaflet默认使用该坐标系。
  • 如果多边形显示畸形,检查坐标是否闭合(第一个点与最后一个点是否重合),可用st_make_valid()修复无效几何:
lte_sf <- st_make_valid(lte_sf)

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:22:31