如何从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
相关产品推荐
相关产品推荐

