echart:地图的制造&数据可视化

简介: 本文档介绍了如何使用 ECharts 和 Vue.js 制作中国地图,并展示了具体的数据绑定和样式设置方法。首先通过 Axios 获取地图数据并注册到 ECharts,然后设置地图的视觉映射、数据系列等配置项,实现地图的动态显示与交互。此外,还提供了关于时间显示、边框修饰、自定义字体及图表栏的样式调整等实用技巧。

前言

本文档旨在指导开发者如何结合 ECharts 和 Vue.js 制作交互式的中国地图,详细介绍了数据绑定和样式设置的具体方法。首先,使用 Axios 从外部获取地图数据,并将其注册到 ECharts 中,以便进行可视化展示。接着,文档深入讲解了如何配置地图的视觉映射、数据系列等关键项,从而实现动态显示和交互效果。为了提升用户体验,我们还提供了一系列实用技巧,包括时间显示的格式化、地图边框的装饰、自定义字体的应用及图表栏的样式调整等。这些内容将帮助开发者快速实现美观且功能丰富的地图展示,增强数据可视化的效果。

地图的制作

<template>
    <div class="score-map">
        <div id="main" ref="main">
        </div>
    </div>
</template>
<script>
import * as echarts from 'echarts';
import 'echarts/extension/bmap/bmap';
import axios from 'axios';
export default {
    name: 'app',
    data() {
        return {
        }
    },
    mounted() {
        axios.get("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json").then((res) => {
             echarts.registerMap("china", { geoJSON: res.data })
            let myChart = echarts.init(document.getElementById("main"));
            let arr = [
                {
                    name: "北京市",
                    value: 54,
                },
                {
                    name: "天津市",
                    value: 13,
                },
                {
                    name: "上海市",
                    value: 40,
                },
                {
                    name: "重庆市",
                    value: 75,
                },
                {
                    name: "河北省",
                    value: 13,
                },
                {
                    name: "河南省",
                    value: 83,
                },
                {
                    name: "云南省",
                    value: 11,
                },
                {
                    name: "辽宁省",
                    value: 19,
                },
                {
                    name: "黑龙江省",
                    value: 15,
                },
                {
                    name: "湖南省",
                    value: 69,
                },
                {
                    name: "安徽省",
                    value: 60,
                },
                {
                    name: "山东省",
                    value: 39,
                },
                {
                    name: "新疆省",
                    value: 4,
                },
                {
                    name: "江苏省",
                    value: 31,
                },
                {
                    name: "浙江省",
                    value: 104,
                },
                {
                    name: "江西省",
                    value: 36,
                },
                {
                    name: "湖北省",
                    value: 1052,
                },
                {
                    name: "广西省",
                    value: 33,
                },
                {
                    name: "甘肃省",
                    value: 7,
                },
                {
                    name: "山西省",
                    value: 9,
                },
                {
                    name: "内蒙古省",
                    value: 7,
                },
                {
                    name: "陕西省",
                    value: 22,
                },
                {
                    name: "吉林省",
                    value: 4,
                },
                {
                    name: "福建省",
                    value: 18,
                },
                {
                    name: "贵州省",
                    value: 5,
                },
                {
                    name: "广东省",
                    value: 98,
                },
                {
                    name: "青海市",
                    value: 1,
                },
            ];
            let option = {
                tooltip: {
                    formmater: '{c}<br />{b1}:{c1}'
                },
                visualMap: {
                    type: "piecewise",
                    show: true,
                    min: 0,
                    max: 1000,
                    left: "17%",
                    bottom: "6%",
                    showLabel: true,
                    // text: ["高", "低"],
                    textStyle: {
                        color: "red",
                    },
                    pieces: [
                        // 图例颜色
                        {
                            min: 10000,
                            max: 999999,
                            label: ">10000",
                            color: "#A9251B",
                            symbol: "roundRect",
                        },
                        {
                            min: 1000,
                            max: 9999,
                            label: "1000-9999",
                            color: "#D5514D",
                            symbol: "roundRect",
                        },
                        {
                            min: 100,
                            max: 999,
                            label: "100-999",
                            color: "#E57C6D",
                            symbol: "roundRect",
                        },
                        {
                            min: 10,
                            max: 99,
                            label: "10-99",
                            color: "#F19D8A",
                            symbol: "roundRect",
                        },
                        {
                            min: 1,
                            max: 9,
                            label: "1-9",
                            color: "#FBE6DC",
                            symbol: "roundRect",
                        },
                        {
                            value: 0,
                            label: "0",
                            color: "#ffffff",
                            symbol:
                                "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAeCAMAAAAB8C7XAAAAeFBMVEUAAADBIhzAIh+/ISDBHSHDHh6jMyHAISDAISC/ISDAIR/AISDAHiG/IR+6RjG+IiC/IiHAICC/IR/AISG+ISG+Ix+/ICDAIiC+IB/AIBzCHh68JRa/IiHAIB+/ISC9IiK/Hx+/IiC+IiK+Ih++ICDCJB/BJB+/ISDiIZL9AAAAJ3RSTlMALfv3HQwG0secl4NTQQPkvLWoo2xpZWFYJBkR693CkIx4WktHMjGv/nLNAAAAp0lEQVQoz4XNVwrEMAxFUcUlvfcyvWn/OxxBMASPxNyPBL9jMPwrNJ9gcwfTLfQt52ueRgqpeLQ0rJnGgP4BHtJNcqE7BNQJvRy0EgwSLBJAJUEnwSSBkQDO/l6XOyTe3lrYexxX1bzAte5TlWT9XFg4FNGs+xJ+SgnuwJQTGA42xYB7pGDhhjiw8ERMWbAKY2CLUYcsZIhvFgrEkYVQYw5s9QR8/tNf+EUpppEdkKMAAAAASUVORK5CYII=",
                        },
                    ],
                },
                geo: {
                    map: "china",
                    zoom: 1.7,
                    top: "30%",
                    label: {
                        show: true,
                        fontSize: "14",
                        color: "#00D9A9",
                    },
                },
                series: [
                    {
                        type: "map",
                        name: "china",
                        geoIndex: 0,
                        data: arr,
                    },
                ],
            };
            myChart.setOption(option);
        })
    }
}
</script>
<style scoped>
.score-map {
    width: 100%;
}
#main {
    width: 100%;
    height: 600px;
}
</style>

