如何从距离、方位角和仰角获取 3D 坐标

Posted

技术标签:

【中文标题】如何从距离、方位角和仰角获取 3D 坐标【英文标题】:How to get 3D coordinates from distance, azimuth and elevation 【发布时间】:2020-01-17 04:24:51 【问题描述】:

我在 3D 环境(一个 100x100x100 的虚拟立方体)中工作,其中每个点都由其 x、y 和 z 位置定义。我们有两个点:A 位置为 x:20 y:35 z:40 和 B x:50 y:40 z:85。使用这个算法 (https://gis.stackexchange.com/questions/108547/how-to-calculate-distance-azimuth-and-dip-from-two-xyz-coordinates) 我可以找到从 A 看到的 B 的距离、方位角和仰角。

let ax = 20;
let ay = 35;
let az = 40;

let bx = 50;
let by = 40;
let bz = 85;

let dx = bx-ax;
let dy = by-ay;
let dz = bz-az;

let dist = Math.sqrt( Math.pow(dx,2) + Math.pow(dy,2) + Math.pow(dz,2) ); // SQRT((x2–x1)2+(y2–y1)2+(z2–z1)2)
let azim = toDeg( Math.atan( dx / dy ) );                                 // arctan((x2–x1)/(y2–y1))
let elev = toDeg( Math.asin( dz / dist ) );                               // arcsin ((z2–z1) / distance)

方位角+仰角用toDeg()函数转换成度数进行验证

function toDeg (angle) 
    let a = angle * (180 / Math.PI);
    return a 

结果:

dist = 54.31390245600108
azim = 80.53767779197439
elev = 55.94671404468539

现在的问题是:如何取回 B 的初始值?知道B的A pos(20,35,40)和dist+azim+elev,是否可以得到它的位置50,40,85?

假设数学函数不返回确切的结果(截断小数),绝对精度并不重要,因为找到 49.9999 而不是 50 会给出正确的值 Math.round() -> 点 x:49.9999 y:40.0002 z:84,9999 在多维数据集中不存在。

提前谢谢帮助

【问题讨论】:

我找到了这个页面,但我不明白如何使用它...抱歉我的 trigo 水平很差 :-) gis.stackexchange.com/questions/76077/… 还有这个:softwareengineering.stackexchange.com/questions/179389/…(见最后一个答案) 【参考方案1】:

关闭以获得解决方案:

let azim = Math.atan( dx / dy ); // keep result in radians
let elev = Math.asin( dz / dist );

 X = Math.round( dist * ( Math.cos( elev ) * Math.sin( azim ) ) );
 Y = Math.round( dist * ( Math.cos( elev ) * Math.cos( azim ) ) );
 Z = Math.round( dist * Math.sin( elev ) );

最后一个要解决的问题:在某些情况下(即 X 为负且 ax 低于 Math.abs(X) )X 和 Y 是错误的。我现在正在寻找一种直接获得正确结果的方法,而不是编码条件(if/else...)。

【讨论】:

以上是关于如何从距离、方位角和仰角获取 3D 坐标的主要内容,如果未能解决你的问题,请参考以下文章

Java - 从给定的坐标、方位和距离计算第二个坐标

将云投影指向2D

通过距离和方位从已知位置查找点坐标的地理算法

如何两个WGS84坐标之间计算方位角(角向北)

Android 百度地图API 如何计算两个坐标之间的驾车距离?

计算给定方位和距离的坐标