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

R语言data.table相邻点位方位角计算 bearingRhumb报错排查

问题说明

使用data.table配合geosphere包计算轨迹点当前行与下一行坐标的方位角时,执行自定义计算逻辑后触发报错:

Error in if (sum(keep) == 0) { : missing value where TRUE/FALSE needed}

已尝试的实现代码如下:

  1. 加载依赖、构建测试数据集
library(geosphere)
library(data.table)
route<-structure(list(counter = 1:6, lon = c(11.829711, 11.8336202, 
11.8333238, 11.8341994, 11.8336198, 11.8337213), lat = c(48.1091400999115, 
48.1153102999101, 48.1269571999072, 48.1273386999071, 48.1297995999066, 
48.1309630999063)), row.names = c(NA, -6L), class = c("data.table", 
"data.frame"))
  1. 生成lead偏移数据表
lead_route_dt<-route[, data.table::shift(.SD, 1, NA, "lead", TRUE), ]
  1. 调用方位角计算函数
apply(data.frame(route$lon,route$lat), 1, FUN = function(x) bearingRhumb(x,cbind(lead_route_dt$lon_lead_1,lead_route_dt$lat_lead_1)))
错误原因
  • 传参逻辑不符合bearingRhumb的入参要求:apply逐行迭代时,参数x仅为当前行单个坐标点,但函数第二个参数传入了全量6行的lead坐标矩阵,两个入参的长度不匹配。
  • 未处理NA值:shift生成lead值时,最后一行无后续点位,对应的经纬度为NA,bearingRhumb无法处理含NA的坐标输入,触发内部逻辑判断报错。
修正方案

无需额外构造偏移后的新表,直接在原data.table内生成lead经纬度列,按行传入坐标矩阵计算即可,最后一行无后续点位时方位角自动返回NA,不会触发报错:

# 生成下一点位的经纬度列,逐行计算方位角
route[, c("lead_lon", "lead_lat") := shift(.SD, 1, type = "lead"), .SDcols = c("lon", "lat")]
route[, bearing := bearingRhumb(cbind(lon, lat), cbind(lead_lon, lead_lat))]

# 查看计算结果
route[]

计算完成后bearing列即为当前点位到下一个点位的等角航线方位角,单位为度,正北为0度,顺时针旋转取值范围为0-360度。

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:18:15