Skip to content

角度、单位与三角函数 ​

假设一个点位于东经 114°,风速为向东 10 m/s。运行一秒后,把经度写成 114 + 10 会将它移到东经 124°。程序没有类型错误,物理意义却错了。单位(unit)和量纲(dimension)是数值的隐含类型;程序需要把它们显式保留下来。

从绕一圈开始 ​

角度(angle)可以用度(degree,°)或弧度(radian,rad)表示。一整圈是 360°,也是 2π rad。弧度定义为圆弧长度除以半径:θ = s / r,因此半径为 1 的圆上,弧长的数值就是弧度。

单位圆上的角度和三角函数,以及不同纬度的经度距离

在单位圆(unit circle)上,从正 X 轴逆时针转过 θ,对应点是 (cos θ, sin θ)。余弦(cosine)给水平分量,正弦(sine)给垂直分量。它们是比例,没有米这样的长度单位。JavaScript 的 Math.sin、Math.cos 接收弧度。

符号 / 英文含义单位
θ / angle转过的角度rad,转换前也可为 °
r / radius圆的半径m
s / arc length沿圆弧走过的长度m
φ / latitude纬度公式中使用 rad
λ / longitude经度公式中使用 rad

手算:30° 与一小段经度 ​

30° = π/6 rad,因此 cos(30°) ≈ 0.866,sin(30°) = 0.5。长度 100 m、与东向夹角 30° 的平面位移,东向约 86.6 m、北向 50 m。

先把地球近似为半径 R = 6,371,000 m 的球。纬度 φ 上的纬圈半径是 R cos φ;沿该纬圈走过经度差 Δλ,对应弧长为:

θrad=θdegπ180,s=Rcos⁡φΔλ

经度差 0.01° 在赤道约为 1,112 m,在北纬 60° 约为 556 m。这里计算的是球面纬圈上的弧长;两点最短的球面路径通常不沿纬圈。小区域位移可借它建立直觉,精确距离计算应使用椭球测地线(geodesic)。

ts
const toRadians = (degrees: number) => degrees * Math.PI / 180
const toDegrees = (radians: number) => radians * 180 / Math.PI
const R = 6_371_000
const latitudeRad = toRadians(60)
const deltaLongitudeRad = toRadians(0.01)
const eastMetres = R * Math.cos(latitudeRad) * deltaLongitudeRad
// 约 555.975 m;北纬60°的球面纬圈弧长

const headingRad = Math.atan2(4, 3)
// 向量(3,4)与正X轴的夹角,约0.9273 rad,即53.13°

atan2(y, x) 是双参数反正切(two-argument arctangent),能区分象限。atan(y / x) 会丢失这些信息,也难以处理 x = 0。这里的角度从正 X 轴逆时针计算;相机航向或罗盘方位的起点、方向可能不同,必须阅读对应定义。

自检:能直接相加吗 ​

  1. Math.sin(90) 是否等于 1?
  2. 两个位置的经度差是 1°,能否直接说它们相距 111 km?
  3. 速度 12 m/s,经过 5 s,得到什么量?
答案与理由
  1. 不等于。传入的是 90 rad,应写 Math.sin(toRadians(90))。
  2. 不能。距离还依赖纬度、路径和地球模型;经度差本身是角度。
  3. 位移长度为 60 m,前提是这段时间内速度大小与方向保持不变。量纲检查为 (m/s) × s = m。

下一步:向量、点积与叉积。回到主课:经纬度、椭球与 ECEF。

气象学 · 数学基础 · 地理可视化