计算 2D 平面中点到点的罗盘航向

Compute compass heading from point to point in a 2D plane

我想弄清楚如何编写一个 R 函数来计算从 space 中的一个点到附近固定塔的罗盘航向。距离足够近,可以假设一个 2d 平面。我玩过 tan-1(m) 但我似乎没有得到正确的答案。

我需要以度为单位的输出,并且无论塔相对于点的哪个方向都是灵活的(因为点可以位于塔的任何方位)。

有人知道怎么做吗?这是一些数据:

dat <- data.frame("pointID" = c(1,2,3,4),
             "X" = c(640379,640430, 640308, 637710),
             "Y" = c(3933474,3933575, 3933365, 3935346),
             "towerX" = rep(640372,4),
             "towerY" = rep(3933487,4))

我不清楚你的价值观是什么坐标系。但假设它们是 UTM,我会将它们转换为 WGS80(然后它们可以很好地绘制在 google 地图等上)使用这样的东西:

UTMtoWGS80 <- function(x, y){
  require(rgdal)
  d <- data.frame(lat = y,
                  lon = x)
  coordinates(d) <- c("lon", "lat")
  proj4string(d) <- CRS("+init=epsg:32630")
  d <- spTransform(d,CRS("+init=epsg:4326"))
  return(data.frame(d@coords))
}

pos <- UTMtoWGS80(dat$X, dat$Y)
tower <- UTMtoWGS80(dat$towerX, dat$towerY)

接下来编写一个计算罗盘方位的函数,例如:

radians <- function(deg) return(deg*pi/180)

degrees <- function(x) x * (180 / pi)

bearing <- function(lat1, lng1, lat2, lng2){
  lat1 <- radians(lat1) 
  lat2 <- radians(lat2)
  dLon = radians(lng2-lng1)
  y = sin(dLon) * cos(lat2)
  x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon)
  brng = degrees(atan2(y, x))
  (brng + 360) %% 360
}

这基本上改编自这个有用的 resource,并产生以下轴承:

> bearing(pos$lat, pos$lon, tower$lat, tower$lon)
[1] 332.70347 214.17031  28.47364 125.93292

显然这取决于 UTM 数据的初始假设。