前端vue下使用echarts顯示中國地圖的坑

先説需求:要想把設(shè)備在全國的分布在地圖上畫出來战授,以zoom in/out鼠標(biāo)縮放

相信很多網(wǎng)友都在找china.js 勸你別找了。
那個(gè)不能鼠標(biāo)縮放哀托,

現(xiàn)在我以在jeecg-boot項(xiàng)目(前端vue)來實(shí)驗(yàn)的兄旬,

  1. 先看效果

數(shù)據(jù)點(diǎn)造了2個(gè):
[{"name":"合肥","value":[120.99,36.99]},{"name":"大慶","value":[120.01,36.01]}]
(地名隨便起的铛漓,勿對號入座)

  1. 去百度地圖開發(fā)者平臺去申請一個(gè)key

現(xiàn)在開發(fā)者平臺統(tǒng)一了羊异,無論是APP穆律,還是WEB床佳,都是在一個(gè)地方申請。
去里面建一個(gè)應(yīng)用恳守,它會(huì)給你生成一個(gè)key

  1. 聲明引用百度地圖

jeecg-boot有框架考婴,在建一個(gè)map.js中我們添加如下代碼

export function loadBMap(ak) {
    return new Promise(function(resolve, reject) {
        if (typeof BMap !== 'undefined') {
            resolve(BMap)
            return true
        }
        window.onBMapCallback = function() {
            resolve(BMap)
        }
        let script = document.createElement('script')
        script.type = 'text/javascript'
        script.src =
            'http://api.map.baidu.com/api?v=2.0&ak='+ ak +'&__ec_v__=20190126&callback=onBMapCallback'
        script.onerror = reject
        document.head.appendChild(script)
    })
}
  1. 業(yè)務(wù)模塊vue

代碼如下,注意幾點(diǎn)
1)剛一進(jìn)界面催烘,可以延時(shí)再調(diào)入數(shù)據(jù)及刷新地圖
具體招數(shù): .nextTick() 或 setTimeout()
2)動(dòng)態(tài)刷新數(shù)據(jù)方法
沒找到什么好方法沥阱,只以重新init,重新加載option
為了避免提示重復(fù)創(chuàng)建對象伊群,用
if (this.chart != null && this.chart != '' && this.chart != undefined) {
this.chart.dispose()
}
判斷一下

<template>
  <div class="mapContent">
    <div id="china_map" :style="{ width: '1280px', height: '800px' }"></div>
  </div>
</template>

<script>
//import axios from 'axios'
//import { axios } from '@/utils/request'
import { getDeviceList } from '@/api/manage'
import { loadBMap } from './map.js'

let echarts = require('echarts')
// 如果是 webpack 打包考杉,也可以 require 引入
//require('echarts');
require('echarts/extension/bmap/bmap')
var that

