记录一个echarts3D 地图

先看图


1.png

2.png

3.png

话不多说上代码

<template>
  <div class="map">
    <div class="Map3D" id="Map3D" ref="Map3D"></div>
  </div>
</template>

<script>
import liaoNingJson from '../../../assets/data/liaoning.json'
export default {
  data() {
    return {
      option: null,
      chartMap: {},
      province: [],
    }
  },
  props: {},
  created() {},
  mounted() {
    this.$nextTick(() => {
      this.initMap()
    })
    this.processingData()
  },
  beforeDestroy() {},
  methods: {
    // 初始化地图
    initMap() {
      this.chartMap = this.$echarts.init(document.getElementById('Map3D'))
      // this.$echarts.registerMap('liaoNing', liaoNingJson)

      this.$echarts.registerMap('liaoNing', { geoJSON: liaoNingJson })
      console.log('liaoNing: ', liaoNingJson)

      const chinaGeoCoordMap = {
        '沈阳市': [123.42, 41.79],
        '大连市': [121.61, 38.91],
        '鞍山市': [122.99, 41.11],
        '抚顺市': [123.92, 41.87],
        '本溪市': [123.77, 41.29],
        '丹东市': [124.38, 40.12],
        '锦州市': [121.13, 41.11],
        '营口市': [122.23, 40.66],
        '阜新市': [121.64, 42.01],
        '辽阳市': [123.18, 41.26],
        '盘锦市': [122.06, 41.12],
        '铁岭市': [123.84, 42.29],
        '朝阳市': [120.45, 41.57],
        '葫芦岛市': [120.85, 40.75]
      }

      // 散点
      const chinaDatas = []
      const mapObject = { name: '', value: null }
      for (const key in chinaGeoCoordMap) {
        mapObject.name = key
        mapObject.value = chinaGeoCoordMap[key]
        chinaDatas.push(JSON.parse(JSON.stringify(mapObject)))
      }

      this.option = {
        geo: [
          {
            zlevel: 3, //geo显示级别,默认是0 【最顶层图形】
            map: 'liaoNing', //地图名
            roam: false,
            scaleLimit: {
              min: 1,
              max: 4
            },
            zoom: 1.1,
            label: {
              show: false
              // fontSize: 18,
              // color: '#fff'
            },
            itemStyle: {
              borderColor: '#1488A2',
              borderWidth: 1.5,
              areaColor: {
                type: 'radial',
                x: 0.5,
                y: 0.5,
                r: 0.9,
                colorStops: [
                  {
                    offset: 0,
                    color: '#008FF6'
                  },
                  {
                    offset: 1,
                    color: '#0E3AB4'
                  }
                ],
                global: false
              }
            },
            emphasis: {
              label: {
                show: false
              },
              itemStyle: {
                areaColor: {
                  type: 'radial',
                  x: 0.5,
                  y: 0.5,
                  r: 0.9,
                  colorStops: [
                    {
                      offset: 0,
                      color: '#00DB8A'
                    },
                    {
                      offset: 1,
                      color: '#00DDFF'
                    }
                  ],
                  global: false
                },
                shadowColor: '#fff',
                shadowBlur: 10,
                shadowOffsetY: 8,
                shadowOffsetX: 6,
                focus: 'none',
                borderWidth: 3,
                borderColor: '#3FD6DE',
              }
            },
            select: {
              label: {
                show: false
              },
              itemStyle: {
                areaColor: {
                  type: 'radial',
                  x: 0.5,
                  y: 0.5,
                  r: 0.9,
                  colorStops: [
                    {
                      offset: 0,
                      color: '#00DB8A'
                    },
                    {
                      offset: 1,
                      color: '#00DDFF'
                    }
                  ],
                  global: false
                },
                shadowColor: '#000',
                shadowBlur: 10,
                shadowOffsetY: 8,
                shadowOffsetX: 6,
                focus: 'none',
                label: {
                  show: true
                },
                borderWidth: 3,
                borderColor: '#00ACDD'
              },
            },
            selectedMode: 'single'
          },
          {
            zlevel: 2, //geo显示级别,默认是0 【第二层图形】
            map: 'liaoNing',
            roam: false,
            scaleLimit: {
              min: 1,
              max: 4
            },
            zoom: 1.1,
            label: {
              show: false
            },
            itemStyle: {
              //此处border设置你想要显示的地图外边框样式,可设置border颜色,阴影等
              borderColor: '#00B5FF',
              borderWidth: 4,
              shadowColor: '#00B5FF',
              shadowOffsetY: 6,
              shadowOffsetX: 3
            },
            emphasis: {
              disabled: true,
              show: false
            },
          },
          {
            zlevel: 1, //geo显示级别,默认是0 【最底层层图形】
            map: 'liaoNing',
            roam: false,
            scaleLimit: {
              min: 1,
              max: 4
            },
            zoom: 1.1,
            label: {
              show: false
            },
            itemStyle: {
              //底层地图样式
              //此处border设置你想要显示的地图外边框样式,可设置border颜色,阴影等
              borderColor: '#01A6DE',
              borderWidth: 4,
              shadowColor: '#01A6DE',
              shadowOffsetY: 10,
              shadowOffsetX: 6
            },
            emphasis: {
              disabled: true,
              show: false
            },
          }
        ],
        series: [
          {
            type: 'effectScatter',
            coordinateSystem: 'geo', //使用地理坐标系
            //要有对应的经纬度才显示,先经度再维度
            data: chinaDatas,
            zlevel: 3,
            rippleEffect: {
              scale: 4, // 波纹的最大缩放比例
              brushType: 'stroke', // 波纹的绘制方式 stroke
              period: 4,
            },
            hoverAnimation: false,
            label: {
              //图形上的文本标签
              show: true,
              formatter: '{b}',
              position: 'right',
              fontWeight: 500,
              fontSize: 14,
              color: '#fff',
              shadowColor: '#000'
            },
            emphasis: {
              scale: '1.4',
              itemStyle: {
                color: '#fff',
                shadowBlur: 10,
                shadowColor: '#333'
              },
            },
            //默认样式
            itemStyle: {
              color: '#77E2FE',
              shadowBlur: 10,
              shadowColor: '#31A2EE'
            },
          }
        ],
        tooltip: {
          trigger: 'item',
          backgroundColor: 'rgba(0,0,0,0)',
          borderWidth: 0,
          position: 'top',
          className: 'custom-tooltip-box',
          formatter: function (item) {
            // 循环处理数据,展示数据
            var htmlText = `<div class='custom'>
              <div class="custom-tooltip-style">
                <p>2024</p>
              </div>
              <div class="bottom">
                <div class="line"></div> 
              </div>
              </div>`
            return htmlText
          },
          textStyle: {
            color: 'transparent',
          }
        }
      }

      this.chartMap.setOption(this.option)
      // 点击下一层
      this.chartMap.on('click', (param) => {
        this.getCountyOption(param.name)
      })
      // 返回上一层
      this.chartMap.getZr().on('click', (params) => {
        if (!params.target) {
          this.initMap()
        }
      })
    },
    // 处理数据后期可以改为接口请求
    processingData() {
      let province = []
      liaoNingJson.features.forEach((item) => {
        let obj = {
          name: item.properties.name,
          id: item.properties && item.properties.subFeatureIndex
        }
        province.push(obj)
      })
      this.province = province
    },
    // 下一层数据
    getCountyOption(param) {
      console.log('param: ', param)
      let mapData = null
      this.province.forEach((item) => {
        if (item.name == param) {
          console.log('item: ', item)
          mapData = require('../../../assets/data/shenyang.json')
          this.$echarts.registerMap('liaoNing', { geoJSON: mapData })
          this.chartMap.setOption(this.option, true)
        }
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.map{
  width: 100%;
  height: 100%;
}
.Map3D {
  width: 100%;
  height: 100vh;

}
:deep(.custom-tooltip-box) {
  border: none !important;
  padding: 0 !important;
  box-shadow: none !important;
  .custom {
    // width: 240px;
    display: flex;
    flex-wrap: wrap;
    display: inline-block;
    .custom-tooltip-style {
      background: url('../../../assets/imgs/echartsBg.png') no-repeat center center;
      background-size: 100% 100%;
      backdrop-filter: blur(5px);
      box-shadow: 0 4px 10px 0 #00000066, inset 0 -3px 16px 0 #27cfff26;
      border-radius: 6px;
      padding: 10px 10px;
      p {
        color: #78E3FF;
        font-size: 24px;
        padding: 0 10px;
      }
      .info {
        display: flex;
        align-items: center;
        justify-content: center;
        .info-item {
          .item {
            display: flex;
            align-items: center;
            padding: 20px 10px 0 10px;
            .icon {
              width: 86px;
              height: 25px;
              color: #fff;
              text-align: center;
            }
            .blue {
              background: url("../../../assets/imgs/blue.png") no-repeat center center;
              background-size: 100% 100%;
            }
            .green {
              background: url("../../../assets/imgs/green.png") no-repeat center center;
              background-size: 100% 100%;
            }
            .orange {
              background: url("../../../assets/imgs/orange.png") no-repeat center center;
              background-size: 100% 100%;
            }
            .desc {
              color: #fff;
              font-size: 24px;
              font-weight: bold;
              padding-left: 20px;
            }
          }
        }
        
      }
    }
    .bottom {
      display: flex;
      justify-content: center;
      align-items: center;
      .line {
        width: 4px;
        height: 65px;
        background: url('../../../assets/imgs/line.png') no-repeat center center;
        background-size: 100% 100%;
      }
    }
  }
}
</style>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容