2 分鐘掌握衛星星座圖

話很少說,助您 2 分鐘掌握衛星星座圖,知曉原理,並能繪製javascript

效果

demo

基礎

什麼是衛星星座?html

詳細科普不在本文浪費時間了,徹底不懂的同窗瞄一下衛星星座-百度百科就能夠了。html5

實現

儲備知識

簡單解釋一下所需的數據,能獲取的衛星數據參考下圖,摘取百度文庫相關文章片斷:java

百度文庫片斷-獲取衛星角度

其中咱們所需的信息有 3 個:git

  • 衛星號(就是衛星名稱,非必須)
  • 衛星方位角
  • 衛星俯仰角

下圖先來解釋一下「方位角」與「俯仰角」是什麼樣子的:github

完整

衛星號:就是衛星名稱,即字符串,非必須,不用解釋了。測試

衛星方位角:就是衛星相對於測量點的方向,正北方向爲 0 度,順時針遞增。 字體

方位角

衛星俯仰角:就是在地平面上,要擡頭多少度,才能望到衛星,水平方向爲 0 度,頭頂的垂直方向爲 90 度。 優化

俯仰角

因此數據一般長這樣:動畫

const data = [
  { name: 11, elevation: 11, azimuth: 111 },
  { name: 22, elevation: 45, azimuth: 222 },
  { name: 33, elevation: 33, azimuth: 333 },
];
複製代碼

實現步驟

咱們使用 Canvas 來實現便可。

代碼步驟:

  1. 繪製背景框圖
  2. 繪製衛星

繪製背景框圖代碼:

這裏採用簡單地等分俯仰角度線

//畫外部圈圈
  ctx.beginPath();
  ctx.arc(0, 0, Radius, 0, Math.PI * 2, false);
  ctx.stroke();

  //畫中間圈圈
  ctx.beginPath();
  ctx.arc(0, 0, (Radius * 2) / 3, 0, Math.PI * 2, false);
  ctx.stroke();

  //畫內部圈圈
  ctx.beginPath();
  ctx.arc(0, 0, Radius / 3, 0, Math.PI * 2, false);
  ctx.stroke();

  // 畫 8 條方位角等分線
  ctx.beginPath();
  for (var i = 0; i < 8; i++) {
    ctx.rotate((Math.PI / 180) * 45);
    ctx.moveTo(0, 0);
    ctx.lineTo(0, Radius);
  }
  ctx.stroke();
複製代碼

繪製衛星代碼(核心代碼!):

下面代碼展現部分,忽略畫筆的顏色,字體設置

for (let i = 0; i < data.length; i++) {
    const element = data[i];
    ctx.beginPath();

    //核心的核心:計算衛星座標。len 是衛星投影點到圓心的距離。
    let len = Math.cos((element.elevation * Math.PI) / 180) * Radius;
    y = Math.cos((element.azimuth * Math.PI) / 180) * len;
    x = Math.sin((element.azimuth * Math.PI) / 180) * len;

    //在座標點繪製圓
    ctx.arc(x, -y, 14, 0, Math.PI * 2, false);
    ctx.fill();

    ctx.beginPath();
    //在座標點寫文字衛星號
    ctx.fillText(element.name, x, -y);
  }
複製代碼

核心代碼解釋:

這裏的重點是根據「方位角」與「俯仰角」,以及咱們定義的半徑,來算出該衛星的繪製位置。

  1. 先根據俯仰角,算出該衛星投影到地平面上的點(投影點),該點距離測量點(圓心)的距離,咱們在這裏稱其爲「圓心距」。

    圓心距

  2. 根據圓心距方位角,利用三角定理,就能夠獲得該投影點相對於圓心的相對位置。

    座標

總結

核心原理說白了就是這麼簡單。

先利用俯仰角,獲得衛星投影點與圓心的距離。

接着經過方位角與圓心距,獲得相對圓心的座標。

最後經過座標就能夠直接繪製了。

根據實際狀況,還能加上衛星類型。例如,咱們除了有 GPS 衛星,還有 GLONASS 衛星、GALILEO 衛星、以及北斗衛星。如最上面的動圖所示,不一樣顏色表明不一樣的類型的衛星。

更多

待實現:

  1. 背景框圖上,衛星俯仰角的度數實際上不是等分的。這裏並無體現。
  2. 衛星在同一個地方的壓蓋問題處理。
  3. 衛星移動(顯示/消失)動畫。

真正到生產環境,咱們還須要對繪製邏輯進行進一步的優化。具體內容,敬請關注。

以及能夠經過 3D 技術,獲取更直觀的效果。請關注下一篇內容。

但願本文對您有所幫助。

若有不對的地方,還請糾正,萬分感激。

完整代碼參考

參考:

相關文章
相關標籤/搜索