vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果

5 篇文章 0 订阅

一、实现效果
  • 使用echarts实现省市地图绘制,你也可以绘制全国地图。
  • 根据数据在地图显示柱状图,根据经纬度实现定位。
  • 根据数据显示数据,涟漪动态效果。
  • 当然你也可以根据你自己的需求,增删效果哦。
二、实现方法
1、安装echarts插件
npm install echarts --save
2、获取省市json数据

https://datav.aliyun.com/portal/school/atlas/area_selector

通过 阿里旗下的高德地图提供的api ,可以获取到中国各个省份/区级/县级的json数据,但是区级和县级,并没有包含街道和乡镇的数据。

3、本例中data 数据

本文以吉林省地图为例,来实现吉林省下所有市的柱状图显示效果。
你也可以显示中国地图或其他身份地图。原理是一样的哦。

  • 定义一个容器map,最好是定义一个是ID名字的
<template>
    <div class="map" id="map"></div>
</template>
  • 导入插件及吉林省数据,如果你是其他省份的,或全国的,一样的导入哦。
import * as echarts from "echarts";
import jilin from "./json/jilin.json";
  • 准备数据数据

后面这些数据是通过接口来获取的,本示例写的是静态测试数据,我这里是前端提前查询号的。你也可以自己查询。

经纬度查询定位

export default {
  data() {
      return {
          //城市坐标数据
          geoCoordMap: {
                "长春市": [125.31787, 44.05534],
                "吉林市": [126.68595, 43.85034],
                "通化市": [125.76539, 41.68568],
                "四平市": [124.02419, 43.48220],
                "白山市": [127.15109, 42.00513],
                "辽源市": [125.15042, 42.89406],
                "白城市": [122.83774, 45.07098],
                "延边朝鲜族自治州": [129.01009, 42.79950],
                "松原市": [124.55833, 44.94686],
            },
            //吉林省下所有市的测试数据
            testData: [
                {
                    name: '长春市',
                    value: '80',
                },
                {
                    name: '吉林市',
                    value: '70',
                },
                {
                    name: '通化市',
                    value: '60',
                },
                {
                    name: '四平市',
                    value: '50',
                },
                {
                    name: '白山市',
                    value: '90',
                },
                {
                    name: '辽源市',
                    value: '30',
                },
                {
                    name: '白城市',
                    value: '40',
                },
                {
                    name: '延边朝鲜族自治州',
                    value: '30',
                },
                {
                    name: '松原市',
                    value: '20',
                }
            ]
      };
  },
}
4、吉林省地图的绘制

geo:地理坐标系组件。用于地图的绘制,支持在地理坐标系上绘制散点图,线集。geo 区域的颜色也可以被 map series 所控制。

ECharts 可以使用 GeoJSON 格式的数据作为地图的轮廓,你可以获取第三方的 GeoJSON 数据注册到 ECharts 中。

geo: [
    {
        map: 'jilin',
        zoom: 1.2, // 默认显示级别
        itemStyle: { //设置地图板块配置选项
            normal: {
                // 图形的描边颜色
                borderColor: '#55aaff',
                // 描边线宽。
                borderWidth: 1,
                // 柱条的描边类型。
                borderType: 'solid',
                areaColor: '#083D7E',
            },
            // // 鼠标放上去后,样式改变
            emphasis: {
                // 图形的描边颜色
                borderColor: '#1DF9FC',
                borderWidth: '2',
                // 阴影色
                areaColor: '#3099E2',
            },
        },
        label: {
            show: false,
            formatter: '',
        },
    },
],

geo属性说明:

  • map:使用 registerMap 注册的地图名称。
  • zoom:当前视角的缩放比例。
  • itemStyle:地图区域的多边形 图形样式。
  • emphasis:高亮状态下的多边形和标签样式。
  • label:图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
5、柱状图样式

柱状图是利用3个样式层叠实现的。
1、顶部椭圆样式:type: ‘lines’
2、中部矩形样式:type: ‘scatter’
3、底部椭圆样式:type: ‘scatter’

type: 'lines',
zlevel: 5,
effect: {
    show: false,
    symbolSize: 5 // 图标大小
},
lineStyle: {
    width: 20, // 尾迹线条宽度
    color: 'rgb(22,255,255, .6)',
    opacity: 1, // 尾迹线条透明度
    curveness: 0 // 尾迹线条曲直度
},
6、设置柱状底部涟漪特效样式

带有涟漪特效动画的散点(气泡)图。利用动画特效可以将某些想要突出的数据进行视觉突出。

涟漪特效相关配置见下方代码注释。

type: 'effectScatter',
rippleEffect: { //涟漪特效相关配置
    period: 4, //动画的周期,秒数,值越小速度越快
    brushType: "stroke", //波纹的绘制方式,可选 'stroke' 和 'fill'
    scale: 2, //动画中波纹的最大缩放比例,值越大波纹越大 4
    color: 'rgb(22,255,255, 1)',//涟漪的颜色
    number: 2//波纹的数量
},
7、数据处理

