使用st_intersection后如何获取所有相交多边形的属性?
解决方案
针对你用st_intersection处理后得到的origins列,不需要复杂拆分再绑定,直接利用origins里的原始多边形索引,就能快速匹配并生成对应的属性列,下面是两种实用方法:
方法1:生成合并的属性字符串列
直接将每个相交区域对应的所有tree_type合并成一个字符串(比如oak, pine),两种实现方式可选:
基础R实现
# 生成合并的tree_type字符串 s_intersection$tree_types <- sapply(s_intersection$origins, function(idx) { paste(s$tree_type[idx], collapse = ", ") }) # 可选:移除原来的origins列 s_intersection <- s_intersection[, !names(s_intersection) == "origins"]
tidyverse实现
library(dplyr) library(purrr) s_intersection <- s_intersection %>% mutate(tree_types = map_chr(origins, ~ paste(s$tree_type[.x], collapse = ", "))) %>% select(-origins)
方法2:拆分为多列属性
如果需要将每个参与相交的多边形属性单独列出来(比如tree_type_1、tree_type_2),可以用以下方式:
tidyverse自动适配实现
library(dplyr) library(tidyr) library(purrr) s_intersection <- s_intersection %>% # 将每个origins索引转换为对应tree_type的小数据框 mutate(tree_list = map(origins, ~ tibble(type = s$tree_type[.]))) %>% # 拆分为多列,自动根据最大相交数生成列名 unnest_wider(tree_list, names_sep = "_") %>% # 移除原origins列 select(-origins)
基础R固定列数实现
# 先找到最多有多少个多边形相交 max_intersect <- max(lengths(s_intersection$origins)) # 生成对应数量的属性列 for (i in 1:max_intersect) { col_name <- paste0("tree_type_", i) s_intersection[[col_name]] <- sapply(s_intersection$origins, function(idx) { if (length(idx) >= i) s$tree_type[idx[i]] else NA_character_ }) } # 移除origins列 s_intersection <- s_intersection[, !names(s_intersection) == "origins"]
完整示例流程
把生成数据、相交处理、属性匹配整合起来:
set.seed(131) library(sf) library(dplyr) library(purrr) # 创建模拟数据 m <- rbind(c(0,0), c(1,0), c(1,1), c(0,1), c(0,0)) p <- st_polygon(list(m)) n <- 20 l <- vector("list", n) for (i in 1:n) l[[i]] <- p + 10 * runif(2) s <- st_sfc(l) s <- st_as_sf(s) s$tree_type <- rep(c("oak", "pine", "fir"), length.out=nrow(s)) # 自相交操作 s_intersection <- st_intersection(s) # 方法1:生成合并属性字符串 s_intersection <- s_intersection %>% mutate(tree_types = map_chr(origins, ~ paste(s$tree_type[.x], collapse = ", "))) %>% select(-origins) # 查看结果 head(s_intersection)
内容的提问来源于stack exchange,提问作者ifoxfoot
相关产品推荐
相关产品推荐

