【百度地圖可視化(MapVGL)】繪制飛線動畫

百度地圖可視化參考文檔 MapV開發(fā)文檔 (baidu.com)

Baidu地圖飛線動畫
1. 在head中初始化樣式和引入所需的JS庫文件
<style>
        html,
        body {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }

        #map_container {
            width: 100%;
            height: 100%;
        }
    </style>

    <!-- 百度地圖基礎(chǔ)庫 -->
    <script type="text/javascript"
            src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=******"></script>
    <!-- 公共的文件代碼 里面包含 地圖初始化 和 實用樣式 -->
    <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
    <!-- 使用根據(jù)城市名稱獲取城市的坐標 -->
    <script src="https://mapv.baidu.com/build/mapv.js"></script>
    <!--使用mapcgl的時候需要引入-->
    <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>
    <!-- 使用飛線圖層需要使用的依賴 -->
    <script src="https://unpkg.com/mapvgl/dist/mapvgl.threelayers.min.js"></script>
2. 初始化一個容器,容器id固定為 map_container,是由common.js決定
  1. 由于使用了一個封裝好的comm.js文件所以需要固定容器的id嫂伞。
在common.js中容器的id
<div id="map_container"></div>
3. 使用commn.js中的initMap方法初始化一個地圖
/**
   * 初始化地圖
   */
  function initMyMap() {
    // 根據(jù)城市名稱獲取城市的中心點坐標 (經(jīng)緯度數(shù)組對象 )
    let centerCity = mapv.utilCityCenter.getCenterByCityName('上海')
    return initMap(
      {
        // 切斜角度
        tilt: 60,
        // 旋轉(zhuǎn)角度
        heading: 0,
        // 地圖樣式
        style: purpleStyle,
        // 地圖縮放比例
        zoom: 6,
        // 地圖的中心點坐標
        center: [centerCity.lng, centerCity.lat]
      }
    )
  }
4. 準備數(shù)據(jù)源

數(shù)據(jù)中的每一個數(shù)據(jù)項代表一條貝塞爾曲線半等。貝賽爾曲線又由一些點構(gòu)成拷肌,最后通過mapvgl的飛線圖層FlyLineLayer創(chuàng)建一條條的飛線。

4.1 生成貝賽爾曲線坐標集
  1. 實例化貝塞爾曲線對象(BezierCurve) ;這是mapvgl 中的內(nèi)置工具柳击。
let curve = new mapvgl.BezierCurve()
  1. 設置起點坐標和終點坐標 缀棍;通過 setOptions方法設置貝賽爾曲線的起點坐標和終點坐標。
// 2. 設置起點和終點坐標
   let start = mapv.utilCityCenter.getCenterByCityName('上海')
   let end = mapv.utilCityCenter.getCenterByCityName('北京')
   curve.setOptions(
   {
       start: [start.lng, start.lat],
       end: [end.lng, end.lat]
   }
   )
  1. 生成貝塞爾曲線坐標集 垒棋;使用 getPoints()方法獲取到生成的貝賽爾曲線坐標集。并將其設置到data數(shù)組中痪宰。
let curveData = curve.getPoints()
data.push({
       geometry: {
           type: 'LineString',
           coordinates: curveData
       }
   })

準備數(shù)據(jù)源部分的代碼

/**
   * 準備數(shù)據(jù)源
   * @returns {[]}
   */
  function initData() {
    // 生成的數(shù)據(jù)信息
    let data = []
    // 城市數(shù)據(jù)信息
    let cities = ['北京', '天津', '上海', '重慶', '石家莊', '太原', '呼和浩特', '哈爾濱', '長春',
      '沈陽', '濟南', '南京', '合肥', '杭州', '南昌', '福州', '鄭州', '武漢', '長沙', '廣州',
      '南寧', '西安', '銀川', '蘭州', '西寧', '烏魯木齊', '成都', '貴陽', '昆明', '拉薩', '旱鸺埽口']
    // 需要定義 700 個 data 的數(shù)據(jù)項
    let randomCount = 100
    while (randomCount--) {
      // 獲取每一個城市的中心點坐標 隨機生成  在 所有城市范圍內(nèi)挑選 生成的隨機數(shù)是 [0,cities.length] 創(chuàng)建開始開始城市和終點城市
      let start = mapv.utilCityCenter.getCenterByCityName(cities[parseInt(Math.random() * cities.length, 10)])
      let end = mapv.utilCityCenter.getCenterByCityName(cities[parseInt(Math.random() * cities.length, 10)])
      // 創(chuàng)建貝塞爾曲線對象
      let curve = new mapvgl.BezierCurve();
      // 根據(jù)起點和終點生成貝塞爾曲線坐標集
      curve.setOptions(
        {
          start: [start.lng, start.lat],
          end: [end.lng, end.lat]
        }
      )
      let curveData = curve.getPoints()
      // 3. 創(chuàng)建data數(shù)據(jù)
      data.push(
        {
          geometry: {
            type: 'LineString',
            coordinates: curveData
          }
        }
      )
    }
    return data;
  }
