如何在r中将2个简单的特征集合组合成一个GeoJSON FeatureCollection



我必须在R中shapefiles 2个简单的特征集合(一个用于地区,一个用于地区),我需要将它们组合成一个具有不同属性名称的R中的GeoJSON featurecall(这样我就可以在MapBox地图中过滤数据层,请参阅https://stackoverflow.com/a/74615216/10624798)。例如,一层可能给出每个地区的人口,另一层可能给出每个地区的人口。这似乎与:如何在GeoJSON中使用单点+多边形制作一个GeometryCollection ?

这是我到目前为止写的

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)

数据可在此下载:https://drive.google.com/file/d/1fOzxnA_vaOJi97EVPAMlquegAaoCW2Ow/view?usp=sharing

使用dplyr::bind_rows()可以轻松地将两个{sf}对象组合为一个对象-您正在构建sf对象是修改的数据帧的事实,并且数据帧可以(根据某些假设)行绑定。

"一些假设"&;是:

  • 两个对象必须具有完全相同的列结构
  • 两个对象必须有完全相同的坐标参考系统

由于您的用例要求从单个源(具有不同级别的空间聚合)构建这两个源,因此CRS应该不会引起问题。

至于列结构,我建议尽可能少的列,理想情况下只有一个id(+隐式几何列)。

作为一个实际的例子,考虑这段代码,构建在{sf}包附带的可靠的旧nc.shp上。

library(sf)
library(dplyr)

shape <- st_read(system.file("shape/nc.shp", package="sf")) # included with sf package
# 100 rows for all counties
districts <- shape %>% 
select(id = NAME) # geometry is seleted implicitly
# 1 row for entire NC state
regions <- shape %>% 
group_by(id = "NC state") %>% # this will be new name
summarise()
# merge two objects to one - 101 rows with multipolygon geometry
output <- districts %>% 
bind_rows(regions)
# save result as a geojson
st_write(output, "output.geojson")

相关内容

  • 没有找到相关文章

最新更新