R语言data.table相邻点位方位角计算 bearingRhumb报错排查
问题说明
使用data.table配合geosphere包计算轨迹点当前行与下一行坐标的方位角时,执行自定义计算逻辑后触发报错:
Error in if (sum(keep) == 0) { : missing value where TRUE/FALSE needed}
已尝试的实现代码如下:
- 加载依赖、构建测试数据集
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"))
- 生成lead偏移数据表
lead_route_dt<-route[, data.table::shift(.SD, 1, NA, "lead", TRUE), ]
- 调用方位角计算函数
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
相关产品推荐
相关产品推荐

