echarts 2D地图散点图(带立体效果)tooltips中点击事件

模板

<template>
  <div class="wrapper">
    <div class="chart" id="chart"></div>
    <el-dialog
      title="提示"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
    >
      <span>这是一段信息</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false"
          >确 定</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>

js 

1 、2d地图是平面的,可以设置倾斜度,边加阴影,这样就有立体感了

2 、tooltips上设置点击事件,在methods不会触发的,要先在全局下挂载

<script>
import shanghai from "../../static/map/js/province/shanghai";
// params 当前tooltip数据,
window.onClickSeries = function(params, key) {
  testFun(params, key); // 直接通过window方法去调用methods中对应方法
  console.log(params);
};

export default {
  data() {
    return {
      dialogVisible: false,
      city: "",
      dataS: [
        { name: `浦东新区`, value: [121.567706, 31.245944, 1] },
        { name: `宝山区`, value: [121.489934, 31.398896, 2] },
        { name: `崇明区`, value: [121.526, 31.658, 3] },
        { name: `嘉定区`, value: [121.250333, 31.383524, 4] },
        { name: `青浦区`, value: [121.113021, 31.151209, 5] },
        { name: `杨浦区`, value: [121.522797, 31.270755, 6] },
        { name: `虹口区`, value: [121.491832, 31.26097, 7] },
        { name: `普陀区`, value: [121.392499, 31.241701, 8] },
        { name: `静安区`, value: [121.448224, 31.229003, 9] },
        { name: `黄浦区`, value: [121.490317, 31.222771, 10] },
        { name: `长宁区`, value: [121.4222, 31.218123, 11] },
        { name: `徐汇区`, value: [121.43752, 31.179973, 12] },
        { name: `松江区`, value: [121.223543, 31.03047, 13] },
        { name: `闵行区`, value: [121.375972, 31.111658, 14] },
        { name: `金山区`, value: [121.458472, 30.912345, 15] },
        { name: `奉贤区`, value: [121.458472, 30.912345, 16] }
      ]
    };
  },
  created() {},
  mounted() {
    this.drawChart();
    window.testFun = this.testFun;
  },

  methods: {
    // vue内部方法
    testFun(va1, va2) {
      console.log(va1, va2);
      this.dialogVisible = true;
    },
    // 弹框
    handleClose(done) {
      this.$confirm("确认关闭?")
        .then(_ => {
          done();
        })
        .catch(_ => {});
    },

    drawChart() {
      // 基于准备好的dom,初始化echarts实例
      let chart = this.$echarts.init(document.getElementById("chart"));
      // 监听屏幕变化自动缩放图表
      window.addEventListener("resize", function() {
        chart.resize();
      });

      // 绘制图表
      chart.setOption({
        // 图表主标题
        title: {
          text: "全国各省人口", // 主标题文本,支持使用 \n 换行
          top: 20, // 定位 值: 'top', 'middle', 'bottom' 也可以是具体的值或者百分比
          left: "center", // 值: 'left', 'center', 'right' 同上
          textStyle: {
            // 文本样式
            fontSize: 24,
            fontWeight: 600,
            color: "#fff"
          }
        },
        // 提示框组件
        tooltip: {
          trigger: "item", // 触发类型, 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用
          // 提示框浮层内容格式器,支持字符串模板和回调函数两种形式
          // 使用函数模板  传入的数据值 -> value: number | Array
          triggerOn: "click",
          enterable: true,
          formatter: function(val) {
            console.log(val);
            let valu = val.data.value;

            return (
              val.data.name +
              "<br>人口数量: " +
              val.data.value[2] +
              "万" +
              `<button  onclick="onClickSeries(\'` +
              valu +
              `\',\' ` +
              1 +
              `\')">这是显示的文本</button>`
            );
          }
        },
        geo: {
          zoom: 1,
          // geoIndex: 1,
          aspectScale: 1, //长宽比
          map: "上海", // 地图类型
          show: true, // 是否显示地理坐标系组件
          // 是否开启鼠标缩放和平移漫游 默认不开启 如果只想要开启缩放或者平移,
          // 可以设置成 'scale' 或者 'move' 设置成 true 为都开启
          roam: false,
          // 图形上的文本标签
          label: {
            show: false // 是否显示对应地名
          },
          // 地图区域的多边形 图形样式
          itemStyle: {
            normal: {
              areaColor: "#053fc4", // 地图颜色
              borderWidth: 5, // 边框的宽度
              shadowColor: "#0098d9", //  阴影颜色
              borderColor: "#00FFFF", // 边框颜色
              // shadowOffsetX: -5,
              // shadowOffsetY: 10,
              shadowBlur: 12, // 阴影的模糊大小
              shadowOffsetX: 0, //阴影水平方向上的偏移距离
              shadowOffsetY: 12 // 阴影垂直方向上的偏移距离
            },
            emphasis: {
              show: false
            }
          },

          // 高亮状态下的多边形和标签样式
          emphasis: {
            label: {
              show: true, // 是否显示标签
              color: "#fff" // 文字的颜色 如果设置为 'auto',则为视觉映射得到的颜色,如系列色
            },
            itemStyle: {
              areaColor: "#9cc3f5" // 地图区域的颜色
            }
          }
        },
        series: [
          {
            type: "map",
            map: "上海",
            // center: [112.194115019531, 23.582111640625],
            zoom: 1,
            geoIndex: 1,
            aspectScale: 1, //长宽比
            showLegendSymbol: false, // 存在legend时显示

            label: {
              normal: {
                show: true,
                textStyle: {
                  fontSize: 8,
                  color: "#ccc"
                }
              },
              emphasis: {
                show: false,
                textStyle: {
                  color: "#ccc"
                }
              }
            },
            roam: false,
            itemStyle: {
              normal: {
                areaColor: "#053fc4",
                borderColor: "#fff",
                fontWeightL: 700,
                borderWidth: 1
              },
              emphasis: {
                areaColor: {
                  type: "linear",
                  x: 0,
                  y: 0,
                  x2: 0,
                  y2: 1,
                  colorStops: [
                    {
                      offset: 0,
                      color: "#3f15d6" // 0% 处的颜色
                    },
                    {
                      offset: 1,
                      color: "#d243cd" // 100% 处的颜色
                    }
                  ],
                  globalCoord: false // 缺省为 false
                }
              }
            },
            data: this.dataS
          },
          {
            type: "scatter", // 类型
            coordinateSystem: "geo", // 该系列使用的坐标系 可选: 'cartesian2d','polar','geo'
            // 标记的图形, 标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond',
            // 'pin', 'arrow', 'none'
            symbol: "circle",
            symbolSize: 8, // 标记的大小
            // 图形的样式
            itemStyle: {
              normal: {
                // areaColor: '#00FFFF', // 地图颜色
                borderWidth: 1, // 边框的宽度
                shadowColor: "#0098d9", //  阴影颜色
                borderColor: "#00FFFF", // 边框颜色
                // shadowOffsetX: -5,
                // shadowOffsetY: 10,
                shadowBlur: 12, // 阴影的模糊大小
                shadowOffsetX: 0, //阴影水平方向上的偏移距离
                shadowOffsetY: 12 // 阴影垂直方向上的偏移距离
              },
              emphasis: {
                show: false
              }
            },
            // 系列中的数据内容数组, 数组项通常为具体的数据项
            data: this.dataS
          },
          {
            type: "effectScatter", // 类型
            coordinateSystem: "geo", // 该系列使用的坐标系 可选: 'cartesian2d','polar','geo'
            // 标记的图形, 标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond',
            // 'pin', 'arrow', 'none'
            symbol: "circle",
            // 标记的大小, 如果需要每个数据的图形大小不一样,可以设置为如下格式的回调函数
            // (value: Array|number, params: Object) => number|Array
            // 其中第一个参数 value 为 data 中的数据值。第二个参数params 是其它的数据项参数
            symbolSize: function(val) {
              return val[2] / 600;
            },
            // 图形的样式
            itemStyle: {
              normal: {
                // areaColor: '#00FFFF', // 地图颜色
                borderWidth: 1, // 边框的宽度
                shadowColor: "#0098d9", //  阴影颜色
                borderColor: "#00FFFF", // 边框颜色
                // shadowOffsetX: -5,
                // shadowOffsetY: 10,
                shadowBlur: 12, // 阴影的模糊大小
                shadowOffsetX: 0, //阴影水平方向上的偏移距离
                shadowOffsetY: 12 // 阴影垂直方向上的偏移距离
              },
              emphasis: {
                show: false
              }
            },
            // 系列中的数据内容数组。数组项通常为具体的数据项
            data: [
              { name: `长宁区`, value: [121.4222, 31.218123, 11] },
              { name: `徐汇区`, value: [121.43752, 31.179973, 12] },
              { name: `松江区`, value: [121.223543, 31.03047, 13] },
              { name: `闵行区`, value: [121.375972, 31.111658, 14] },
              { name: `金山区`, value: [121.458472, 30.912345, 15] },
              { name: `奉贤区`, value: [121.458472, 30.912345, 16] }
            ]
          }
        ]
      });
    }
  }
};
</script>

