Echarts做地图,将每个省的数据标记在地图上,根据数据的大小做散点方大效果,并筛选前五个最大省份进行展示(经常有这种需求,看自己的代码跟屎一样,本文只做记录,)

效果

请添加图片描述

js代码

function loadMap() {
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById('mapChart'));

    var nameColor = " rgb(55, 75, 113)"
    var name_fontFamily = '宋体'
    var name_fontSize = 35
    var mapName = 'china'
    // var data = []
    //用于存储地图数据
    var geoCoordMap = {};
    //划上地图以后的显示
    var toolTipData = [];

    /*获取地图数据*/
    myChart.showLoading();
    var mapFeatures = echarts.getMap(mapName).geoJson.features;
    myChart.hideLoading();
    var data;
    $.ajax({
        // url: ajaxBaseUrl + "data/event-distributed.json",
        url: bigApi.regionalDistributionOfSurveyData,
        dataType: "json"
    }).done(function () {
        $("#block5").addClass("chart-done");
    }).done(function (back) {
        if (back.status == '0') {
            data = back.result;
            console.log("ssss");
            console.log(back);


            data.forEach(function (v) {
                //地区名称
                var name = v.name;
                toolTipData.push({
                    name: name,
                    value: [{
                        name: "问卷数量",
                        value: v.value + '份'
                    }, {
                        name: "播种总面积",
                        value: v.bzmj + '亩'
                    }, {
                        name: "总产量",
                        value: v.amount + '吨'
                    }, {
                        name: "总收入",
                        value: v.money + '万元'
                    }]
                })
                // toolTipData.push({
                //     name: name,
                //     value: [{
                //         name: "111",
                //         value: v.value + '份'
                //     }]
                // })
            })
            mapFeatures.forEach(function (v) {
                // 地区名称
                var name = v.properties.name;
                // 地区经纬度
                geoCoordMap[name] = v.properties.cp;
            });
            // console.log("555")
            // console.log(data);
            var max = 480,
                min = 9; // todo
            var maxSize4Pin = 50,
                minSize4Pin = 20;

            var convertData = function (data) {
                // console.log("666");
                // console.log(data);
                var res = [];
                for (var i = 0; i < data.length; i++) {
                    var geoCoord = geoCoordMap[data[i].name];
                    if (geoCoord) {
                        res.push({
                            name: data[i].name,
                            value: geoCoord.concat(data[i].value),
                        });
                    }
                }
                // console.log("2222");
                // console.log(res);
                return res;
            };

            option = {
                title: {
                    text: '调查数据区域分布',
                    // subtext: 'data from PM25.in',
                    // sublink: 'http://www.pm25.in',
                    left: 'center',
                    textStyle: {
                        fontWeight: 'normal',
                        color: '#fff',
                        fontSize: 25
                    }
                },
                tooltip: {
                    //鼠标划上去以后显示的提示
                    trigger: 'item',
                    formatter: function (params) {
                        if (typeof (params.value)[2] == "undefined") {
                            var toolTiphtml = ''
                            for (var i = 0; i < toolTipData.length; i++) {
                                if (params.name == toolTipData[i].name) {
                                    toolTiphtml += toolTipData[i].name + ':<br>'
                                    for (var j = 0; j < toolTipData[i].value.length; j++) {
                                        toolTiphtml += toolTipData[i].value[j].name + ':' + toolTipData[i].value[j].value + "<br>"
                                    }
                                }
                            }
                            // console.log(toolTiphtml)
                            // console.log(convertData(data))
                            return toolTiphtml;
                        } else {
                            var toolTiphtml = ''
                            for (var i = 0; i < toolTipData.length; i++) {
                                if (params.name == toolTipData[i].name) {
                                    toolTiphtml += toolTipData[i].name + ':<br>'
                                    for (var j = 0; j < toolTipData[i].value.length; j++) {
                                        toolTiphtml += toolTipData[i].value[j].name + ':' + toolTipData[i].value[j].value + "<br>"
                                    }
                                }
                            }
                            // console.log(toolTiphtml)
                            // console.log(convertData(data))
                            return toolTiphtml;
                        }
                    }
                },
                legend: {
                    //图例
                    orient: 'vertical',
                    y: 'bottom',
                    x: 'right',
                    data: ['credit_pm2.5'],
                    textStyle: {
                        color: '#fff'
                    }
                },
                visualMap: {
                    show: false,
                    min: 0,
                    max: 600,
                    left: 'left',
                    top: 'bottom',
                    text: ['高', '低'], // 文本,默认为数值文本
                    calculable: true,
                    seriesIndex: [1],
                    //控制地图颜色的显示区间
                    inRange: {
                        // color: ['#3B5077', '#031525'] // 蓝黑
                        // color: ['#ffc0cb', '#800080'] // 红紫
                        // color: ['#3C3B3F', '#605C3C'] // 黑绿
                        //  color: ['#0f0c29', '#302b63', '#24243e'] // 黑紫黑
                        // color: ['#23074d', '#cc5333'] // 紫红
                        // color: ['#00467F', '#A5CC82'] // 蓝绿
                        // color: ['#1488CC', '#2B32B2'] // 浅蓝
                        // color: ['#00467F', '#A5CC82', '#ffc0cb'] // 蓝绿红
                        // color: ['#00467F', '#A5CC82'] // 蓝绿
                        // color: ['#00467F', '#A5CC82'] // 蓝绿
                        // color: ['#00467F', '#A5CC82'] // 蓝绿
                        color: ['#22e5e8', '#0035f9', '#22e5e8'] // 蓝绿

                    }
                },
                /*工具按钮组,导出图片等按钮组*/
                toolbox: {
                    show: false,
                    orient: 'vertical',
                    left: 'right',
                    top: 'center',
                    feature: {
                        dataView: {
                            readOnly: false
                        },
                        restore: {},
                        saveAsImage: {}
                    }
                },
                geo: {
                    //地图的初始配置
                    show: true,
                    map: mapName,
                    label: {
                        normal: {
                            show: false
                        },
                        emphasis: {
                            show: false
                        }
                    },
                    roam: false,
                    itemStyle: {
                        normal: {
                            areaColor: '#F2F2F2',//地图没有数据的时候的颜色0A4579
                            // areaColor: '#0A4579',//地图没有数据的时候的颜色
                            borderColor: '#097bba'
                        },
                        emphasis: {
                            // areaColor: '#2B91B7' //鼠标划上去的时候颜色
                            areaColor: '#8389E0'

                        }
                    }
                },
                series: [{
                	//对有数据的省份画点
                    name: '散点',
                    type: 'scatter',
                    coordinateSystem: 'geo',
                    data: convertData(data),
                    symbolSize: function (val) {
                        //用来设置每个省份圆圈的大小
                        return val[2] / 6;
                    },
                    label: {
                        show: false,
                        normal: {
                            formatter: '{b}',
                            position: 'right',
                            show: false,//是否显示省份的名称
                        },
                        emphasis: {
                            show: false
                        }
                    },
                    itemStyle: {
                        normal: {
                            color: 'rgba(255,255,0,0.8)'
                        }
                    }
                },
                {
                    type: 'map',
                    map: mapName,
                    geoIndex: 0,
                    aspectScale: 0.75, //长宽比
                    showLegendSymbol: false, // 存在legend时显示
                    label: {
                        normal: {
                            show: true
                        },
                        emphasis: {
                            show: false,
                            textStyle: {
                                color: '#fff'
                            }
                        }
                    },
                    roam: true,
                    itemStyle: {
                        normal: {
                            areaColor: '#031525',
                            borderColor: '#3B5077',
                        },
                        emphasis: {
                            areaColor: '#2B91B7'
                        }
                    },
                    animation: false,
                    data: data
                },
                {
                    name: '点',
                    type: 'scatter',
                    coordinateSystem: 'geo',
                    symbol: 'pin', //气泡
                    symbolSize: function (val) {
                        var a = (maxSize4Pin - minSize4Pin) / (max - min);
                        var b = minSize4Pin - a * min;
                        b = maxSize4Pin - a * max;
                        return a * val[2] + b;
                    },
                    label: {
                        normal: {
                            show: true,
                            formatter: function (params) {
                                // console.log("aaa");
                                // console.log(params);
                                return params.value[2]
                            },
                            textStyle: {
                                color: '#fff',
                                fontSize: 9,
                            }
                        }
                    },
                    itemStyle: {
                        normal: {
                            color: 'rgba(255,255,0,0)', //标志颜色
                        }
                    },
                    zlevel: 6,
                    data: convertData(data),
                },
                {
                    name: 'Top 5',//用于显示最高的前五个数据
                    type: 'effectScatter',
                    coordinateSystem: 'geo',
                    data: convertData(data.sort(function (a, b) {
                        return b.value - a.value;
                    }).slice(0, 5)),
                    symbolSize: function (val) {
                        return val[2] / 5;
                    },
                    showEffectOn: 'render',
                    rippleEffect: {
                        brushType: 'stroke'
                    },
                    hoverAnimation: true,
                    label: {
                        normal: {
                            formatter: '{b}',
                            position: 'right',
                            show: true
                        }
                    },
                    itemStyle: {
                        normal: {
                            color: 'rgba(255,255,0,0.8)',
                            shadowBlur: 10,
                            shadowColor: '#05C3F9'
                        }
                    },
                    zlevel: 1
                },

                ]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);

        } else {
            return;
        }
    }).fail(function (jqXHR) {
        console.log("Ajax Fail: ", jqXHR.status, jqXHR.statusText);
    });
    // var data = [
    //     {
    //         "name": "安徽",
    //         "value": "47"
    //     },
    //     {
    //         "name": "贵州",
    //         "value": "46"
    //     },
    //     {
    //         "name": "河北",
    //         "value": "89"
    //     },
    //     {
    //         "name": "重庆",
    //         "value": "78"
    //     }];


    window.addEventListener("resize", function () {
        myChart.resize();
    });
}