export default {
  name: 'CnMapScatter',
  components: {},
  data() {
    return {
      deviceDataPoints: [], 
      chart: null,
      geoCoordMap: {
        青島: [120.33, 36.07],
        日照: [119.46, 35.42],
        膠南: [119.97, 35.88],
      },
    }
  },
  mounted() {
    //vue的生命周期函數(shù)
    that = this
    this.$nextTick(() => {
      loadBMap('在百度申請的appkey我得保密').then(() => {
        //this.drawPie()
        this.initEcharts() //調(diào)用初始化圖表的函數(shù)

        setTimeout(() => {
          window.console.log('下面準(zhǔn)備調(diào)入設(shè)備點(diǎn)')
          this.loadDevicesDataPoints()
        }, 2000)
      })
    })
  },
  computed: {},
  methods: {
    initEcharts() {
      var data = [
        { name: '青島', value: 18 },
        { name: '日照', value: 21 },
        { name: '膠南', value: 22 },
      ]

      const option = {
        backgroundColor: 'transparent',
        title: {
          text: '設(shè)備地圖分布',
          // subtext: 'data from PM25.in',
          // sublink: 'http://www.pm25.in',
          left: 'center',
          textStyle: {
            color: '#fff',
          },
        },
        tooltip: {
          trigger: 'item',
        },
        bmap: {
          center: [129.114129, 31.550339],
          zoom: 5,
          roam: true,
          mapStyle: {
            styleJson: [
              {
                featureType: 'water',
                elementType: 'all',
                stylers: {
                  color: '#044161',
                },
              },
              {
                featureType: 'land',
                elementType: 'all',
                stylers: {
                  color: '#004981',
                },
              },
              {
                featureType: 'boundary',
                elementType: 'geometry',
                stylers: {
                  color: '#064f85',
                },
              },
              {
                featureType: 'railway',
                elementType: 'all',
                stylers: {
                  visibility: 'off',
                },
              },
              {
                featureType: 'highway',
                elementType: 'geometry',
                stylers: {
                  color: '#004981',
                },
              },
              {
                featureType: 'highway',
                elementType: 'geometry.fill',
                stylers: {
                  color: '#005b96',
                  lightness: 1,
                },
              },
              {
                featureType: 'highway',
                elementType: 'labels',
                stylers: {
                  visibility: 'off',
                },
              },
              {
                featureType: 'arterial',
                elementType: 'geometry',
                stylers: {
                  color: '#004981',
                },
              },
              {
                featureType: 'arterial',
                elementType: 'geometry.fill',
                stylers: {
                  color: '#00508b',
                },
              },
              {
                featureType: 'poi',
                elementType: 'all',
                stylers: {
                  visibility: 'off',
                },
              },
              {
                featureType: 'green',
                elementType: 'all',
                stylers: {
                  color: '#056197',
                  visibility: 'off',
                },
              },
              {
                featureType: 'subway',
                elementType: 'all',
                stylers: {
                  visibility: 'off',
                },
              },
              {
                featureType: 'manmade',
                elementType: 'all',
                stylers: {
                  visibility: 'off',
                },
              },
              {
                featureType: 'local',
                elementType: 'all',
                stylers: {
                  visibility: 'off',
                },
              },
              {
                featureType: 'arterial',
                elementType: 'labels',
                stylers: {
                  visibility: 'off',
                },
              },
              {
                featureType: 'boundary',
                elementType: 'geometry.fill',
                stylers: {
                  color: '#029fd4',
                },
              },
              {
                featureType: 'building',
                elementType: 'all',
                stylers: {
                  color: '#1a5787',
                },
              },
              {
                featureType: 'label',
                elementType: 'all',
                stylers: {
                  visibility: 'off',
                },
              },
            ],
          },
        },
        series: [
          // {
          //   name: 'pm2.5',
          //   type: 'scatter',
          //   coordinateSystem: 'bmap',
          //   data: that.convertData(data),
          //   encode: {
          //     value: 2,
          //   },
          //   symbolSize: function (val) {
          //     return val[2] / 10
          //   },
          //   label: {
          //     formatter: '屁使',
          //     position: 'right',
          //   },
          //   itemStyle: {
          //     color: '#ddb926',
          //   },
          //   emphasis: {
          //     label: {
          //       show: true,
          //     },
          //   },
          // },
          /*
          {
            name: 'Top 5',
            type: 'effectScatter',
            coordinateSystem: 'bmap',
            data: that.convertData(
              data
                .sort(function (a, b) {
                  return b.value - a.value
                })
                .slice(0, 6)
            ),
            encode: {
              value: 2,
            },
            symbolSize: function (val) {
              return val[2] / 10
            },
            showEffectOn: 'emphasis',
            rippleEffect: {
              brushType: 'stroke',
            },
            hoverAnimation: true,
            label: {
              formatter: '',
              position: 'right',
              show: true,
            },
            itemStyle: {
              color: '#f4e925',
              shadowBlur: 10,
              shadowColor: '#333',
            },
            zlevel: 1,
          },
          */
          {
            name: 'Device',
            type: 'scatter',
            coordinateSystem: 'bmap',
            data: this.deviceDataPoints,
            encode: {
              value: 2,
            },
            symbolSize: function (val) {
              return val[2] / 10
            },
            label: {
              formatter: '奔则',
              position: 'right',
            },
            itemStyle: {
              color: '#00ff00',
            },
            emphasis: {
              label: {
                show: true,
              },
            },
          },
          /*
          {
            type: 'custom',
            coordinateSystem: 'bmap',
            renderItem: that.renderItem,
            itemStyle: {
              opacity: 0.5,
            },
            animation: false,
            silent: true,
            data: [0],
            z: -10,
          },
          */
        ],
      }

      if (this.chart != null && this.chart != '' && this.chart != undefined) {
        this.chart.dispose()
      }
      that.chart = echarts.init(document.getElementById('china_map'))
      that.chart.setOption(option)
    },

    convertData(data) {
      var res = []
      for (var i = 0; i < data.length; i++) {
        var geoCoord = this.geoCoordMap[data[i].name]
        console.log('geoCoord=', JSON.stringify(geoCoord))
        if (geoCoord) {
          res.push({
            name: data[i].name,
            value: geoCoord.concat(data[i].value),
          })
        }
      }
      console.log('calc res=', JSON.stringify(res))
      return res
    },

    loadDevicesDataPoints() {
      console.log('正在調(diào)入設(shè)備點(diǎn)...')
      this.deviceDataPoints = []
      getDeviceList()
        .then((res) => {
          console.log('調(diào)入設(shè)備點(diǎn)...返回結(jié)果')
          console.log('/roaddev/tdev/list response:', res)
          //var res2 = []
          res.result.records.map((item) => {
            var loc = []
            loc.push(item['devLng'])
            loc.push(item['devLat'])
            console.log('loc=', JSON.stringify(loc))
            if (loc) {
              this.deviceDataPoints.push({
                name: item.devSn,
                value: loc.concat(parseInt('100'))
              })
            }
          })
          console.log('deviceDataPoints =', JSON.stringify(this.deviceDataPoints))
          this.initEcharts()
          //return this.deviceDataPoints
        })
        .catch((error) => {
          // catch 指請求出錯(cuò)的處理
          console.log('調(diào)入設(shè)備點(diǎn)...出錯(cuò)')
          console.log(error)
          //return null
        })
    },

    /*
    renderItem(params, api) {
      var coords = [
        [116.7, 39.53],
        [103.73, 36.03],
        [112.91, 27.87],
        [120.65, 28.01],
        [119.57, 39.95],
      ]
      var points = []
      for (var i = 0; i < coords.length; i++) {
        points.push(api.coord(coords[i]))
      }
      var color = api.visual('color')

      return {
        type: 'polygon',
        shape: {
          points: echarts.graphic.clipPointsByRect(points, {
            x: params.coordSys.x,
            y: params.coordSys.y,
            width: params.coordSys.width,
            height: params.coordSys.height,
          }),
        },
        style: api.style({
          fill: color,
          stroke: echarts.color.lift(color),
        }),
      }
    },
    */
  },
}
</script>
 