样式

<style scoped>
.wrapper {
  width: 100%;
}
.wrapper .chart {
  width: 800px;
  height: 500px;
  margin: 100px 50px 0;
  border: 1px solid #eeeeee;
  background-size: 100% 100%;
}
#chart {
  pointer-events: all;
}
</style>

下面是完整代码

<template>

  <div class="wrapper">

    <div class="chart" id="chart"></div>

    <el-dialog

      title="提示"

      :visible.sync="dialogVisible"

      width="30%"

      :before-close="handleClose"

    >

      <span>这是一段信息</span>

      <span slot="footer" class="dialog-footer">

        <el-button @click="dialogVisible = false">取 消</el-button>

        <el-button type="primary" @click="dialogVisible = false"

          >确 定</el-button

        >

      </span>

    </el-dialog>

  </div>

</template>

<script>

import shanghai from "../../static/map/js/province/shanghai";

// 用来保存所有的地图实例

const globalMap = {};

// params 当前tooltip数据, key: 当前实例的键值

window.onClickSeries = function(params, key) {

  testFun(params, key); // 直接通过window方法去调用methods中对应方法

  // 获取当前id地图的回调方法并执行

  console.log(params);

};

export default {

  data() {

    return {

      dialogVisible: false,

      city: "",

      dataS: [

        { name: `浦东新区`, value: [121.567706, 31.245944, 1] },

        { name: `宝山区`, value: [121.489934, 31.398896, 2] },

        { name: `崇明区`, value: [121.526, 31.658, 3] },

        { name: `嘉定区`, value: [121.250333, 31.383524, 4] },

        { name: `青浦区`, value: [121.113021, 31.151209, 5] },

        { name: `杨浦区`, value: [121.522797, 31.270755, 6] },

        { name: `虹口区`, value: [121.491832, 31.26097, 7] },

        { name: `普陀区`, value: [121.392499, 31.241701, 8] },

        { name: `静安区`, value: [121.448224, 31.229003, 9] },

        { name: `黄浦区`, value: [121.490317, 31.222771, 10] },

        { name: `长宁区`, value: [121.4222, 31.218123, 11] },

        { name: `徐汇区`, value: [121.43752, 31.179973, 12] },

        { name: `松江区`, value: [121.223543, 31.03047, 13] },

        { name: `闵行区`, value: [121.375972, 31.111658, 14] },

        { name: `金山区`, value: [121.458472, 30.912345, 15] },

        { name: `奉贤区`, value: [121.458472, 30.912345, 16] }

      ]

    };

  },

  created() {},

  mounted() {

    this.drawChart();

    window.testFun = this.testFun;

  },

  methods: {

    // vue内部方法

    testFun(va1, va2) {

      console.log(va1, va2);

      this.dialogVisible = true;

    },

    // 弹框

    handleClose(done) {

      this.$confirm("确认关闭?")

        .then(_ => {

          done();

        })

        .catch(_ => {});

    },

    drawChart() {

      // 基于准备好的dom,初始化echarts实例

      let chart = this.$echarts.init(document.getElementById("chart"));

      // 监听屏幕变化自动缩放图表

      window.addEventListener("resize", function() {

        chart.resize();

      });

      // 绘制图表

      chart.setOption({

        // 图表主标题

        title: {

          text: "全国各省人口", // 主标题文本,支持使用 \n 换行

          top: 20, // 定位 值: 'top', 'middle', 'bottom' 也可以是具体的值或者百分比

          left: "center", // 值: 'left', 'center', 'right' 同上

          textStyle: {

            // 文本样式

            fontSize: 24,

            fontWeight: 600,

            color: "#fff"

          }

        },

        // 提示框组件

        tooltip: {

          trigger: "item", // 触发类型, 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用

          // 提示框浮层内容格式器,支持字符串模板和回调函数两种形式

          // 使用函数模板  传入的数据值 -> value: number | Array

          triggerOn: "click",

          enterable: true,

          formatter: function(val) {

            console.log(val);

            let valu = val.data.value;

            return (

              val.data.name +

              "<br>人口数量: " +

              val.data.value[2] +

              "万" +

              `<button  οnclick="onClickSeries(\'` +

              valu +

              `\',\' ` +

              1 +

              `\')">这是显示的文本</button>`

            );

          }

        },

        geo: {

          zoom: 1,

          // geoIndex: 1,

          aspectScale: 1, //长宽比

          map: "上海", // 地图类型

          show: true, // 是否显示地理坐标系组件

          // 是否开启鼠标缩放和平移漫游 默认不开启 如果只想要开启缩放或者平移,

          // 可以设置成 'scale' 或者 'move' 设置成 true 为都开启

          roam: false,

          // 图形上的文本标签

          label: {

            show: false // 是否显示对应地名

          },

          // 地图区域的多边形 图形样式

          itemStyle: {

            normal: {

              areaColor: "#053fc4", // 地图颜色

              borderWidth: 5, // 边框的宽度

              shadowColor: "#0098d9", //  阴影颜色

              borderColor: "#00FFFF", // 边框颜色

              // shadowOffsetX: -5,

              // shadowOffsetY: 10,

              shadowBlur: 12, // 阴影的模糊大小

              shadowOffsetX: 0, //阴影水平方向上的偏移距离

              shadowOffsetY: 12 // 阴影垂直方向上的偏移距离

            },

            emphasis: {

              show: false

            }

          },

          // 高亮状态下的多边形和标签样式

          emphasis: {

            label: {

              show: true, // 是否显示标签

              color: "#fff" // 文字的颜色 如果设置为 'auto',则为视觉映射得到的颜色,如系列色

            },

            itemStyle: {

              areaColor: "#9cc3f5" // 地图区域的颜色

            }

          }

        },

        series: [

          {

            type: "map",

            map: "上海",

            // center: [112.194115019531, 23.582111640625],

            zoom: 1,

            geoIndex: 1,

            aspectScale: 1, //长宽比

            showLegendSymbol: false, // 存在legend时显示

            label: {

              normal: {

                show: true,

                textStyle: {

                  fontSize: 8,

                  color: "#ccc"

                }

              },

              emphasis: {

                show: false,

                textStyle: {

                  color: "#ccc"

                }

              }

            },

            roam: false,

            itemStyle: {

              normal: {

                areaColor: "#053fc4",

                borderColor: "#fff",

                fontWeightL: 700,

                borderWidth: 1

              },

              emphasis: {

                areaColor: {

                  type: "linear",

                  x: 0,

                  y: 0,

                  x2: 0,

                  y2: 1,

                  colorStops: [

                    {

                      offset: 0,

                      color: "#3f15d6" // 0% 处的颜色

                    },

                    {

                      offset: 1,

                      color: "#d243cd" // 100% 处的颜色

                    }

                  ],

                  globalCoord: false // 缺省为 false

                }

              }

            },

            data: this.dataS

          },

          {

            type: "scatter", // 类型

            coordinateSystem: "geo", // 该系列使用的坐标系 可选: 'cartesian2d','polar','geo'

            // 标记的图形, 标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond',

            // 'pin', 'arrow', 'none'

            symbol: "circle",

            symbolSize: 8, // 标记的大小

            // 图形的样式

            itemStyle: {

              normal: {

                // areaColor: '#00FFFF', // 地图颜色

                borderWidth: 1, // 边框的宽度

                shadowColor: "#0098d9", //  阴影颜色

                borderColor: "#00FFFF", // 边框颜色

                // shadowOffsetX: -5,

                // shadowOffsetY: 10,

                shadowBlur: 12, // 阴影的模糊大小

                shadowOffsetX: 0, //阴影水平方向上的偏移距离

                shadowOffsetY: 12 // 阴影垂直方向上的偏移距离

              },

              emphasis: {

                show: false

              }

            },

            // 系列中的数据内容数组, 数组项通常为具体的数据项

            data: this.dataS

          },

          {

            type: "effectScatter", // 类型

            coordinateSystem: "geo", // 该系列使用的坐标系 可选: 'cartesian2d','polar','geo'

            // 标记的图形, 标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond',

            // 'pin', 'arrow', 'none'

            symbol: "circle",

            // 标记的大小, 如果需要每个数据的图形大小不一样,可以设置为如下格式的回调函数

            // (value: Array|number, params: Object) => number|Array

            // 其中第一个参数 value 为 data 中的数据值。第二个参数params 是其它的数据项参数

            symbolSize: function(val) {

              return val[2] / 600;

            },

            // 图形的样式

            itemStyle: {

              normal: {

                // areaColor: '#00FFFF', // 地图颜色

                borderWidth: 1, // 边框的宽度

                shadowColor: "#0098d9", //  阴影颜色

                borderColor: "#00FFFF", // 边框颜色

                // shadowOffsetX: -5,

                // shadowOffsetY: 10,

                shadowBlur: 12, // 阴影的模糊大小

                shadowOffsetX: 0, //阴影水平方向上的偏移距离

                shadowOffsetY: 12 // 阴影垂直方向上的偏移距离

              },

              emphasis: {

                show: false

              }

            },

            // 系列中的数据内容数组。数组项通常为具体的数据项

            data: [

              { name: `长宁区`, value: [121.4222, 31.218123, 11] },

              { name: `徐汇区`, value: [121.43752, 31.179973, 12] },

              { name: `松江区`, value: [121.223543, 31.03047, 13] },

              { name: `闵行区`, value: [121.375972, 31.111658, 14] },

              { name: `金山区`, value: [121.458472, 30.912345, 15] },

              { name: `奉贤区`, value: [121.458472, 30.912345, 16] }

            ]

          }

        ]

      });

    }

  }

};

