我试图弄清楚如何编写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;
}
答案 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数据的初始假设。