部分代码解释

关于geoCoordMap 地图经纬度数据

    //用于存储地图数据
    var geoCoordMap = {};

geoCoordMap类似json, 其键为省份的名称;值为数组,代表对应的经纬度

在这里插入图片描述

本例代码中data 数据

data = back.result;

此例中的data为对象组成的数组,每个对象包含几个键值,详细如下
在这里插入图片描述

关于convertData函数的作用

 var convertData = function (data) {
     // console.log("666");
     // console.log(data);
     var res = [];
     for (var i = 0; i < data.length; i++) {
     	 //通过数据中的name值,得到其对应的经纬度,
         var geoCoord = geoCoordMap[data[i].name];
         //如果存在当前省份的经纬度
         if (geoCoord) {
         	//下列各式为name:"福建",value:[经度,维度,福建省的数据]
             res.push({
                 name: data[i].name,
                 value: geoCoord.concat(data[i].value),
             });
         }
     }
     // console.log("2222");
     // console.log(res);
     return res;
 };

看一下最终的res的值
在这里插入图片描述

关于tooltip组件

tooltip: {
    //鼠标划上去以后显示的提示
    trigger: 'item',
    formatter: function (params) {
        if (typeof (params.value)[2] == "undefined") {
            var toolTiphtml = ''
            for (var i = 0; i < toolTipData.length; i++) {
                if (params.name == toolTipData[i].name) {
                    toolTiphtml += toolTipData[i].name + ':<br>'
                    for (var j = 0; j < toolTipData[i].value.length; j++) {
                        toolTiphtml += toolTipData[i].value[j].name + ':' + toolTipData[i].value[j].value + "<br>"
                    }
                }
            }
            // console.log(toolTiphtml)
            // console.log(convertData(data))
            return toolTiphtml;
        } else {
            var toolTiphtml = ''
            for (var i = 0; i < toolTipData.length; i++) {
                if (params.name == toolTipData[i].name) {
                    toolTiphtml += toolTipData[i].name + ':<br>'
                    for (var j = 0; j < toolTipData[i].value.length; j++) {
                        toolTiphtml += toolTipData[i].value[j].name + ':' + toolTipData[i].value[j].value + "<br>"
                    }
                }
            }
            // console.log(toolTiphtml)
            // console.log(convertData(data))
            return toolTiphtml;
        }
    }
},
  • formatter中params参数

鼠标滑到省份的轮廓(不正好是那个点)

注意参数中value的区别
在这里插入图片描述

在这里插入图片描述

如果鼠标正好滑到的是那个省份点

在这里插入图片描述

注意参数中value的区别
在这里插入图片描述

这一部分当中的if else主要用来判断数据的有无,因为有的省份没有数据,如果没有数据就不显示了

关于带有涟漪特效动画的散点(气泡)图

name: 'Top 5',//用于显示最高的前五个数据
type: 'effectScatter',
coordinateSystem: 'geo',
data: convertData(data.sort(function (a, b) {
    return b.value - a.value;
}).slice(0, 5)),
symbolSize: function (val) {
    return val[2] / 5;
},
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值