在R中的地球包装中,为什么轴承不处于0-360度?

时间:2018-06-25 18:47:52

标签: r geosphere

当我使用bearing包中的geosphere函数计算点之间的方位时,所得的方位跨度为-180-180度。但是,基于geosphere软件包documentation,我希望轴承跨度为0-360度。这是来自文档的引文:

  

方向以度表示(北= 0和360,东= 90,南(Sout)= 180,西= 270度)。

我想念什么?

这是一个小例子:

# set up
library(geosphere)
library(ggplot2)

# create data frame of long/lat
long <- c(-55.25, -55.25, -55.25, -55, -55, -55, -54.75, -54.75, -54.75)
lat <- c(-13.5, -13.25, -13, -13.5, -13.25, -13, -13.5, -13.25, -13)
id <- c("a", "b", "c", "d", "e", "f", "g", "h", "i")
pts <- data.frame(id=id, long=long, lat=lat)

# plot
ggplot(pts, aes(x=long, y=lat, colour=id)) + 
  geom_point()

# calculate bearings from point e to all other points
pts <- pts[,c(2:3)]
b <- bearing(pts[5,], pts)

# I expected this:
# b[1] = 225
# b[2] = 270
# b[3] = 315
# but instead, found this:
b[1]
b[2]
b[3]

1 个答案:

答案 0 :(得分:0)

根据导航任务,“角度”,“方向”,“航向”和/或“轴承”等术语可能具有不同的含义。

bearing()函数的文档讲述了

  

从点p1到点的初始方位(方向;方位角)   p2。

因此,函数geosphere::bearing()传递的方向是方位角(角度)。显然,这些值以-180 ... 180度表示。这是您面向向北时所要转向的相对方向。这一点很重要,因为它假设您正在向北看,因此可以通过初始的左/右转弯到达目的地(或点p2),即,负方位角表示向左转,正方位角表示您的目的地在您的右侧。

当您谈论标准化初始航向(北:= 000或360度)时,参考不是​​您观察的方式,而是您所沿的航向跟随。 例如,船舶或飞机在必须修正风偏的同时飞行特定路线。在此,我不再详细介绍航向和航向(船或飞机机头指向的方向)之间的区别。 但是,为了确定航向,需要从“北向360”中减去左转弯(负方位角),而将正向方位角添加到“北向360”。

要在数学上解决此问题,您可以采用长角数学方法(参见this atan-based solution)。

我们可以通过添加“完整圆圈”(360度)来强制使用正号,然后使用取模运算符检查我们是否已超出北标(360)。 例如。 90 + 360 = 450,其中450%modulo-360%= 1 * 360 + 90 =90。对于负方位角,得出-90 + 360 = 270或表示为360的模数:270 = 0 * 360 + 270。 模始终是加号后的 rest 。请注意,您也可以添加2个或更多完整的圈子。这不会影响休息

要在R中执行此操作,只需使用模运算符(即%%)来确定超过360的余量

course <- (b + 360) %% 360 # add full circle, i.e. +360, and determine modulo for 360
pts$BEARING <- b
pts$COURSE  <- course
pts