You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:35:08