5. 設置數(shù)據(jù)源
  1. 創(chuàng)建圖層管理器對象:需要傳遞當前的map對象畔裕。
// 創(chuàng)建圖層管理器
    let view = new mapvgl.View(
      {map}
    );
  1. 創(chuàng)建飛線圖層:使用的是 FlyLineLayer對象。
let flyLineLayer = new mapvgl.FlyLineLayer(
      {
        // 飛線動畫方式  normal乖订,默認值扮饶,飛線動畫速度均勻  chaos,飛線動畫速度不均勻
        style: 'chaos',
        // 底線顏色
        color: 'rgba(33, 242, 214, 0.3)',
        // 飛線動畫的顏色
        textureColor: 'red',
        // 飛線動畫的寬度
        textureWidth: 20,
        // 飛線動畫的長度乍构,占整條線的百分比甜无,取值0-100
        textureLength: 10,
        // 飛線動畫的步長,步長越大動畫速度越快 默認值 0.1 
        step: 0.1
      }
    );
  1. 將飛線圖層添加到圖層管理器中:
view.addLayer(flyLineLayer);
  1. 將準備的數(shù)據(jù)和 飛線圖層綁定 :
 flyLineLayer.setData(data);

這部分的完整代碼

/**
   * 繪制數(shù)據(jù)源
   * @param map
   * @param data
   */
  function setData(map, data) {
    // 創(chuàng)建圖層管理器
    let view = new mapvgl.View(
      {map}
    );

    let flyLineLayer = new mapvgl.FlyLineLayer(
      {
        // 飛線動畫方式  normal蜡吧,默認值毫蚓,飛線動畫速度均勻  chaos,飛線動畫速度不均勻
        style: 'chaos',
        // 底線顏色
        color: 'rgba(33, 242, 214, 0.3)',
        // 飛線動畫的顏色
        textureColor: 'red',
        // 飛線動畫的寬度
        textureWidth: 20,
        // 飛線動畫的長度昔善,占整條線的百分比元潘,取值0-100
        textureLength: 10,
        // 飛線動畫的步長,步長越大動畫速度越快 默認值 0.1
        step: 0.1
      }
    );

    view.addLayer(flyLineLayer);

    flyLineLayer.setData(data);
  }
6. 該案例的完整代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>datav-Mapvgl-fly-line</title>

    <style>
        html,
        body {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }

        #map_container {
            width: 100%;
            height: 100%;
        }
    </style>

    <!-- 百度地圖基礎(chǔ)庫 -->
    <script type="text/javascript"
            src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1*****"></script>
    <!-- 公共的文件代碼 里面包含 地圖初始化 和 實用樣式 -->
    <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
    <!-- 使用根據(jù)城市名稱獲取城市的坐標 -->
    <script src="https://mapv.baidu.com/build/mapv.js"></script>
    <!--使用mapcgl的時候需要引入-->
    <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>
    <!-- 使用飛線圖層需要使用的依賴 -->
    <script src="https://unpkg.com/mapvgl/dist/mapvgl.threelayers.min.js"></script>

</head>
<body>
<!-- 飛線動畫 -->
<div id="map_container"></div>

