七章-83-航班軌跡

本文基于騰訊課堂老胡的課《跟我學(xué)Openlayers--基礎(chǔ)實例詳解》做的學(xué)習(xí)筆記战得,使用的openlayers 5.3.x api。

源碼 見 1040.html 浇冰,對應(yīng)的 官網(wǎng)示例 https://openlayers.org/en/latest/examples/flight-animation.html?q=animation

image.png
image.png
核心技術(shù)點:
map.on('postcompose', animateFlights)
frameState.time控制時間
使用第三方庫 arc.js 生成曲線

<!DOCTYPE html>
<html>

<head>
 <title>航班軌跡</title>
 <link rel="stylesheet" href="../include/ol.css" type="text/css" />
 <script src="../include/ol.js"></script>
 <!--第三方庫际乘,用來生成航班航線的弧線樣式  -->
 <script src="../include/arc.js"></script>
</head>
<style></style>

<body>

 <div id="map" class="map"></div>
 <script>
   var map = new ol.Map({
     layers: [
       new ol.layer.Tile({
         source: new ol.source.Stamen({ //黑白風(fēng)格的圖層漂佩,硒鼓樣式
           layer: 'toner'
         })
       })
     ],
     target: 'map',
     view: new ol.View({
       center: [0, 0],
       zoom: 2
     })
   });

   var style = new ol.style.Style({
     stroke: new ol.style.Stroke({
       color: '#EAE911',
       width: 2
     })
   });

   var flightsSource = new ol.source.Vector({
     wrapX: false,
     attributions: 'Flight data by ' +
       '<a ,
     loader: function () {
     
     var url = 'https://openlayers.org/en/latest/examples/data/openflights/flights.json'; //獲取航班出發(fā)點 目的地
       //var url = '../data/flights.json'; //獲取航班出發(fā)點 目的地
       fetch(url).then(function (response) {
         return response.json();
       }).then(function (json) {
         var flightsData = json.flights;
         for (var i = 0; i < flightsData.length; i++) {
           var flight = flightsData[i];
           var from = flight[0];
           var to = flight[1];

           // 使用多線段擬合生成的弧線
           var arcGenerator = new arc.GreatCircle(
             { x: from[1], y: from[0] },
             { x: to[1], y: to[0] });

           //跨越國際日期變更線的航班投蝉,會被切割成兩半养葵;根據(jù)弧線與國際日期變更線之間的偏移量,在10度范圍內(nèi)的瘩缆,將把線分隔開
           var arcLine = arcGenerator.Arc(100, { offset: 10 }); //用100個直線模擬弧線
           if (arcLine.geometries.length === 1) { //把arcLine 轉(zhuǎn)為 ol中的Line
             var line = new ol.geom.LineString(arcLine.geometries[0].coords);
             line.transform('EPSG:4326', 'EPSG:3857');

             var feature = new ol.Feature({
               geometry: line,
               finished: false // 標(biāo)記著飛行曲線有沒有繪制完成
             });
             // add the feature with a delay so that the animation
             // for all features does not start at the same time
             addLater(feature, i * 50); //為達到航班不是同一時間起飛的效果
           }
         }
         map.on('postcompose', animateFlights);
       });
     }
   });

   var flightsLayer = new ol.layer.Vector({
     source: flightsSource,
     style: function (feature) {
      
       if (feature.get('finished')) {
         return style;
       } else {
         return null;
       }
     }
   });

   map.addLayer(flightsLayer);



   var pointsPerMs = 0.1;

   function animateFlights(event) {
     var vectorContext = event.vectorContext;
     var frameState = event.frameState;
     vectorContext.setStyle(style);//設(shè)置矢量數(shù)據(jù)源的樣式

     var features = flightsSource.getFeatures();
     for (var i = 0; i < features.length; i++) {
       var feature = features[i];
       if (!feature.get('finished')) {
       //沒有繪制完的話关拒,根據(jù)繪制時間,判斷該繪制哪些點了
         var coords = feature.getGeometry().getCoordinates();
         var elapsedTime = frameState.time - feature.get('start');
         var elapsedPoints = elapsedTime * pointsPerMs;

         if (elapsedPoints >= coords.length) {
           feature.set('finished', true);
         }

         var maxIndex = Math.min(elapsedPoints, coords.length);
         var currentLine = new ol.geom.LineString(coords.slice(0, maxIndex));

        
         vectorContext.drawGeometry(currentLine);
       }
     }
    
     map.render();
   }

   function addLater(feature, timeout) {
     window.setTimeout(function () {
       feature.set('start', new Date().getTime()); //增加start屬性庸娱,標(biāo)記起始時間
       flightsSource.addFeature(feature);
     }, timeout);
   }
 </script>
</body>

</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夏醉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涌韩,更是在濱河造成了極大的恐慌畔柔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靶擦,死亡現(xiàn)場離奇詭異,居然都是意外死亡雇毫,警方通過查閱死者的電腦和手機玄捕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棚放,“玉大人枚粘,你說我怎么就攤上這事∑牵” “怎么了馍迄?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長局骤。 經(jīng)常有香客問我攀圈,道長,這世上最難降的妖魔是什么峦甩? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任赘来,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犬辰。我一直安慰自己嗦篱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布幌缝。 她就那樣靜靜地躺著默色,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狮腿。 梳的紋絲不亂的頭發(fā)上腿宰,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音缘厢,去河邊找鬼吃度。 笑死,一個胖子當(dāng)著我的面吹牛贴硫,可吹牛的內(nèi)容都是我干的椿每。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼英遭,長吁一口氣:“原來是場噩夢啊……” “哼间护!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挖诸,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤汁尺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后多律,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痴突,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年狼荞,在試婚紗的時候發(fā)現(xiàn)自己被綠了辽装。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡相味,死狀恐怖拾积,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丰涉,我是刑警寧澤拓巧,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站昔搂,受9級特大地震影響玲销,放射性物質(zhì)發(fā)生泄漏输拇。R本人自食惡果不足惜摘符,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逛裤,春花似錦瘩绒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝙砌,卻和暖如春阳堕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背择克。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工恬总, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚邢。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓壹堰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骡湖。 傳聞我的和親對象是個殘疾皇子贱纠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 本文基于騰訊課堂老胡的課《跟我學(xué)Openlayers--基礎(chǔ)實例詳解》做的學(xué)習(xí)筆記,使用的openlayers 5...
    彩云飄過閱讀 386評論 0 0
  • 本文基于騰訊課堂老胡的課《跟我學(xué)Openlayers--基礎(chǔ)實例詳解》做的學(xué)習(xí)筆記响蕴,使用的openlayers 5...
    彩云飄過閱讀 328評論 0 0
  • 本文基于騰訊課堂老胡的課《跟我學(xué)Openlayers--基礎(chǔ)實例詳解》做的學(xué)習(xí)筆記谆焊,使用的openlayers 5...
    彩云飄過閱讀 262評論 0 0
  • 本文基于騰訊課堂老胡的課《跟我學(xué)Openlayers--基礎(chǔ)實例詳解》做的學(xué)習(xí)筆記,使用的openlayers 5...
    彩云飄過閱讀 413評論 0 0
  • 本文基于騰訊課堂老胡的課《跟我學(xué)Openlayers--基礎(chǔ)實例詳解》做的學(xué)習(xí)筆記浦夷,使用的openlayers 5...
    彩云飄過閱讀 528評論 0 1