echarts 3D earth实时攻击 线路图

echarts 3D 透明地球

需求

3D earth
透明度效果
坐标数据的涟漪扩散效果

效果图

星空背景 地球带有透明度

第三方插件

<script type="text/javascript" src="js/echarts.min.js"></script>
<script type="text/javascript" src="js/echarts-gl.min.js"></script>
<script type="text/javascript" src="js/world.js"></script>

这个插件在echarts官网都有,直接下载就可以了,传送门

html

<div id="container" style="height:100%;box-sizing: border-box;"></div>

css

body{
            background:url('img/bg12.png');
            background-size: cover;
            height: 100%;
        }

数据处理

 /*
    图中相关城市经纬度,根据你的需求添加数据
    关于国家的经纬度,可以用首都的经纬度或者其他城市的经纬度
    */
    var geoCoordMap = {
        '南宁': [108.479, 23.1152],
        '广州': [113.5107, 23.2196],
        '重庆': [107.7539, 30.1904],
        '芬兰': [24.909912, 60.169095], 
        '美国': [-100.696295, 33.679979], 
        '日本': [139.710164, 35.706962], 
        '韩国': [126.979208, 37.53875], 
        '瑞士': [7.445147, 46.956241],
        '东南亚': [117.53244, 5.300343], 
        '澳大利亚': [135.193845, -25.304039], 
        '德国': [13.402393, 52.518569], 
        '英国': [-0.126608, 51.208425], 
        '加拿大': [-102.646409, 59.994255]
    };

    /* 
        记录下起点城市和终点城市的名称,以及权重
        数组第一位为终点城市,数组第二位为起点城市,以及该城市的权重,就是图上圆圈的大小
     */

    var CQData = [
        [{name: '重庆'}, {name: "英国",value: 70}]
    ];

    var GZData = [
        [{name: '广州'}, {name: "日本",value: 30}],
    ];

    var NNData = [
        [{name: '南宁'}, {name: "加拿大",value: 80}],
        [{name: '南宁'}, {name: "美国",value: 100}],
        [{name: '南宁'}, {name: "澳大利亚",value: 95}],
        [{name: '南宁'}, {name: "瑞士",value: 50}]
    ];

    var convertData = function(data) {
        var res = []; 
        for(var i = 0; i < data.length; i++) {
            var dataItem = data[i];
            var fromCoord = geoCoordMap[dataItem[1].name];
            var toCoord = geoCoordMap[dataItem[0].name];
            if(fromCoord && toCoord) {
                res.push([fromCoord, toCoord])
            }
        }
        console.log(res)
        return res;
    }

    var series = [];// 3D飞线
    var dser = [];  // 2D散点坐标
    [['重庆', CQData],['广州', GZData],['南宁', NNData]].forEach(function(item, i) {
        dser.push({ 
        type: 'effectScatter',         
        coordinateSystem: 'geo', 
        zlevel: 3,
        rippleEffect: {
            brushType: 'stroke' 
        },
        label: {
            fontSize:24,  
            show: true,
            position: 'right', 
            formatter: '{b}'  
        },
        itemStyle: {
            normal: {
                color: '#f5f802'
            }
        },
        data: item[1].map(function(dataItem) {
            return {
                name: dataItem[1].name,
                value: geoCoordMap[dataItem[1].name],
                symbolSize: dataItem[1].value / 4
            };
        })
    },{
        type: 'effectScatter',
        coordinateSystem: 'geo',
        zlevel: 3,
        rippleEffect: {
            brushType: 'stroke'
        },
        label: {
            normal: {
                show: true,
                position: 'left',
                fontSize:18,
                formatter: '{b}'
            }
        },
        itemStyle: {
            normal: {
                color: '#ff0000'
            }
        },
        data: [{
            name: item[0],
            value: geoCoordMap[item[0]],
            symbolSize:parseInt(Math.random()*20+10),
            label: {
                normal: {
                    position: 'right'
                }
            }
        }]
    })
    series.push({
            type: 'lines3D',
            effect: {
                show: true,
                period: 3,//速度
                trailLength: 0.1//尾部阴影          
            },
            lineStyle: {//航线的视图效果
                color: '#9ae5fc',
                width: 1,
                opacity: 0.6
            },
            data: convertData(item[1])// 特效的起始、终点位置,一个二维数组,相当于coords: convertData(item[1])
        })
    });

地球的皮肤

	var canvas = document.createElement('canvas');
   
    var myChart = echarts.init(canvas, null, {
        width: 4096,
        height: 2048
    });
    myChart.setOption({
	    backgroundColor: 'rgba(3,28,72,0.3)',
	    title: {
	        show:true
	    },
	    geo: {
	        type: 'map',
	        map: 'world',
	        left:0,
	        top:0,
	        right: 0,
	        bottom: 0,
	        boundingCoords: [[-180, 90], [180, -90]],
	        zoom:0,
	        roam: false,
	        itemStyle: {
	            borderColor:'#000d2d',
	            normal: {
	                areaColor: '#2455ad',
	                borderColor:'#000c2d'
	            },
	            emphasis: {
	                areaColor: '#357cf8' 
	            }
	        },
	        label:{
	            fontSize:24
	        }
	    },
	    series:dser
	});

3D地球

var option = {
        backgroundColor: 'rgba(0,0,0,0)',//canvas的背景颜色
        globe: {
            baseTexture:myChart,
            top: 'middle',
            left: 'center',
            displacementScale: 0,
            environment:'none',
            shading: 'color',
            viewControl: {
                distance:240,
                autoRotate: true
            }
        },
        roam: true,
        series:series
    };

    echarts.init(document.getElementById("container")).setOption(option, true);

这样一款3D实时攻击的效果就出来了 后期把数据替换为后台数据就OK了

猜你喜欢

转载自blog.csdn.net/zhai_865327/article/details/83145140