根据接口数据,及经纬度坐标处理数据。

  • 动态计算柱形图的高度
lineMaxHeight() {
    const maxValue = Math.max(...this.testData.map(item => item.value))
    return 0.9 / maxValue
},
  • 柱状体的主干数据
lineData() {
    let {testData,geoCoordMap} = this
    return testData.map((item) => {
        return {
            coords: [geoCoordMap[item.name], [geoCoordMap[item.name][0], geoCoordMap[item.name][1] + item.value * this.lineMaxHeight()]]
        }
    })
},
  • 柱状体的顶部
scatterTopData() {
    let {testData,geoCoordMap} = this
    return testData.map((item) => {
        return [geoCoordMap[item.name][0], geoCoordMap[item.name][1] + item.value * this.lineMaxHeight(), item.value]
    })
},
  • 柱状体的底部
scatterBottomData() {
    let {testData,geoCoordMap} = this
    return testData.map((item) => {
        return {
            name: item.name,
            value: geoCoordMap[item.name]
        }
    })
},
三、示例代码已上传,去顶部可下载

附全部代码

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

<script>
import * as echarts from "echarts";
import jilin from "@/json/jilin.json";
export default {
    data() {
        return {
            geoCoordMap: {
                "长春市": [125.31787, 44.05534],
                "吉林市": [126.68595, 43.85034],
                "通化市": [125.76539, 41.68568],
                "四平市": [124.02419, 43.48220],
                "白山市": [127.15109, 42.00513],
                "辽源市": [125.15042, 42.89406],
                "白城市": [122.83774, 45.07098],
                "延边朝鲜族自治州": [129.01009, 42.79950],
                "松原市": [124.55833, 44.94686],
            },
            testData: [
                {
                    name: '长春市',
                    value: '80',
                },
                {
                    name: '吉林市',
                    value: '70',
                },
                {
                    name: '通化市',
                    value: '60',
                },
                {
                    name: '四平市',
                    value: '50',
                },
                {
                    name: '白山市',
                    value: '90',
                },
                {
                    name: '辽源市',
                    value: '30',
                },
                {
                    name: '白城市',
                    value: '40',
                },
                {
                    name: '延边朝鲜族自治州',
                    value: '30',
                },
                {
                    name: '松原市',
                    value: '20',
                }
            ]
        };
    },
    created() {

    },
    mounted() {
        this.drawMap()
    },
    methods: {
        drawMap() {
            // 判断地图是否渲染
            let myChart = echarts.getInstanceByDom(document.getElementById("map"))
            // 如果渲染则清空地图 
            if (myChart != null) {
                myChart.dispose()
            }
            // 初始化地图
            myChart = echarts.init(document.getElementById("map"));

            echarts.registerMap("jilin", jilin)

            var option = {
                geo: [
                    {
                        map: 'jilin',
                        zoom: 1.2, // 默认显示级别
                        itemStyle: { //设置地图板块配置选项
                            normal: {
                                // 图形的描边颜色
                                borderColor: '#55aaff',
                                // 描边线宽。
                                borderWidth: 1,
                                // 柱条的描边类型。
                                borderType: 'solid',
                                areaColor: '#083D7E',
                            },
                            // // 鼠标放上去后,样式改变
                            emphasis: {
                                // 图形的描边颜色
                                borderColor: '#1DF9FC',
                                borderWidth: '2',
                                // 阴影色
                                areaColor: '#3099E2',
                            },
                        },
                        label: {
                            show: false,
                            formatter: '',
                        },
                    },
                ],
                series: [
                    // 柱状体的主干
                    {
                        type: 'lines',
                        zlevel: 5,
                        effect: {
                            show: false,
                            symbolSize: 5 // 图标大小
                        },
                        lineStyle: {
                            width: 20, // 尾迹线条宽度
                            color: 'rgb(22,255,255, .6)',
                            opacity: 1, // 尾迹线条透明度
                            curveness: 0 // 尾迹线条曲直度
                        },
                        silent: true,
                        data: this.lineData()
                    },
                    // 柱状体的顶部
                    {
                        type: 'scatter',
                        coordinateSystem: 'geo',
                        geoIndex: 0,
                        zlevel: 5,
                        label: {
                            show: true,
                            formatter: function (e) {
                                return `数值:${e.data[2]}`
                            },
                            position: "top"
                        },
                        symbol: 'circle',
                        symbolSize: [20, 10],
                        itemStyle: {
                            color: 'rgb(22,255,255, 1)',
                            opacity: 1
                        },
                        silent: true,
                        data: this.scatterTopData()
                    },
                    // 柱状体的底部
                    {
                        type: 'scatter',
                        coordinateSystem: 'geo',
                        geoIndex: 0,
                        zlevel: 4,
                        label: {
                            // 这儿是处理的
                            formatter: '{b}',
                            position: 'bottom',
                            color: '#fff',
                            fontSize: 12,
                            distance: 10,
                            show: true
                        },
                        symbol: 'circle',
                        symbolSize: [20, 10],
                        itemStyle: {
                            // color: '#F7AF21',
                            color: 'rgb(22,255,255, 1)',
                            opacity: 1
                        },
                        silent: true,
                        data: this.scatterBottomData()
                    },
                    // 底部外框
                    {
                        type: 'effectScatter',
                        rippleEffect: { //涟漪特效相关配置
                            period: 4, //动画的周期,秒数,值越小速度越快
                            brushType: "stroke", //波纹的绘制方式,可选 'stroke' 和 'fill'
                            scale: 2, //动画中波纹的最大缩放比例,值越大波纹越大 4
                            color: 'rgb(22,255,255, 1)',//涟漪的颜色
                            number: 2//波纹的数量
                        },
                        coordinateSystem: 'geo',
                        geoIndex: 0,
                        zlevel: 4,
                        label: {
                            show: false
                        },
                        symbol: 'circle',
                        symbolSize: [40, 20],
                        itemStyle: {
                            color: {
                                type: 'radial',
                                x: 0.5,
                                y: 0.5,
                                r: 0.5,
                                colorStops: [
                                    {
                                        offset: 0, color: 'rgb(22,255,255, 0)' // 0% 处的颜色
                                    },
                                    {
                                        offset: .74, color: 'rgb(22,255,255, 0)' // 100% 处的颜色
                                    },
                                    {
                                        offset: .75, color: 'rgb(22,255,255, 1)' // 100% 处的颜色
                                    },
                                    {
                                        offset: 1, color: 'rgb(22,255,255, 1)' // 100% 处的颜色
                                    }
                                ],
                            },
                        },
                        data: this.scatterBottomData()
                    }
                ]
            }
            myChart.setOption(option)
        },

        // 动态计算柱形图的高度
        lineMaxHeight() {
            const maxValue = Math.max(...this.testData.map(item => item.value))
            return 0.9 / maxValue
        },
        // 柱状体的主干
        lineData() {
            let {testData,geoCoordMap} = this
            return testData.map((item) => {
                return {
                    coords: [geoCoordMap[item.name], [geoCoordMap[item.name][0], geoCoordMap[item.name][1] + item.value * this.lineMaxHeight()]]
                }
            })
        },
        // 柱状体的顶部
        scatterTopData() {
            let {testData,geoCoordMap} = this
            return testData.map((item) => {
                return [geoCoordMap[item.name][0], geoCoordMap[item.name][1] + item.value * this.lineMaxHeight(), item.value]
            })
        },
        // 柱状体的底部
        scatterBottomData() {
            let {testData,geoCoordMap} = this
            return testData.map((item) => {
                return {
                    name: item.name,
                    value: geoCoordMap[item.name]
                }
            })
        },
    },
}
</script>

