3

bearing当我使用包中的函数计算点之间的geosphere方位角时,得到的方位角跨度为 -180 - 180 度。但是,根据geosphere包装文档,我预计轴承可以跨越 0-360 度。这是文档中的引用:

方向以度数表示(北 = 0 和 360,东 = 90,南 = 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]
4

1 回答 1

3

根据导航任务,“角度”、“方向”、“航向”和/或“方位”等术语可能表示不同的含义。

Bearing() 函数的文档谈到

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

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

当您谈到标准化的初始航向(北:= 000 或 360 度)时,您的参考不是您的外观,而是您遵循的航向。例如,船舶或飞机在必须修正风偏移时飞行特定航线。关于航向和航向(船头或飞机的机头指向的方向)之间的区别,我在此不再赘述。但是,为了确定航向,需要从“北向 360”中减去左转(负方位角),同时将正方位角添加到(北向解释为 0)。

要在数学上解决这个问题,您可以采用长角数学方式(参见这个基于 atan 的解决方案)。

我们可以通过添加一个“全圆”(360 度)来强制一个正号,然后使用模运算符检查我们已经超出了北标记(360)的距离。例如 90 + 360 = 450 与 450 % modulo-360% = 1 * 360 + 90 = 90。对于负方位角,这会产生 -90 + 360 = 270 或表示为 360 的模数:270 = 0 * 360 + 270。模数总是加后的数。请注意,您还可以添加 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
于 2019-01-04T01:16:55.690 回答