如何在R中将两个Simple Feature Collection合并为单个GeoJSON FeatureCollection
合并区级与地区级Simple Feature Collection为单个GeoJSON FeatureCollection
我在R中有两个由Shapefile转换而来的Simple Feature Collection,分别对应区级(districts)和地区级(regions)数据。需要将它们合并为单个GeoJSON FeatureCollection,且两者属性名不同,以便后续在MapBox地图中过滤数据图层(例如一个图层为区级人口数据,另一个为地区级人口数据)。当前代码如下:
library(sf) library(dplyr) library(sfheaders) library(geojsonio) path_to_data <- "Ghana_261" sf_use_s2(FALSE) districts <- read_sf(path_to_data) %>% select(DIST_NAME = Name, REGION = Pcode) %>% st_make_valid() %>% sf_remove_holes() regions <- districts %>% group_by(REGION) %>% summarise() %>% sf_remove_holes() plot(regions) # how do I combine these into a single geojson? districts_json <- geojson_json(districts) regions_json <- geojson_json(regions)
解决方案
要合并两个属性结构不同的sf对象并导出为单个GeoJSON,核心是先统一两者的属性列结构,再合并导出:
- 添加层级标识与补全属性列:给每个数据集添加用于区分层级的标记列(比如
admin_level),同时补全对方缺失的属性列(用NA填充),确保两个sf对象的列名完全一致。 - 合并sf对象:用
bind_rows()合并处理后的两个数据集。 - 导出为GeoJSON:直接将合并后的sf对象导出为GeoJSON文件。
修改后的完整代码:
library(sf) library(dplyr) library(sfheaders) library(geojsonio) path_to_data <- "Ghana_261" sf_use_s2(FALSE) districts <- read_sf(path_to_data) %>% select(DIST_NAME = Name, REGION = Pcode) %>% st_make_valid() %>% sf_remove_holes() %>% # 添加区级标识,保留原有属性 mutate(admin_level = "district") regions <- districts %>% group_by(REGION) %>% summarise() %>% sf_remove_holes() %>% # 添加地区级标识,补全区级特有的DIST_NAME列(用NA填充) mutate(admin_level = "region", DIST_NAME = NA_character_) # 合并两个sf对象 combined_sf <- bind_rows(districts, regions) # 导出为GeoJSON文件 geojson_write(combined_sf, file = "combined_ghana.geojson")
关键说明
admin_level列可以在MapBox中作为过滤条件,快速区分区级和地区级要素图层。- 补全缺失属性列是为了让
bind_rows()正常合并两个sf对象,GeoJSON会保留这些NA值,不影响后续过滤逻辑。 - 最终导出的GeoJSON是标准FeatureCollection,包含所有区级和地区级要素,每个要素都带有
admin_level、DIST_NAME、REGION属性。
内容的提问来源于stack exchange,提问作者L Smeets
相关产品推荐
相关产品推荐

