如何用R的sf包按物种批量生成最小凸多边形并导出Shapefile
按物种批量生成最小凸多边形并导出Shapefile
问题说明
在R中使用sf包处理空间数据时,现有包含物种分布点的数据集,需要按species字段分组生成每个物种的最小凸多边形(通过st_convex_hull),同时要实现200个物种的自动化批量处理,并将结果导出为Shapefile格式。当前代码仅能生成所有点的单个凸多边形,无法分组处理。
解决方案代码
完整实现代码
# 加载所需包 library(sf) library(tidyverse) library(mapview) # 创建示例数据集 lat <- c(15.53033,15.53033,15.5219,15.1739,19.08333,17.13333,18.09861,21.27667,25.54863,18.80907,25.54147, 20.0605,23.299,25.5501,25.55005,25.54997) lon <- c(-92.802,-92.802,-92.7997,-92.3361,-96.9667,-91.9333,-94.4297,-99.2117,-100.271,-99.2168,-100.272,-97.4713, -106.443,-100.27,-100.27,-100.27) species <- c("Sp1", "Sp1","Sp1", "Sp1","Sp1", "Sp1","Sp1", "Sp2","Sp2","Sp2","Sp2","Sp2","Sp2","Sp2","Sp2","Sp2") df <- data.frame(lat, lon, species) # 转换为sf空间对象 df_sf <- df %>% sf::st_as_sf(coords = c("lon", "lat"), crs = "EPSG:4326") # 按物种分组生成最小凸多边形 species_convex_hulls <- df_sf %>% dplyr::group_by(species) %>% dplyr::summarize( geometry = st_convex_hull(st_union(geometry)) ) # 可视化结果 mapview::mapview(species_convex_hulls) # 导出为Shapefile sf::st_write(species_convex_hulls, "species_convex_hulls.shp", delete_layer = TRUE)
关键步骤说明
- 分组处理:使用
dplyr::group_by(species)按物种分组,再通过summarize结合st_union(geometry)合并同物种的所有点,最后用st_convex_hull生成该物种的最小凸多边形。 - 批量处理:该逻辑无需修改即可直接处理200个物种的数据集,分组操作会自动遍历所有唯一物种。
- 导出Shapefile:使用
sf::st_write函数,delete_layer = TRUE参数用于覆盖已存在的同名文件(若需要)。
内容的提问来源于stack exchange,提问作者Álvaro Scuack
相关产品推荐
相关产品推荐