</script>

<style scoped>

.wrapper {

  width: 100%;

}

.wrapper .chart {

  width: 800px;

  height: 500px;

  margin: 100px 50px 0;

  border: 1px solid #eeeeee;

  /* background: url(../../public/static/bg.png) no-repeat; */

  background-size: 100% 100%;

}

#chart {

  pointer-events: all;

}

</style>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要给 ECharts 地图点添加点事件,可以使用 ECharts 提供的事件处理函数。下面是一个简单的示例代码,演示了如何在地图上添加点并为点添加点事件: ```javascript // 初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 定义点数据 var data = [ {name: '北京', value: [116.46, 39.92]}, {name: '上海', value: [121.48, 31.22]}, {name: '杭州', value: [120.19, 30.26]}, //... ]; // 定义地图配置 var option = { tooltip: {}, geo: { map: 'china' }, series: [{ name: '点', type: 'scatter', coordinateSystem: 'geo', data: data, symbolSize: 10, label: { normal: { show: true, formatter: '{b}', position: 'right' } }, itemStyle: { normal: { color: '#F06C00' } } }] }; // 绑定点事件 myChart.on('click', function (params) { if (params.componentType === 'series' && params.seriesType === 'scatter') { // 点点,可以在这里添加你的逻辑 console.log('clicked', params.name); } }); // 渲染地图 myChart.setOption(option); ``` 在上面的代码中,我们先定义了一个 data 数组,其中包含了一些城市的经纬度信息。然后定义了一个地图的配置对象,其中包含了一个的系列,用于显示这些城市的位置。接着使用 `on` 方法绑定了一个点事件,当用户点点时,会触发这个事件,我们可以在事件处理函数里添加自己的逻辑。 需要注意的是,的系列类型是 `scatter`,地图投影方式是 `geo`,事件类型是 `click`。同时,由于 ECharts 可以支持多个系列,多个坐标系,因此在事件处理函数里需要判断用户点的是哪个系列,以及系列的类型是什么。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值