echarts 地图下钻+散点图

"echarts": "^5.2.2",

<!--实现全国地图下钻,由于涉及JSON文件较多,所以就直接引用在线JSON https://geo.datav.aliyun.com/areas_v3/bound/-->

<template>

  <div>

    <div

      class="areaRankingAll"

      ref="areaRankingAll"

      :style="{ width: '1000px', height: '1000px' }"

    ></div>

    <div>

      <button type="button" @click="cancel">返回上一级</button>

    </div>

  </div>

</template>

<script>

import axios from "axios"; //采用axios动态请求数据

var echarts = require("echarts");

export default {

  name: "areaRankingAll",

  mounted() {

    this.initChart(); //初始化地图

  },

  data() {

    return {

      myChart: null,

      //线上请求JSON文件数据地址

      publicUrl: "https://geo.datav.aliyun.com/areas_v3/bound/",

      //allCode 区域行政编码信息

      allCode: [

        // {name:"廉江市",adcode:"440881"}

      ],

      regionsArray: [],

      spotArray: [],

      spotArray2: [],

    };

  },

  methods: {

    cancel() {

      this.initChart();

    },

    getGeoJson(jsonName) {

      return axios.get(this.publicUrl + jsonName);

    },

    initEcharts(geoJson, name, chart) {

      let self = this;

      this.myChart = echarts.init(this.$refs.areaRankingAll);

      echarts.registerMap(name, geoJson);

      let option = {

        title: {

          text: name,

        },

        tooltip: {

          trigger: "item",

          // formatter: "{b}<br/>{c} (数量)",

          formatter(params) {

            console.log(params, "params");

            return 'params'

          },

        },

        visualMap: {

          min: 100,

          max: 5000,

          text: ["High", "Low"],

          realtime: false,

          calculable: true,

          inRange: {

            color: ["lightskyblue", "yellow", "orangered"],

          },

        },

        geo: {

          map: name,

          zlevel: 1,

          regions: this.regionsArray,

          label: {

            show: true, //是否显示省份名称

          },

          tooltip: {

            trigger: "item",

            formatter(params) {

              if (params.value && params.value.length > 0) {

                return `名称:${params.name}<br>数量:${params.value[2]}`;

              }else{

                return`${params.name}`

              }

            },

          },

        },

        series: [

          //样式一展示

          {

            showLegendSymbol: true,

            type: "scatter",

            coordinateSystem: "geo",

            symbol: "pin",

            legendHoverLink: true,

            symbolSize: [60, 60],

            // 这里渲染标志里的内容以及样式

            label: {

              show: true,

              formatter(value) {

                return value.data.value[2];

              },

              color: "#fff",

            },

            // 标志的样式

            itemStyle: {

              normal: {

                color: "rgba(255,0,0,.7)",

                shadowBlur: 2,

                shadowColor: "D8BC37",

              },

            },

            // 数据格式,其中name,value是必要的,value的前两个值是数据点的经纬度,其他的数据格式可以自定义

            // 至于如何展示,完全是靠上面的formatter来自己定义的

            data: this.spotArray,

            showEffectOn: "render",

            rippleEffect: {

              brushType: "stroke",

            },

            hoverAnimation: true,

            zlevel: 1,

          },

          //样式二展示

          {

            type: "effectScatter",

            coordinateSystem: "geo",

            effectType: "ripple",

            showEffectOn: "render",

            rippleEffect: {

              period: 10,

              scale: 10,

              brushType: "fill",

            },

            hoverAnimation: true,

            itemStyle: {

              normal: {

                color: "rgba(255, 235, 59, .7)",

                shadowBlur: 10,

                shadowColor: "#333",

              },

            },

            zlevel: 1,

            data: this.spotArray2,

          },

          {

            type: "map",

            map: name,

            data: [],

          },

        ],

      };

      chart.setOption(option);

      chart.off("click");

      chart.on("click", (params) => {

        //点击区域时的行政编码,然后再进行匹配

        let clickCode = self.allCode.filter(

          (areaJson) => areaJson.name === params.name

        )[0].adcode;

        //1、如果要实现多级下钻并且展示子区域的话,下钻点击事件请求的JSON必须是该点击区域的全面父级JSON(即没有自己只有孩子们组成)

        //2、如果要实现地图只下钻一次,并且不展示目标下钻区域的子区域。如第一层地图是中国,实现点击某个省下钻到该省,但是不展示该省的子区域,那么下钻点击事件请求的JSON必须是该点击区域的确切json(即只有自己没有孩子们)

        //声明:比如这里线上引用的父级JSON带有:地域行政编码_full.json(如中国 100000_full.json),子级JSON是行政编码.json(如廉江市 440881.json)

        self

          .getGeoJson(clickCode + "_full.json")

          .then((res) => {

            this.spotArray = [];

            this.spotArray2 = [];

            if (params.name == "山东省") {

              this.regionsArray.push({

                name: "青岛市",

                itemStyle: {

                  normal: {

                    opacity: 1, // 透明度

                    borderColor: "#fff", // 省份界线颜色

                    borderWidth: 3, // 省份界线的宽度

                    areaColor: "red", // 整个省份的颜色

                  },

                },

              });

              let features = res.data.features;

              features.forEach((item) => {

                if (item.properties.name == "济南市") {

                  this.spotArray.push({

                    name: item.properties.name,

                    value: [

                      item.properties.centroid[0],

                      item.properties.centroid[1],

                      1000,

                    ],

                  });

                }

                if (item.properties.name == "济宁市") {

                  this.spotArray2.push({

                    name: item.properties.name,

                    value: [

                      item.properties.centroid[0],

                      item.properties.centroid[1],

                      1000,

                    ],

                  });

                }

              });

            }

            if (params.name == "青岛市") {

              this.regionsArray.push({

                name: "崂山区",

                itemStyle: {

                  normal: {

                    opacity: 1, // 透明度

                    borderColor: "#fff", // 省份界线颜色

                    borderWidth: 3, // 省份界线的宽度

                    areaColor: "red", // 整个省份的颜色

                  },

                },

              });

            }

            self.initEcharts(res.data, params.name, chart);

          })

          .catch((err) => {

            console.log(err, "err");

            self.getGeoJson("100000_full.json").then((China) => {

              self.initEcharts(China.data, "中华人民共和国", chart);

            });

          });

      });

    },

    //带头函数-初始化

    initChart() {

      let chart = echarts.init(this.$refs.areaRankingAll);

      //this.allCode获取所有的区域编码信息

      this.getGeoJson("all.json").then((all) => {

        this.allCode = all.data;

      });

      //初始化地图展示

      this.getGeoJson("100000_full.json").then((China) => {

        this.spotArray = [];

        this.spotArray2 = [];

        this.regionsArray.push({

          name: "山东省",

          itemStyle: {

            normal: {

              opacity: 1, // 透明度

              borderColor: "#fff", // 省份界线颜色

              borderWidth: 3, // 省份界线的宽度

              areaColor: "red", // 整个省份的颜色

            },

          },

        });

        let features = China.data.features;

        features.forEach((item) => {

          if (item.properties.name == "西藏自治区") {

            this.spotArray.push({

              name: item.properties.name,

              value: [

                item.properties.centroid[0],

                item.properties.centroid[1],

                1000,

              ],

            });

          }

          if (item.properties.name == "湖北省") {

            this.spotArray2.push({

              name: item.properties.name,

              value: [

                item.properties.centroid[0],

                item.properties.centroid[1],

                1000,

              ],

            });

          }

        });

        this.initEcharts(China.data, "中华人民共和国", chart);

      });

    },

  },

};

</script>

<style scoped>

</style>

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

推荐阅读更多精彩内容