步骤


第一步需要映入  china.js 文件

import "@/assets/js/china"

js文件  需要 导出

let a = {
b:"1",
c:"2",
}
export default a;


存储代码


在 echarts文件夹下面

<template>
    <div id='map'>
    </div>
</template>
<script>
import axios from "axios";
import "@/assets/js/china"
import * as echarts from "echarts"
import geoCoordMap from "@/assets/js/geoMap"
import province from "@/assets/js/province"
import test from "@/assets/js/test"
export default {
    name: 'app',
    data() {
        return {
        }
    },
    mounted() {
        let myChart = echarts.init(document.getElementById("map"));
        let BJData = province;
        var convertData = function (data) {
            var res = [];
            for (var i = 0; i < data.length; i++) {
                var dataItem = data[i];
                var fromCoord = geoCoordMap[dataItem[0].name];
                var toCoord = geoCoordMap[dataItem[1].name];
                if (fromCoord && toCoord) {
                    res.push([{
                        coord: fromCoord,
                        value: dataItem[0].value
                    }, {
                        coord: toCoord,
                    }]);
                }
            }
            return res;
        };
        var series = [];
        [
            ['太原', BJData]
        ].forEach(function (item, i) {
            series.push({
                type: 'map',
                map: 'china',
                geoIndex: 1,
                layoutCenter: ['50%', '50%'],
                layoutSize: "125%",
                selectedMode: 'single',
                // 可不可以移动
                roam: false,
                itemStyle: {
                    normal: {
                        //  面积 颜色
                        areaColor: '#00177B',
                        borderColor: '#0073DA',
                        borderWidth: 1
                    },
                    emphasis: {
                        label: {
                            show: false
                        },
                        areaColor: '#00177B'
                    }
                },
                data: [{
                    name: '山西',
                    selected: false,
                    itemStyle: {
                        areaColor: {
                            type: 'radial',
                            x: 0.5,
                            y: 0.5,
                            r: 0.5,
                            colorStops: [{
                                offset: 0,
                                color: 'rgba(0,255,255, 0.1)'
                            }, {
                                offset: 1,
                                color: 'rgba(0,255,255, 0.7)'
                            }],
                            global: false // 缺省为 false
                        }
                    }
                } // selected:true 默认选中
                ]
            }, {
                type: 'lines',
                zlevel: 2,
                effect: {
                    show: true,
                    period: 4,
                    trailLength: 0.02,
                    symbol: 'arrow',
                    symbolSize: 5,
                },
                lineStyle: {
                    normal: {
                        color: '#00FAFA',
                        width: 2,
                        opacity: 0.6,
                        curveness: 0.2
                    }
                },
                data: convertData(item[1])
            }, {
                type: 'effectScatter',
                coordinateSystem: 'geo',
                zlevel: 2,
                rippleEffect: {
                    period: 4,
                    brushType: 'stroke',
                    scale: 4
                },
                label: {
                    normal: {
                        show: true,
                        position: 'inside',
                        backgroundColor: 'rgba(1,247,248, 0.1)',
                        formatter: '{b}',
                        padding: [10, 12],
                        borderRadius: 0,
                        // borderWidth: 1,
                        borderColor: 'rgba(0,0,0,0.1)',
                        color: '#FFFFFF',
                    },
                    emphasis: {
                        show: true
                    }
                },
                symbol: 'circle',
                symbolSize: function (val) {
                    return 1;
                },
                itemStyle: {
                    normal: {
                        show: false,
                        color: '#fff',
                        shadowBlur: 10,
                    }
                },
                data: item[1].map(function (dataItem) {
                    return {
                        name: dataItem[0].name,
                        value: geoCoordMap[dataItem[0].name].concat([dataItem[0].value])
                    };
                }),
            },
                //被攻击点
                {
                    type: 'scatter',
                    coordinateSystem: 'geo',
                    zlevel: 2,
                    rippleEffect: {
                        period: 4,
                        brushType: 'stroke',
                        scale: 4
                    },
                    label: {
                        normal: {
                            show: true,
                            position: 'right',
                            color: '#00ffff',
                            formatter: '{b}',
                            textStyle: {
                                color: "#00ffff"
                            }
                        },
                        emphasis: {
                            show: true
                        }
                    },
                    symbol: 'circle',
                    symbolSize: 1,
                    itemStyle: {
                        normal: {
                            color: '#fff',
                            shadowBlur: 1,
                        }
                    },
                    data: [{
                        name: item[0],
                        value: geoCoordMap[item[0]].concat([100]),
                    }],
                }
            );
        });
        let option = {
            geo: {
                map: 'china',
                label: {
                    emphasis: {
                        show: false
                    }
                },
                roam: false,
                layoutCenter: ['50%', '50%'],
                layoutSize: "125%",
                itemStyle: {
                    normal: {
                        areaColor: '##33a3dc',
                        borderWidth: 3,
                        borderColor: '#00FEFF',
                        shadowColor: 'rgba(3,221,255,0.8)',
                        shadowBlur: 30
                    }
                }
            },
            series: series
        };
        myChart.setOption(option)
    },
    methods: {
        test() {
            console.log(test);
        }
    }
}
</script>
<style scoped>
#map {
    margin-top: 40px;
    height: 1000px;
    width: 100%;
}
</style>

