echart实现世界地图+气泡标注+自定义tooltip

3,449 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情 小颖博客原文: echart实现世界地图+气泡标注+自定义tooltip 

闲聊:

最近小颖做的项目中有echats相关需求,所以小颖整合个笔记,俗话说好记性不如烂笔头,记录下来也方便日后查看,先来看下效果图

效果图:

 具体代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>世界地图</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        html,
        body {
            width: 100%;
            height: 100%;
        }

        body {
            background: url(./img/bg.png) center no-repeat;
            background-size: 100% 100%;
            overflow: hidden;
        }
    </style>
</head>

<body>
    <div id="mainBox" style="width: 100%;height: 100%;"></div>
</body>
<script src="./js/echarts.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="./utils/world.json"></script>
<script type="text/javascript" src="./utils/country-name-zh.json"></script>
<script>
    var myChart = echarts.init(document.getElementById('mainBox'));
    var imgPath = 'image://img/sympol.png';
    var asia = [
        {
            name: "美国",
            value: [-73.97622, 40.757498],
            egName: 'America',
            area: '9370000 km²',
            capital: '华盛顿哥伦比亚特区'
        },
        {
            name: "加拿大",
            value: [-109.404347, 60.638178],
            egName: 'Canada',
            area: '9980000 km²',
            capital: '渥太华'
        },
        {
            name: "澳大利亚",
            value: [137.708144, -25.328065],
            egName: 'Australia',
            area: '7692000 km²',
            capital: '堪培拉'
        },
        {
            name: "中国",
            value: [116.512885, 39.847469],
            egName: 'China',
            area: '9634057 km²',
            capital: '华盛顿哥伦比亚特区'
        },
    ];
    echarts.registerMap('world', worldJson);
    var option = {
        tooltip: {
            trigger: 'item',
            showContent: true,//是否显示提示框浮层,默认显示
            alwaysShowContent: false,//是否永远显示提示框内容,默认情况下在移出可触发提示框区域后 一定时间 后隐藏,设置为 true 可以保证一直显示提示框内容
            hideDelay: 0,//鼠标移出坐标点时,浮层隐藏的延迟时间,单位为 ms,在 alwaysShowContent 为 true 的时候无效
            formatter: function (params, ticket, callback) { return '' }
        },
        geo: {
            map: 'world', //引入地图数据
            roam: true, //开启缩放和平移
            show: true,//是否显示地理坐标系组件
            zoom: 1, //视角缩放比例
            nameMap: nameMapZh,
            label: {
                show: false,//是否显示标签。
            },
            itemStyle: {
                areaColor: '#5470c6',//地图区域的颜色。
                borderColor: '#0a53e9', //线
                shadowColor: '#092f8f', //外发光
                shadowBlur: 20
            },
            emphasis: { //高亮状态下的显示设置
                itemStyle: {
                    areaColor: "#0a2dae", //鼠标选择区域颜色
                    shadowOffsetX: 0,
                    shadowOffsetY: 0,
                    shadowBlur: 20,
                    borderWidth: 0,
                    shadowColor: "rgba(0, 0, 0, 0.5)",
                }
            }
        },
        // 鼠标悬浮提示框
        series: [
            {
                name: "国家",
                type: "map",
                selectedMode: false,//关闭点击地图时显示黄色
                geoIndex: 0,
            },
            {
                name: "Icon",
                type: 'scatter',
                coordinateSystem: 'geo',
                animation: false,//坐标点是否显示动画
                symbol: imgPath,//标记的图形。
                symbolSize: [32, 41],//标记的大小
                symbolOffset: [0, -15],//标记相对于原本位置的偏移
                label: {
                    formatter: '{b}',
                    position: 'right',
                    show: true,//是否显示地名
                    color: '#fff',
                },
                z: 9,
                data: asia.length > 0 ? asia : [],
                tooltip: {//仅在 options中最外层的 tooltip.trigger 为 'item'时有效
                    position: 'bottom',//提示框位置
                    backgroundColor: "rgba(185,197,218,0.8)", //设置背景图片 rgba格式
                    borderColor: '#9a9c9d',
                    textStyle: {
                        color: '#fff'
                    },
                    formatter: function (params, ticket, callback) {
                        var _dt = params.data;
                        if (params.data) {
                            var strHtml = '<div>';
                            strHtml += '<table class="table">';
                            strHtml += '<tr><td colspan="2" style="text-align:center">国家简介</td></tr>';
                            strHtml += '<tr><td>中文名称:</td><td>' + _dt.name + '</td></tr>';
                            strHtml += '<tr><td>英文名称:</td><td>' + _dt.egName + '</td></tr>';
                            strHtml += '<tr><td>首都:</td><td>' + _dt.capital + '</td></tr>';
                            strHtml += '<tr><td>国土面积:</td><td>' + _dt.area + '</td></tr>';
                            strHtml += '</table>';
                            strHtml += '</div>'
                            return strHtml;
                        }
                    }
                }
            }
        ],
    }
    myChart.setOption(option);
    myChart.off('click') //图表渲染前销毁点击事件
    myChart.on("click", function (params) {
        if (params.data) {
            alert('我点击的是:' + params.data.name)
        }
    })
</script>

</html>

引用的js和json文件请移步到小颖的博客

解释:

两个  tooltip  

第一个主要是为了让数据中的  tooltip  展示,如果不设置第一个则数据中的 tooltip  无法展示,所以第一个的 tooltip   返回值为空,实现了鼠标悬浮时只有有数据的才会展示 tooltip    

如果需要对地图的点击事件做处理则在:

    myChart.on("click", function (params) {
        if (params.data) {
            alert('我点击的是:' + params.data.name)
        }
    })

中处理

为了防止点击事件触发好几次,并且获取点击数据混乱则需加上:

    myChart.off('click') //图表渲染前销毁点击事件

也是问度娘的哈哈,因为小颖在看之前的代码发现点击事件触发好几次,而且拿的数据也不对,然后百度到的解决方式

series中设置了 两种 type

type: "map",渲染世界地图,type: 'scatter',根据经纬度数据给想要的位置加气泡,并且鼠标悬浮时能展示其详细信息。