如何在R语言(含terra包)中将无序线段转换为闭合多边形?
在R语言中将无序线段坐标转换为有序闭合多边形坐标
完全可以实现,我们不需要生成特定空间包的多边形对象,核心是把离散的坐标点按规则排序,让依次连接后自然形成闭合多边形。
示例输入
你提供的无序线段数据代码如下:
library(terra) geom <- as.matrix(data.frame( "id" = rep(1:6,each = 2), "x" = c(1,1,3,3,4,3,3,1,4,3,1,3), "y" = c(2,3,1,2,2,2,4,3,2,4,2,1) )) l <- vect(geom, type = "lines") plot(l)
目标输出
我们需要得到按顺序排列的坐标集合,连接后形成闭合多边形,示例如下:
coords <- data.frame( "x" = c(1,1,3,4,3,3,1), "y" = c(2,3,4,2,2,1,2)) plot(coords) lines(coords)
无额外依赖的实现方案
通过坐标中心化+极角排序的方式,就能快速完成坐标的有序排列,具体代码如下:
# 先将矩阵转为数据框方便操作 geom_df <- as.data.frame(geom) # 保存原始坐标的均值,用于后续恢复 x_mean <- mean(geom_df$x) y_mean <- mean(geom_df$y) # 坐标中心化:将所有点平移到以原点为中心 geom_df$x_centered <- geom_df$x - x_mean geom_df$y_centered <- geom_df$y - y_mean # 计算每个点相对于中心的极角 geom_df$angle <- atan2(geom_df$x_centered, geom_df$y_centered) # 按极角排序,同时去除重复点 sorted_points <- unique(geom_df[order(geom_df$angle), ]) # 首尾添加相同点,形成闭合多边形的坐标序列 sorted_points <- rbind(sorted_points, sorted_points[1, ]) # 恢复原始坐标(如果不需要中心化偏移,可跳过此步) sorted_points$x <- sorted_points$x_centered + x_mean sorted_points$y <- sorted_points$y_centered + y_mean # 提取最终的有序坐标集合 coords <- sorted_points[, c("x", "y")] # 验证效果 plot(coords) lines(coords)
基于terra包的辅助处理(可选)
如果你想用terra包先提取线段的所有端点,再进行排序,可参考以下代码:
library(terra) # 读取线段数据 l <- vect(geom, type = "lines") # 提取所有端点的XY坐标 points_df <- as.data.frame(l, geom = "XY") # 后续步骤和上述无依赖方案一致 x_mean <- mean(points_df$x) y_mean <- mean(points_df$y) points_df$x_centered <- points_df$x - x_mean points_df$y_centered <- points_df$y - y_mean points_df$angle <- atan2(points_df$x_centered, points_df$y_centered) sorted_points <- unique(points_df[order(points_df$angle), ]) sorted_points <- rbind(sorted_points, sorted_points[1, ]) sorted_points$x <- sorted_points$x_centered + x_mean sorted_points$y <- sorted_points$y_centered + y_mean coords <- sorted_points[, c("x", "y")]
内容的提问来源于stack exchange,提问作者Zoe
相关产品推荐
相关产品推荐

