如何在R语言中计算Voronoi单元周长并保存至Shapefile?
计算分类Voronoi单元周长并保存为Shapefile的正确实现
问题场景
已生成包含红、蓝两类点的数据集,通过ggvoronoi绘制了分类Voronoi单元,需要计算红、蓝两类单元的周长(含单个单元周长及颜色维度的总周长),并将结果保存到Shapefile中。
修正后的完整代码
# 1. 模拟生成两类点数据集 set.seed(123) df1 <- data.frame(longitude = rnorm(100, 10, 1), latitude = rnorm(100, 10, 1), color = "red") df2 <- data.frame(longitude = rnorm(100, 8, 1), latitude = rnorm(100, 8, 1), color = "blue") df <- rbind(df1, df2) # 2. 绘制分类Voronoi单元 library(ggvoronoi) ggplot(df, aes(x = longitude, y = latitude, fill = color)) + geom_voronoi() + geom_point() + scale_fill_manual(values = c("red", "blue")) # 3. 计算周长并保存为Shapefile library(sf) # 生成带原数据属性的Voronoi多边形(保留color列) vor_spdf <- voronoi_polygon(data = df, x = "longitude", y = "latitude") # 转换为sf格式对象 vor_sf <- st_as_sf(vor_spdf) # 计算每个Voronoi单元的周长 vor_sf$perimeter <- st_length(vor_sf) # 可选:按颜色汇总总周长 color_total_perimeter <- aggregate(perimeter ~ color, data = vor_sf, sum) print(color_total_perimeter) # 保存到Shapefile(delete_layer避免重复文件报错) st_write(vor_sf, "voronoi_with_perimeter.shp", delete_layer = TRUE)
关键说明
- 属性关联:
voronoi_polygon会保留原数据集的所有属性(包括color),因此每个Voronoi单元都能对应到所属的颜色类别。 - 周长计算:
sf包的st_length()函数对多边形对象计算的就是其周长,直接赋值给新列即可完成单个单元的周长计算。 - 颜色维度汇总:通过
aggregate()按color分组求和,可快速得到红、蓝两类单元的总周长。 - 冗余代码移除:原代码中的
fortify_voronoi()是用于ggplot可视化的辅助函数,计算周长时无需调用,可直接移除。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

