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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:42