如何用sf包循环生成并绘制纬度偏移2米的多条Linestring?
实现方法
首先要明确:经纬度坐标(WGS84,EPSG:4326)是角度单位,直接加数值无法精准对应“上移2米”的实际距离,所以必须先转换为米为单位的投影坐标系(比如UTM),完成平移后再转回地理坐标系。
1. 修正并完善原线串生成代码
先给原始数据指定正确的地理坐标系,避免后续投影转换出错:
library(sf) library(dplyr) # 生成原始数据,直接用data.frame避免类型转换问题 ID <- 1:3 long <- c(1,2,3) lat <- c(1,2,1) a <- data.frame(ID, long, lat) # 转换为sf对象并生成LineString,指定WGS84坐标系(EPSG:4326) line <- a %>% st_as_sf(coords = c("long", "lat"), crs = 4326) %>% summarize(do_union = FALSE) %>% st_cast("LINESTRING")
2. 用循环生成平移后的线串
这里用for循环实现两次平移,每次沿纬度方向(对应投影坐标系的Y轴)上移2米:
# 转换为UTM投影(自动匹配对应区域的UTM EPSG,保证米级精度) line_utm <- st_transform(line, crs = st_crs(line) %>% st_utm()) # 创建列表存储所有线串,先放入原始线串 line_list <- list(line_utm) # 循环2次,生成平移后的线串 for (i in 1:2) { # 沿Y轴平移2*i米(第一次+2米,第二次+4米) shifted_geom <- st_geometry(line_utm) + st_sfc(st_point(c(0, 2*i)), crs = st_crs(line_utm)) # 转换为sf对象并加入列表 line_list[[i+1]] <- st_sf(geometry = shifted_geom, crs = st_crs(line_utm)) } # 合并所有线串为一个sf对象,再转回WGS84坐标系 all_lines <- do.call(rbind, line_list) %>% st_transform(crs = 4326) # 查看最终结果 print(all_lines)
3. 可视化验证
可以用基础绘图快速确认三条线的位置关系:
plot(st_geometry(all_lines), col = c("black", "red", "blue"), lwd = 2) legend("topright", legend = c("原始线串", "上移2米", "上移4米"), col = c("black", "red", "blue"), lwd = 2)
替代方案:用lapply简化代码
如果觉得for循环不够简洁,也可以用lapply直接生成所有平移后的线串:
# 定义所有平移距离(0为原始线串,2、4为两次平移的距离) shift_distances <- c(0, 2, 4) all_lines_utm <- lapply(shift_distances, function(d) { st_sf(geometry = st_geometry(line_utm) + st_sfc(st_point(c(0, d)), crs = st_crs(line_utm)), crs = st_crs(line_utm)) }) %>% do.call(rbind, .) %>% st_transform(4326)
内容的提问来源于stack exchange,提问作者BosBas
相关产品推荐
相关产品推荐

