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

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_IDgeometry(LINESTRING [m])Cruise_IDdateConditionObsSidePS
125(362210.4 4786933, 362299.5 4786863, 362378.3 4786793, …)2022102022-10-141Starboard

缓冲区生成代码

# 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:17:02