<style lang="less" scoped>
.mapContent {
  width: 100%;
  height: 100%;
  .echarts {
    width: 100%;
    height: 100%;
  }

  /deep/ .showTool {
    width: 160px;
    height: auto;
    padding: 10px 0 10px 10px;
    box-sizing: border-box;
    background: rgba(255, 255, 255, 0.9);
    // box-shadow: 0px 2px 8px 0px rgba(13, 4, 8, 0.2);
    border-radius: 5px;
    .title {
      font-size: 14px;
      font-family: Microsoft YaHei;
      font-weight: bold;
      color: #333333;
      line-height: 22px;
    }
    .rate {
      font-size: 12px;
      font-family: Microsoft YaHei;
      font-weight: bold;
      color: #333333;
      line-height: 22px;
    }
  }
}
</style>

結(jié)束蛮寂。點(diǎn)個(gè)贊再走唄。感謝啦易茬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酬蹋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抽莱,更是在濱河造成了極大的恐慌范抓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件食铐,死亡現(xiàn)場離奇詭異匕垫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虐呻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門象泵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斟叼,你說我怎么就攤上這事偶惠。” “怎么了朗涩?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵忽孽,是天一觀的道長。 經(jīng)常有香客問我谢床,道長兄一,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任识腿,我火速辦了婚禮出革,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘覆履。我一直安慰自己蹋盆,他們只是感情好费薄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布硝全。 她就那樣靜靜地躺著,像睡著了一般楞抡。 火紅的嫁衣襯著肌膚如雪伟众。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天召廷,我揣著相機(jī)與錄音凳厢,去河邊找鬼账胧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛先紫,可吹牛的內(nèi)容都是我干的治泥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼遮精,長吁一口氣:“原來是場噩夢啊……” “哼居夹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起本冲,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤准脂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后檬洞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狸膏,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年添怔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了湾戳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡广料,死狀恐怖院塞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情性昭,我是刑警寧澤拦止,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站糜颠,受9級特大地震影響汹族,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜其兴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一顶瞒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧元旬,春花似錦榴徐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至穆端,卻和暖如春袱贮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背体啰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工攒巍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗽仪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓柒莉,卻偏偏與公主長得像闻坚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子兢孝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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