对于相同的现实世界对象,我有两个空间描述符(我们可以简单地将它们称为“站点”)。
一个由MultiPolygons (描述站点的宽框架(areas_sf
))组成;另一个由MultLine(Strings)组成,它描述各种物理特性,比如站点内的墙壁(lines_sf
)。两个空间层使用相同的CRS系统。
每个对象都使用st_read()作为sf对象加载到R中。空间层中的每个站点都有一个独特的标识文本/字符列,理论上可以通过它们进行匹配(即合并或连接)。我希望能够将每个站点的所有类型(简单)空间特征组合成一个单独的几何集合,这样仿射变换就可以应用到所有这些站点上。但我想不出如何将这两组特性合并到一个几何集合中。
使用dplyr的普通left_join()
不工作,因为它不喜欢连接两个sf对象。st_join
也不合适,因为它考虑的是空间关系,而不是关系已经由文本键定义的事实。
由于sf对象是data.frames,其几何封装在指定的几何列(geom
或geometry
)中,因此似乎应该可以先加入包含几何列的data.frames,然后以某种方式组合(或合并?)几何x和几何y以一种逐行的方式进入GeometryCollection(s),然后转换回单个sf对象。但是怎么做呢?
大概是这样(不工作的) dplyr流:-
library(dplyr)
library(sf)
...
a1 <- areas_sf %>% as.data.frame()
l1 <- lines_sf %>% as.data.frame()
combined <- a1 %>% left_join(l1,by("id"="id")) %>%
mutate(geometry_combined=st_geometrycollection(list(geometry.x,geometry.y))) %>%
set_geometry("geometry_combined")
Error in `mutate()`:
! Problem while computing `geometry_combined =
st_geometrycollection(st_sfc(geometry.x, geometry.y))`.
Caused by error in `vapply()`:
! values must be length 3,
but FUN(X[[1]]) result is length 2
这可能是很明显的事情,我就是想不出来!
发布于 2022-08-19 07:50:38
对于那些展望未来的人来说,rowwise()
似乎实现了我想要的目标:-
a1 <- areas_sf %>% as.data.frame()
l1 <- lines_sf %>% as.data.frame()
combined <- a1 %>% left_join(l1,by("id"="id")) %>%
rowwise() %>%
mutate(geometry = list(st_geometrycollection(c(geometry.x,geometry.y)))) %>%
dplyr::select(-geometry.x,-geometry.y) %>%
st_set_geometry("geometry") %>%
st_set_crs(st_crs(areas_sf))
https://stackoverflow.com/questions/73406658
复制