如何将两个sf几何字段合并为单个GeometryCollection类型的几何字段?
解决方案
报错原因
你之前的代码错误在于:list(geometry.x, geometry.y)是将整个列的几何对象传入st_geometrycollection,而非逐行提取每个场地对应的两个几何元素。这导致函数接收的是整列数据,而非每行的单个MultiPolygon和MultiLineString,从而触发长度不匹配的报错。
正确实现步骤
不需要将sf对象转为普通data.frame,sf本身兼容dplyr的属性连接操作,直接按以下步骤处理:
重命名几何列避免冲突
先将其中一个sf对象的几何列重命名,防止合并后列名冲突:lines_sf <- lines_sf %>% rename(lines_geom = geometry)基于ID属性合并sf对象
直接用left_join按id合并两个sf对象,保留所有属性和几何列:combined_sf <- areas_sf %>% left_join(lines_sf, by = "id")逐行生成GeometryCollection
使用rowwise()逐行处理,将每个场地的两个几何对象合并为GeometryCollection:combined_sf <- combined_sf %>% rowwise() %>% mutate(geometry_combined = st_geometrycollection(list(geometry, lines_geom))) %>% ungroup() %>% st_set_geometry("geometry_combined")若数据量较大,推荐用
purrr::map2实现更高效的逐行处理:library(purrr) combined_sf <- combined_sf %>% mutate(geometry_combined = map2(geometry, lines_geom, ~st_geometrycollection(list(.x, .y)))) %>% st_set_geometry("geometry_combined")
验证结果
处理完成后,combined_sf的几何列即为每个场地的GeometryCollection,包含对应的MultiPolygon(场地范围)和MultiLineString(墙体特征),可直接对其应用仿射变换。
内容的提问来源于stack exchange,提问作者TCW
相关产品推荐
相关产品推荐

