如何在R中过滤大型GeoJSON文件:筛选保加利亚(CNTR_CODE="BG")
解决R中筛选大型GeoJSON(保加利亚数据)的问题
你的核心问题在于用jsonlite::fromJSON()读取后得到的是嵌套列表结构,dplyr::filter()无法直接作用于这种嵌套数据。其实用sf包(专门处理空间数据的工具)能更高效地解决这个问题,下面是两种方案:
方案一:用sf直接读取并筛选(推荐)
这是最简洁的方法,sf会直接将GeoJSON解析为带空间属性的数据框(sf对象),所有属性列直接可访问:
# 下载并临时存储压缩包 link <- 'https://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/nuts/download/ref-nuts-2013-01m.geojson.zip' temp <- tempfile() download.file(link, temp) # 加载sf包,直接读取解压后的GeoJSON文件 library(sf) nuts3_sf <- st_read(unzip(temp, "NUTS_RG_01M_2013_4326_LEVL_3.geojson")) # 筛选保加利亚的数据(CNTR_CODE == "BG") bulgaria_nuts3 <- nuts3_sf %>% filter(CNTR_CODE == "BG") # 验证结果:查看前几条数据的属性 head(bulgaria_nuts3) # 可选:快速绘图确认筛选结果 plot(st_geometry(bulgaria_nuts3))
方案二:基于你原有的jsonlite方法修改
如果坚持用嵌套列表处理,可以手动筛选features并重构GeoJSON结构:
library(jsonlite) library(dplyr) library(purrr) # 你的原始读取步骤 mapdata <- readLines(unzip(temp, "NUTS_RG_01M_2013_4326_LEVL_3.geojson")) mapdata <- fromJSON(mapdata, simplifyVector = FALSE) # 筛选出properties中CNTR_CODE为"BG"的features filtered_features <- mapdata$features %>% keep(~ .x$properties$CNTR_CODE == "BG") # 重构筛选后的GeoJSON数据结构 filtered_mapdata <- mapdata filtered_mapdata$features <- filtered_features # 可选:转成sf对象方便后续处理 filtered_sf <- st_as_sf(filtered_mapdata)
为什么方案一更优?因为sf是R中处理空间数据的标准工具,生成的sf对象支持所有dplyr的操作,后续的空间分析、绘图、导出都更顺畅,不需要手动处理嵌套列表的复杂结构。
内容的提问来源于stack exchange,提问作者Tim_Utrecht
相关产品推荐
相关产品推荐

