在react中使用echarts地图(带攻击线)

在react中使用echarts地图(带攻击线)

//可以按需引入
import React, { Component } from 'react';
import echarts from 'echarts/lib/echarts';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/title';
import 'echarts/lib/component/visualMap';
import 'echarts/lib/chart/map';
import 'echarts/lib/chart/bar';
import 'echarts/map/js/china';
import { Modal, Table } from 'tinper-bee';
import sort from 'css-select/lib/sort';
import 'echarts/lib/chart/line';
import 'echarts/lib/chart/gauge';
import 'echarts/lib/chart/pie';
  • react中部分代码如下:
var geoCoordMap = {
    '上海': [121.4648, 31.2891],
    '合肥': [117.29, 32.0581],
    '北京': [116.4551, 40.2539],
    '南京': [118.8062, 31.9208],
    };
var BJData = [
    [{
        name: '上海',
        value: 327
    }, {
        name: '南京'
    }],
];
var NJData = [
    [{
        name: '南京'
    }, {
        name: '上海',
        value: 327
    }],
];
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],
    ["南京", NJData]
].forEach(function (item, i) {
    series.push({
        type: "lines",
        zlevel: 2,
        effect: {
            show: true,
            period: 4, //箭头指向速度,值越小速度越快
            trailLength: 0.02, //特效尾迹长度[0,1]值越大,尾迹越长重
            symbol: "arrow", //箭头图标
            symbolSize: 5 //图标大小
        },
        lineStyle: {
            normal: {
                width: 1, //尾迹线条宽度
                opacity: 0, //尾迹线条透明度
                curveness: 0.3 //尾迹线条曲直度
            }
        },

        data: convertData(item[1])
    }, {
            type: "effectScatter",
            coordinateSystem: "geo",
            zlevel: 2,
            rippleEffect: {
                //涟漪特效
                period: 4, //动画时间,值越小速度越快
                brushType: "stroke", //波纹绘制方式 stroke, fill
                scale: 4 //波纹圆环最大限制,值越大波纹越大
            },
            label: {
                normal: {
                    show: true,
                    position: "right", //显示位置
                    offset: [5, 0], //偏移设置
                    formatter: "{b}" //圆环显示文字
                },
                emphasis: {
                    show: true
                }
            },
            symbol: "circle",
            symbolSize: function (val) {
                return 4 + val[2] / 1000; //圆环大小
            },
            itemStyle: {
                normal: {
                    show: false,
                }
            },
            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: "#0bc7f3"
                    }
                },
                emphasis: {
                    show: true
                }
            },
            symbol: "pin",
            symbolSize: 30,
            itemStyle: {
                normal: {
                    show: true,
                    color: "#9966cc"
                }
            },
            data: [{
                name: item[0],
                value: geoCoordMap[item[0]].concat([100])
            }]
        }
    );
});

class new_page4 extends React.Component {
    componentDidMount() {
        this.chart0()
    }
    chart0() {
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));
        // 绘制图表
        var option = {
            backgroundColor: '#000',
            tooltip: {
                trigger: "item",
                backgroundColor: "#1540a1",
                borderColor: "#FFFFCC",
                showDelay: 0,
                hideDelay: 0,
                enterable: true,
                transitionDuration: 0,
                extraCssText: "z-index:100",
                formatter: function(params, ticket, callback) {
           	    //根据业务自己拓展要显示的内容
           	    var res = "";
                var name = params.name;
                var value = params.value[params.seriesIndex + 1];
                res =
                    "<span style='color:#fff;'>" +
                    name +
                    "</span><br/>人数:" + value;
               return res;
               }  
            },
            toolbox: {
                show: true,
                feature: {
                    saveAsImage: {
                        show: true,
                        excludeComponents: ['toolbox'],
                        pixelRatio: 2
                    }
                }
            },
            visualMap: {
                //图例值控制
                min: 0,
                max: 10000,
                show: false,
                calculable: true,
                color: ["#0bc7f3"],
                textStyle: {
                    color: "#fff"
                },
            },
            geo: {
                map: "china",
                label: {
                    emphasis: {
                        show: false
                    }
                },
                roam: true, //是否允许缩放
                layoutCenter: ["50%", "50%"], //地图位置
                layoutSize: "180%",
                itemStyle: {
                    normal: {
                        color: "#04284e", //地图背景色
                        borderColor: "#5bc1c9" //省市边界线
                    },
                    emphasis: {
                        color: "rgba(37, 43, 61, .5)" //悬浮背景
                    }
                }
            },
            series: series
        };
        myChart.setOption(option);
    }
    render() {
        return (
            <div>
                <span id="main" style={{ width: 1000, height: 1000 }}></span>
            </div>
        );
    }
}

  • 直接引入时会报如下错误:
    在react中使用echarts地图(带攻击线)
  • 获取不到value的数组内容,将如下代码修改即可:
      formatter: function(params, ticket, callback) {
           	    //根据业务自己拓展要显示的内容
           	    var res = "";
                var name = params.name;
                var value = params.value[params.seriesIndex + 1];
                res =
                    "<span style='color:#fff;'>" +
                    name +
                    "</span><br/>人数:" + value;
               return res;
               } 

修改为:

 formatter: function (params) {
                    console.log('000', params);
                    //根据业务自己拓展要显示的内容
                    var res = "";
                    var name = params.name;
                    var value = params.data.value ? params.data.value[2] : [];
                    if (value) {
                        res =
                            "<span style='color:#fff;'>" +
                            name +
                            "</span><br/>人数:" + value;
                    } else {
                        res =
                            "<span style='color:#fff;'>" +
                            " " +
                            "</span><br/>人数:" + undefined;
                    }
                    //console.log('ddd',value);
                    return res;
                }
  • 效果如下图:
  • 在react中使用echarts地图(带攻击线)