计算2D平面中点对点的罗盘方向

时间:2019-07-18 14:53:37

标签: r trigonometry

我试图弄清楚如何编写R函数来计算从空间中的点到附近的固定塔的罗盘方向。该距离足够接近以假设为2d平面。我玩了tan-1(m),但似乎没有找到正确的答案。

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

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

$files = Get-ChildItem "C:\source\*.xml"
$output = "C:\changed\"
foreach ($file in $files) {
    [System.Xml.XmlDocument]$doc = New-Object System.Xml.XmlDocument;
    $doc.set_PreserveWhiteSpace($true);
    $doc.Load($file);

    $root = $doc.get_DocumentElement();
    $xml = $root.Get-Content $file;
    $xml = '<?xml version="1.0" encoding="utf-8"?>' + $xml

    $newFile = $output + $file.Name
    Set-Content -Encoding UTF8 $newFile $xml;
}

1 个答案:

答案 0 :(得分:0)

我不清楚您的值是哪个坐标系。但是假设它们是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数据的初始假设。