如何将R数据框中的多边形坐标按顺时针方向排序?
解决方案:多边形坐标顺时针排序并合并到数据框
方法一:利用质心角度排序(严格顺时针)
通过计算坐标点相对于多边形质心的角度,按角度降序排序(对应顺时针方向),确保坐标严格按顺时针排列。
library(dplyr) library(sf) # 1. 将多边形列表绑定为带ID的sf数据框 polygons_sf <- bind_rows(your_polygon_list) %>% mutate(polygon_id = row_number()) # 为每个多边形分配唯一ID,用于分组 # 定义坐标顺时针排序函数 sort_clockwise <- function(poly) { # 提取多边形的X/Y坐标矩阵 coords <- st_coordinates(poly)[, 1:2] # 计算多边形质心坐标 centroid <- st_centroid(poly) %>% st_coordinates() # 计算每个点相对质心的弧度角度(atan2(y差, x差),逆时针为正) angles <- atan2(coords[, 2] - centroid[2], coords[, 1] - centroid[1]) # 按角度降序排序,实现顺时针排列 sorted_coords <- coords[order(-angles), ] # 确保多边形闭合(首尾点一致) if (!all(sorted_coords[1, ] == sorted_coords[nrow(sorted_coords), ])) { sorted_coords <- rbind(sorted_coords, sorted_coords[1, ]) } return(sorted_coords) } # 2. 应用排序函数并提取坐标到数据框 test.all <- polygons_sf %>% rowwise() %>% mutate(sorted_coords = list(sort_clockwise(geometry))) %>% unnest(sorted_coords) %>% rename(X = V1, Y = V2) %>% select(polygon_id, X, Y) %>% st_drop_geometry()
方法二:利用sf内置函数反转逆时针多边形(简洁高效)
sf提供st_is_ccw()判断多边形是否为逆时针方向,若为逆时针则用st_reverse()反转坐标顺序,转为顺时针。
library(dplyr) library(sf) # 1. 绑定多边形列表并调整坐标方向 polygons_sf <- bind_rows(your_polygon_list) %>% mutate(polygon_id = row_number(), # 判断多边形是否为逆时针方向 is_counter_clockwise = st_is_ccw(geometry)) %>% rowwise() %>% # 逆时针多边形反转坐标,转为顺时针 mutate(geometry = if (is_counter_clockwise) st_reverse(geometry) else geometry) %>% ungroup() # 2. 提取坐标到数据框 test.all <- polygons_sf %>% st_cast("POINT") %>% mutate(X = st_coordinates(geometry)[, 1], Y = st_coordinates(geometry)[, 2]) %>% select(polygon_id, X, Y) %>% st_drop_geometry()
注意事项
- 替换代码中的
your_polygon_list为你实际的多边形列表对象。 polygon_id用于区分不同多边形的坐标,可根据需求调整或移除。- 方法一适合需要严格按顺时针角度排序的场景,方法二更适合快速修正sf默认的多边形方向。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