数据可视化

当前时间

mounted() {
        let t = null
        t = setTimeout(time, 1000);  // 开始执行
        function time() {
            clearTimeout(t)       // 清楚 定时器
            let dt = new Date()
            let y = dt.getFullYear()
            let mt = dt.getMonth() + 1    // 月份 需要 加一 
            let day = dt.getDate()
            let h = dt.getHours()     // 时
            let m = dt.getMinutes()
            let s = dt.getSeconds();
            document.querySelector(".showTime").innerHTML = "当前时间:" + y + "年" + mt + "月" + day + "日" + h + "时" + m + "分" + s + "秒";
            t = setTimeout(time, 1000)   // 每一秒执行一次
        }
    }
const formatDate = (current_datetime)=>{
      return current_datetime.getFullYear() + "-" + (current_datetime.getMonth() + 1) + "-" + current_datetime.getDate() + " " + current_datetime.getHours() + ":" + current_datetime.getMinutes() + ":" + current_datetime.getSeconds();
    }
let timer = new Date()
  let myDate=timer.toLocaleString()
  console.log(myDate)

给边框加小角

/* 左上角 写一个 小边框 */
/*  before 和 after  智能每次加两个 */
.panel::before {
  position: absolute;
  top: 0;
  left: 0;
  content: "";
  width: 10px;
  height: 10px;
  border-top: 2px solid #02a6b5;
  border-left: 2px solid #02a6b5;
}
.panel::after {
  position: absolute;
  top: 0;
  right: 0;
  content: "";
  width: 10px;
  height: 10px;
  border-top: 2px solid #02a6b5;
  border-right: 2px solid #02a6b5;
}
/*  需要定位 */
/*  在div 里面 在弄一个div */
.panel .panel-footer {
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
}
/* 下 和 左, */
.panel .panel-footer::before {
  position: absolute;
  bottom: 0;
  left: 0;
  content: "";
  width: 10px;
  height: 10px;
  border-bottom: 2px solid #02a6b5;
  border-left: 2px solid #02a6b5;
}
/*  下和右  */
.panel .panel-footer::after {
  position: absolute;
  bottom: 0;
  right: 0;
  content: "";
  width: 10px;
  height: 10px;
  border-bottom: 2px solid #02a6b5;
  border-right: 2px solid #02a6b5;
}
<div class="column">
                <div class="panel">
                    <div class="panel-footer"></div>
                </div>
            </div>


