如何将tripack::tri.mesh输出转换为sf_linestring对象?
将tripack三角剖分结果转为sf LineString对象
要把tripack::tri.mesh生成的三角剖分对象转换成连接空间点的sf LineString对象,按以下步骤操作:
- 提取三角剖分的所有边:用
tripack::edges()函数从mesh对象中获取边的顶点索引,返回的矩阵每行对应一条边的两个顶点在原始点集中的位置(索引从1开始)。 - 去除重复边:Delaunay三角剖分的内部边会被两个三角形共享,需要去重。通过将每条边的顶点索引排序后去重即可实现。
- 构建sf LineString对象:根据去重后的边索引匹配原始点坐标,逐个生成线段并组合成sf对象。
完整代码示例:
# 原始点集与三角剖分代码 points <- data.frame( lat1=c(-26.3, -27.1, -26.8), long1=c(27.3, 28.5, 28.2), lat2=c(-26.5, -26.9, -27.2), long2=c(28.3, 27.5, 28.1)) points <- sf::st_as_sf(points, coords = c("long1","lat1"), remove = FALSE) mesh <- tripack::tri.mesh(x = sf::st_coordinates(points[,1])[,1], y = sf::st_coordinates(points[,1])[,2]) # 转换为sf LineString # 提取所有边 all_edges <- tripack::edges(mesh) # 去重重复边 sorted_edges <- t(apply(all_edges, 1, sort)) unique_edges <- unique(sorted_edges) # 获取原始点坐标 point_coords <- sf::st_coordinates(points) # 构建LineString并生成sf对象 tri_edges_sf <- lapply(1:nrow(unique_edges), function(i) { idx <- unique_edges[i, ] sf::st_linestring(rbind(point_coords[idx[1], ], point_coords[idx[2], ])) }) %>% sf::st_sfc(crs = sf::st_crs(points)) %>% sf::st_sf(geometry = ., edge_id = 1:length(.))
运行后,tri_edges_sf就是包含所有三角剖分边的sf LineString对象,与原始点集使用相同坐标系。
内容的提问来源于stack exchange,提问作者Reflexes
相关产品推荐
相关产品推荐

