echarts中绘制3D三维地球

简介

echarts中的三维地球,需要用到世界地图json数据,我把json文件放到我的资源中,有需要的自行下载。

安装插件

javascript 复制代码
// 安装echats 
npm install echarts --save
npm install echarts-gl --save

项目中引用

1,引入安装的echarts插件

javascript 复制代码
import * as echarts from 'echarts';
import 'echarts-gl';

2,引入世界地图json文件

javascript 复制代码
import WorldJSON from './world.json'

3,echarts 注册世界地图

javascript 复制代码
//注册世界地图
echarts.registerMap('world', WorldJSON);

绘制3d地球代码

javascript 复制代码
// 绘制3d echarts图表
function draw3Dcharts() {
    let myChart = echarts.init(map.value);
    let geoCoordMap = {
        "海门": [121.15, 31.89],
        "鄂尔多斯": [109.781327, 39.608266],
        "菏泽": [115.480656, 35.23375],
        "合肥": [117.27, 31.86],
        "武汉": [114.31, 30.52],
        "大庆": [125.03, 46.58]
    };
    var alirl = [
        [[121.15, 31.89], [121.48, 31.22]],
        [[120.38, 37.35], [121.48, 31.22]],
        [[123.97, 47.33], [121.48, 31.22]],
        [[118.87, 42.28], [121.48, 31.22]],
        [[121.52, 36.89], [121.48, 31.22]],
        [[102.18, 38.52], [121.48, 31.22]],
        [[118.58, 24.93], [121.48, 31.22]],
        [[120.53, 36.86], [121.48, 31.22]],
        [[119.46, 35.42], [121.48, 31.22]],
        [[119.97, 35.88], [121.48, 31.22]],
        [[121.05, 32.08], [121.48, 31.22]],
        [[ 91.11, 29.97], [121.48, 31.22]]
    ]
    var convertData = function (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)
                });
            }
        }
        return res;
    };
    var baseTexture = null
    // 生成球面纹理
    function getBaseTexture() {
        let canvas = document.createElement('canvas');
        baseTexture = echarts.init(canvas, null , {
            width: 4096,
            height: 2048,
        });
        baseTexture.setOption({
            backgroundColor: '#001213',
            series: [
                {
                    type: 'map',
                    map: 'world',
                    left: 0,
                    top: 0,
                    right: 0,
                    bottom: 0,
                    roam:true,
                    boundingCoords: [
                        [-180, 90],
                        [180, -90],
                    ],
                    label: {
                        show: false,
                        color: '#fff',
                        fontSize: 20,
                    },
                    itemStyle: {
                        areaColor: '#004444',
                        borderColor: '#00cccc',
                        borderWidth: 2,
                    },
                },
            ],
        });
        drawEarth();
    }
    function drawEarth() {
        let option = {
            tooltip: {
                show: true,
            },
            globe: {
                silent: true,
                shading: 'color',
                environment: '#000',
                baseTexture: baseTexture,
                viewControl: {
                    rotateSensitivity: 3, //鼠标旋转灵敏度,设置为0后无法旋转。
                    zoomSensitivity: 0,//鼠标缩放灵敏度
                    autoRotate: true,//自动旋转
                    autoRotateAfterStill: 1,//鼠标停止后多久恢复旋转(为0时暂停后不恢复旋转)
                    //alpha:160,//视角绕 x 轴,即上下旋转的角度
                    //beta:-20,//视角绕 y 轴,即左右旋转的角度。
                    // targetCoord: [75.508268, 18.247872] //定位到哪里
                    // 定位到北京
                    targetCoord: [116.46, 39.92],
                }
            },
            series: [
                //柱状图
                {
                    type: "bar3D",
                    coordinateSystem: 'globe',
                    barSize: 0.5, //柱子粗细
                    shading: 'lambert',
                    opacity: 1,
                    bevelSize: 0.2,
                    itemStyle: {
                        color: '#EBE806',
                        opacity: 0.1
                    },
                    label: {
                        show: false,
                        formatter: '{b}'
                    },
                    data: convertData([
                    {
                        name: "海门",
                        value: (Math.random() * 300).toFixed(2)
                    }, {
                        name: "鄂尔多斯",
                        value: (Math.random() * 300).toFixed(2)
                    }, {
                        name: "招远",
                        value: (Math.random() * 300).toFixed(2)
                    }, {
                        name: "舟山",
                        value: (Math.random() * 300).toFixed(2)
                    }, {
                        name: "齐齐哈尔",
                        value: (Math.random() * 300).toFixed(2)
                    }, {
                        name: "盐城",
                        value: (Math.random() * 300).toFixed(2)
                    }, {
                        name: "赤峰",
                        value: (Math.random() * 300).toFixed(2)
                    }
                    ]),
                },
                {
                    name: 'lines3D',
                    type: 'lines3D',
                    coordinateSystem: 'globe',
                    effect: {
                        show: true,
                        period: 2,
                        trailWidth: 3,
                        trailLength: 0.5,
                        trailOpacity: 1,
                        trailColor: '#0087f4'
                    },
                    blendMode: 'lighter',
                    lineStyle: {
                        // width: 2
                        width: 1,
                        color: '#0087f4',
                        opacity: 0
                    },
                    data: [],
                    silent: false,

                },
                {
                    type: 'lines3D',
                    coordinateSystem: 'globe',
                    effect: {
                        show: true,
                        trailWidth: 5,
                        trailOpacity: 1,
                        trailLength: 0.2,
                        constantSpeed: 5
                    },

                    blendMode: 'lighter',

                    lineStyle: { //航线的视图效果
                        color: '#EBE806',
                        width: 1,
                        opacity: 1
                    },

                    data: alirl
                }
            ]
        };
        for (let i = 0; i < 50; i++) {
            option.series[1].data = option.series[1].data.concat(rodamData())
        }
        myChart.clear();
        myChart.setOption(option, true);
        window.addEventListener('resize', () => {
            myChart.resize();
        });
    }
    function rodamData() {
        let longitude = 105.18
        let longitude2 = Math.random() * 360 - 180
        let latitude = 37.51
        let latitude2 = Math.random() * 180 - 90
        return {
            coords: [
                [longitude2, latitude2],
                [longitude, latitude]
            ],
            value: (Math.random() * 3000).toFixed(2)
        }
    }
    getBaseTexture();
}

效果图展示

相关推荐
熊的猫44 分钟前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
瑶琴AI前端1 小时前
uniapp组件实现省市区三级联动选择
java·前端·uni-app
会发光的猪。1 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
我要洋人死2 小时前
导航栏及下拉菜单的实现
前端·css·css3
科技探秘人3 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人3 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR3 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香3 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
q2498596933 小时前
前端预览word、excel、ppt
前端·word·excel
小华同学ai3 小时前
wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器
前端·钉钉·飞书