改属性

var pageWidth = window.innerWidth;
var pageHeight = window.innerHeight;

字体

导入
@font-face {
  font-family: electronicFont;
  src: url(../font/DS-DIGIT.TTF);
}
使用
font-family: electronicFont;
  font-weight: bold;


给两个div中间加一条线

.no .no-hd ul li:first-child::after {
  content: "";
  position: absolute;
  height: 50%;
  width: 1px;
  background: rgba(255, 255, 255, 0.2);
  right: 0;
  top: 25%;
}

bar

mounted() {
        let chartDom = document.querySelector(".chart")
        let myChart = echarts.init(chartDom);
        let myData = [120, 132, 101, 134, 90, 230, 310];
        let option = {
            tooltip: {},
            axisTick: {
                alignWidthLabel: true
            },
            tooltip: {
                trigger: "axis",
                axisPointer: {
                    type: "shadow"
                }
            },
            xAxis: {
                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                //  在 那 写 就是那里 使用
                axisLabel: {
                    //  坐标轴的 颜色
                    // color: "red",
                    axisLine: {
                        show: false,
                    }
                },
            },
            yAxis: {
                min: 0,
                max: 400,
                //  操作线
                axisLine: {
                    show: true,
                    lineStyle: {
                        // 字体颜色
                        // color: 'red',
                        width: 0
                    }
                },
                axisLabel: {
                    //  坐标轴的 颜色
                    // color: "red",
                },
                //  分割线的修改
                splitLine: {
                    lineStyle: {
                        color: 'rgba(255,255,255,0.1)'
                    }
                }
            },
            grid: {
                left: "6px",
                top: "50px",
                right: "0",
                bottom: "4%",
                containLabel: true
            },
            series: [{
                name: 'people',
                type: 'bar',
                barWidth: "38%",
                data: myData,
                itemStyle: {
                    barBorderRadius: 5,
                }
            }],
        };
        myChart.setOption(option)
        // 按需缩放
        window.addEventListener('resize', function () {
            myChart.resize();
        })
    }
相关文章
|
1天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
3天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1540 5
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
7天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
577 22
|
3天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
201 3
|
10天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
10天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
571 5
|
23天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
XML 安全 Java
【Maven】依赖管理,Maven仓库,Maven核心功能
【Maven】依赖管理,Maven仓库,Maven核心功能
233 3
|
9天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
327 2