st_buffer设置endCapStyle=FLAT且singleSide=TRUE渲染异常排查
单侧缓冲区生成异常问题排查
我尝试为约600条样带线创建单侧缓冲区,但渲染结果异常。
已尝试的解决措施
- 分别使用sf(v1.0-16)和terra(v1.7-71)库实现缓冲区生成
- 将经纬度数据投影至UTM 10区(尝试UTM 9区结果类似)
- 尝试开启/关闭
sf_use_s2()空间索引功能 - sf与terra的实现结果均存在相同的形状扭曲错误
- 昨日运行代码时效果稍好,更多样带能生成正确缓冲区,但仍未全部正常
复现代码与数据说明
library(sf) # v1.0-16 library(ggplot2) library(dplyr) library(units) library(terra) library(tmap) # 关联GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() 为TRUE # 从完整数据集构建LineString - 保存多点数据用于故障排查 obs_pt <- obs %>% filter(is.na(Transect_ID) == FALSE) %>% st_as_sf(coords = c("lon", "lat"), na.fail = FALSE, crs = "epsg:4326") %>% group_by(Transect_ID) %>% summarize() %>% filter(st_geometry_type(.) == "MULTIPOINT") obs_ls <- obs_pt %>% st_cast("LINESTRING", keep=TRUE) # 将经纬度投影至UTM平面坐标系以使用平面几何计算 obs_ls_planer <- obs_ls %>% st_transform("EPSG:32610") # 10区覆盖研究区域大部分范围 # 筛选单条样带用于可复现示例: obs_ls_125 <- obs_ls_planer %>% filter(Transect_ID == 125) saveRDS(obs_ls_125, paste0(usr, dir, "obs_ls_125.rda")) obs_ls_125 <- readRDS("obs_ls_125.rda") obs_ls_125
样带数据信息
Simple feature collection with 1 feature and 5 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 361857.1 ymin: 4786302 xmax: 362981.9 ymax: 4787215
Projected CRS: WGS 84 / UTM zone 10N
| Transect_ID | geometry(LINESTRING [m]) | Cruise_ID | date | Condition | ObsSidePS |
|---|---|---|---|---|---|
| 125 | (362210.4 4786933, 362299.5 4786863, 362378.3 4786793, …) | 202210 | 2022-10-14 | 1 | Starboard |
缓冲区生成代码
# sf库实现单侧缓冲区 obs_ls_125.b <- st_buffer(obs_ls_125, dist = 100, endCapStyle = "FLAT", singleSide = TRUE) # terra库实现单侧缓冲区 vsp <- terra::vect(obs_ls_125) buffer_terra <- terra::buffer(vsp, width = 100, capstyle = "FLAT", singlesided = TRUE) buffer_terra.sf <- sf::st_as_sf(buffer_terra) # 可视化sf生成的缓冲区 ggplot() + geom_sf(data = obs_ls_125.b, fill = "yellow")+ geom_sf(data = obs_ls_125, color = "blue", linewidth = 1)+ geom_sf(data = obs_ls_125.b %>% st_cast("POINT"), color = "orange") # 显示多边形顶点 # 可视化terra生成的缓冲区 ggplot() + geom_sf(data = buffer_terra.sf, fill = "pink")+ geom_sf(data = buffer_terra.sf %>% st_cast("POINT"), color = "orange")
结果表现
- sf生成的缓冲区:黄色填充的多边形与蓝色样带线位置关系异常,橙色顶点显示缓冲区形状扭曲
- terra生成的缓冲区:粉色填充的多边形同样存在明显的形状扭曲
- 原始GPS点路径:按时间着色的点显示样带线的实际连续路径,无明显断裂或异常
内容的提问来源于stack exchange,提问作者rachael orben
相关产品推荐
相关产品推荐