<style scoped>
.map {
    width: 800px;
    height: 600px;
    position: relative;
}
</style>
四、效果展示

在这里插入图片描述

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Vue使用Echarts实现柱状图动态数据,可以按照以下步骤进行: 1. 安装echartsvue-echarts ```bash npm install echarts --save npm install vue-echarts --save ``` 2. 在Vue组件引入Echartsvue-echarts ```javascript import ECharts from 'vue-echarts/components/ECharts.vue' import 'echarts/lib/chart/bar' import 'echarts/lib/component/tooltip' ``` 3. 在Vue组件定义数据和配置项 ```javascript data () { return { chartData: { xData: [], yData: [] } } }, computed: { chartOptions () { return { tooltip: {}, xAxis: { data: this.chartData.xData }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: this.chartData.yData }] } } } ``` 4. 在Vue组件定义方法来更新数据 ```javascript methods: { updateChartData () { // 获取新数据 const newData = ... // 更新chartData this.chartData.xData = newData.xData this.chartData.yData = newData.yData } } ``` 5. 在Vue组件使用ECharts组件并传入配置项和数据 ```html <template> <div> <e-charts :options="chartOptions" :data="chartData"></e-charts> </div> </template> <script> import ECharts from 'vue-echarts/components/ECharts.vue' import 'echarts/lib/chart/bar' import 'echarts/lib/component/tooltip' export default { components: { ECharts }, data () { return { chartData: { xData: [], yData: [] } } }, computed: { chartOptions () { return { tooltip: {}, xAxis: { data: this.chartData.xData }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: this.chartData.yData }] } } }, methods: { updateChartData () { // 获取新数据 const newData = ... // 更新chartData this.chartData.xData = newData.xData this.chartData.yData = newData.yData } } } </script> ``` 6. 在需要更新数据的时候调用方法 ```html <template> <div> <e-charts :options="chartOptions" :data="chartData"></e-charts> <button @click="updateChartData">更新数据</button> </div> </template> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邹荣乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值