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();
}

效果图展示

相关推荐
腾讯TNTWeb前端团队3 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰7 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪7 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪7 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy8 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom8 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom8 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom8 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom8 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom9 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试