Cesium,已知基础点位置、方位角、俯仰角、距离,求目标点位置。

// 雷达设备的侦察数据,侦察到的目标只有方位角、俯仰角、距离,需要计算出经纬高度,在界面上显示目标
// 基于cesium实现根据基础点坐标、方位角、俯仰角、距离,计算目标点经纬度高度。
// 示例: calcTargetPosition(120, 30, 1000, -45, -45, 1000);
function offsetFromHeadingPitchRange(lonDegrees, latDegrees, height, azimuthDegrees, pitchDegrees, distance) {
  let heading = Cesium.Math.toRadians(azimuthDegrees);
  let pitch = Cesium.Math.toRadians(pitchDegrees);
  pitch = Cesium.Math.clamp(pitch,-Cesium.Math.PI_OVER_TWO,Cesium.Math.PI_OVER_TWO);
  heading = Cesium.Math.zeroToTwoPi(heading) - Cesium.Math.PI_OVER_TWO;
  const pitchQuat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Y,-pitch);
  const headingQuat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Z,-heading);
  const rotQuat = Cesium.Quaternion.multiply(headingQuat,pitchQuat,headingQuat);
  const rotMatrix = Cesium.Matrix3.fromQuaternion(rotQuat);
  const offset = Cesium.Cartesian3.clone(Cesium.Cartesian3.UNIT_X);
  Cesium.Matrix3.multiplyByVector(rotMatrix, offset, offset);
  Cesium.Cartesian3.multiplyByScalar(offset, distance, offset);
  const basePointCartesian3 = Cesium.Cartesian3.fromDegrees(lonDegrees, latDegrees, height);
  const transform = Cesium.Transforms.eastNorthUpToFixedFrame(basePointCartesian3);
  const result = Cesium.Matrix4.multiplyByPoint(transform, offset, new Cesium.Cartesian3());
  const targetPointCartographic = Cesium.Cartographic.fromCartesian(result);
  const targetPointLongitude = Cesium.Math.toDegrees(targetPointCartographic.longitude);
  const targetPointLatitude = Cesium.Math.toDegrees(targetPointCartographic.latitude);
  const targetPointHeight = targetPointCartographic.height;
  // 经度、纬度、高度、空间坐标笛卡尔坐标
  return [targetPointLongitude, targetPointLatitude, targetPointHeight, result];
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