<script>

  let map = initMyMap();
  let data = initData();
  setData(map, data)

  /**
   * 初始化地圖
   */
  function initMyMap() {
    let centerCity = mapv.utilCityCenter.getCenterByCityName('上海')
    return initMap(
      {
        // 切斜角度
        tilt: 60,
        // 旋轉(zhuǎn)角度
        heading: 0,
        // 地圖樣式
        style: purpleStyle,
        // 地圖縮放比例
        zoom: 6,
        // 地圖的中心點坐標
        center: [centerCity.lng, centerCity.lat]
      }
    )
  }

  /**
   * 準備數(shù)據(jù)源
   * @returns {[]}
   */
  function initData() {
    // 生成的數(shù)據(jù)信息
    let data = []
    // 城市數(shù)據(jù)信息
    let cities = ['北京', '天津', '上海', '重慶', '石家莊', '太原', '呼和浩特', '哈爾濱', '長春',
      '沈陽', '濟南', '南京', '合肥', '杭州', '南昌', '福州', '鄭州', '武漢', '長沙', '廣州',
      '南寧', '西安', '銀川', '蘭州', '西寧', '烏魯木齊', '成都', '貴陽', '昆明', '拉薩', '壕停口']
    // 需要定義 700 個 data 的數(shù)據(jù)項
    let randomCount = 100
    while (randomCount--) {
      // 獲取每一個城市的中心點坐標 隨機生成  在 所有城市范圍內(nèi)挑選 生成的隨機數(shù)是 [0,cities.length] 創(chuàng)建開始開始城市和終點城市
      let start = mapv.utilCityCenter.getCenterByCityName(cities[parseInt(Math.random() * cities.length, 10)])
      let end = mapv.utilCityCenter.getCenterByCityName(cities[parseInt(Math.random() * cities.length, 10)])
      // 創(chuàng)建貝塞爾曲線對象
      let curve = new mapvgl.BezierCurve();
      // 根據(jù)起點和終點生成貝塞爾曲線坐標集
      curve.setOptions(
        {
          start: [start.lng, start.lat],
          end: [end.lng, end.lat]
        }
      )
      let curveData = curve.getPoints()
      // 3. 創(chuàng)建data數(shù)據(jù)
      data.push(
        {
          geometry: {
            type: 'LineString',
            coordinates: curveData
          }
        }
      )
    }
    return data;
  }

  /**
   * 繪制數(shù)據(jù)源
   * @param map
   * @param data
   */
  function setData(map, data) {
    // 創(chuàng)建圖層管理器
    let view = new mapvgl.View(
      {map}
    );

    let flyLineLayer = new mapvgl.FlyLineLayer(
      {
        // 飛線動畫方式  normal翩概,默認值,飛線動畫速度均勻  chaos返咱,飛線動畫速度不均勻
        style: 'chaos',
        // 底線顏色
        color: 'rgba(33, 242, 214, 0.3)',
        // 飛線動畫的顏色
        textureColor: 'red',
        // 飛線動畫的寬度
        textureWidth: 20,
        // 飛線動畫的長度钥庇,占整條線的百分比,取值0-100
        textureLength: 10,
        // 飛線動畫的步長咖摹,步長越大動畫速度越快 默認值 0.1
        step: 0.1
      }
    );

    view.addLayer(flyLineLayer);

    flyLineLayer.setData(data);
  }

</script>

</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末评姨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萤晴,更是在濱河造成了極大的恐慌吐句,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件店读,死亡現(xiàn)場離奇詭異嗦枢,居然都是意外死亡,警方通過查閱死者的電腦和手機屯断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門文虏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殖演,你說我怎么就攤上這事氧秘。” “怎么了趴久?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵敏储,是天一觀的道長。 經(jīng)常有香客問我朋鞍,道長已添,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任滥酥,我火速辦了婚禮更舞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坎吻。我一直安慰自己缆蝉,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布瘦真。 她就那樣靜靜地躺著刊头,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诸尽。 梳的紋絲不亂的頭發(fā)上原杂,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音您机,去河邊找鬼穿肄。 笑死,一個胖子當著我的面吹牛际看,可吹牛的內(nèi)容都是我干的咸产。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仲闽,長吁一口氣:“原來是場噩夢啊……” “哼脑溢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赖欣,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤屑彻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畏鼓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酱酬,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年云矫,在試婚紗的時候發(fā)現(xiàn)自己被綠了膳沽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡让禀,死狀恐怖挑社,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巡揍,我是刑警寧澤痛阻,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站腮敌,受9級特大地震影響阱当,放射性物質(zhì)發(fā)生泄漏俏扩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一弊添、第九天 我趴在偏房一處隱蔽的房頂上張望录淡。 院中可真熱鬧,春花似錦油坝、人聲如沸嫉戚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彬檀。三九已至,卻和暖如春瞬女,著一層夾襖步出監(jiān)牢的瞬間窍帝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工拆魏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盯桦,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓渤刃,卻偏偏與公主長得像拥峦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卖子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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