# R/bearing.R In geosphere: Spherical Trigonometry

#### Documented in bearing

```# Author: Robert J. Hijmans
# Date :  March 2010 / May 2015
# Version 2.0
# Licence GPL v3

bearing <- function(p1, p2, a=6378137, f=1/298.257223563) {

p1 <- .pointsToMatrix(p1)

if (missing(p2)) {
if (nrow(p1) < 2) {
return(NA)
}
p2 <- p1[-1, ,drop=FALSE]
p1 <- p1[-nrow(p1), ,drop=FALSE]
} else {
p2 <- .pointsToMatrix(p2)
}

p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2])
r <- .Call("_inversegeodesic", as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(a[1]), as.double(f[1]), PACKAGE='geosphere')
r <- matrix(r, ncol=3, byrow=TRUE)
c(r[, 2], NA)
} else {
r[, 2]
}
}

.old_bearing <- function(p1, p2) {
p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2])
p1 <- p[, 1:2, drop=FALSE]
p2 <- p[, 3:4, drop=FALSE]

keep <- ! apply(p1 == p2, 1, sum) == 2
res <- rep(NA, length=nrow(p1))
if (sum(keep) == 0) { return(res) }

p1 <- p1[keep, , drop=FALSE]
p2 <- p2[keep, , drop=FALSE]

dLon <- p2[,1] - p1[,1]
y <- sin(dLon)  * cos(p2[,2])
x <- cos(p1[,2]) * sin(p2[,2]) - sin(p1[,2]) * cos(p2[,2]) * cos(dLon)
azm <- atan2(y, x) / toRad
azm <- (azm+360) %% 360
i <- azm > 180
azm[i] <- -1 * (360 - azm[i])
res[keep] <- azm
return(res)
}
```

## Try the geosphere package in your browser

Any scripts or data that you put into this service are public.

geosphere documentation built on May 2, 2019, 5:16 p.m.