计算 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 数据的初始假设。
我想弄清楚如何编写一个 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 数据的初始假设。