如何将MultiLineString合并为LineString以在sf中生成规则采样点?
在R的sf包中处理MultiLineString的规则采样点生成
情况1:MultiLineString的子线段连通
如果你的MultiLineString由连通的子线段组成,直接用st_line_merge()合并为单个LineString,就能按总长度均匀生成采样点,这和QGIS重绘的效果一致:
# 合并连通的MultiLineString为单一LineString single_line <- st_line_merge(your_multi_line_data) # 生成指定数量的规则采样点(示例为15个) sample_points <- st_line_sample(single_line, n = 15) # 转换为sf点对象便于后续操作 sample_points_sf <- st_sf(geometry = sample_points)
情况2:MultiLineString的子线段不连通
如果子线段不连通,无法合并为单个LineString,可按各线段长度比例分配采样数量,再合并结果:
- 拆分MultiLineString为单个LineString对象:
line_segments <- st_cast(your_multi_line_data, "LINESTRING")
- 计算长度并分配采样数:
# 计算每条线段的长度 seg_lengths <- st_length(line_segments) total_len <- sum(seg_lengths) # 设定总采样数 total_samples <- 20 # 按长度比例分配采样数,调整确保总数匹配 sample_nums <- round((seg_lengths / total_len) * total_samples) sample_nums[1] <- sample_nums[1] + (total_samples - sum(sample_nums))
- 批量采样并合并:
# 逐个线段生成采样点 sample_list <- lapply(seq_along(line_segments), function(i) { st_line_sample(line_segments[i], n = sample_nums[i]) }) # 合并所有采样点 all_samples <- do.call(c, sample_list) all_samples_sf <- st_sf(geometry = all_samples)
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

