IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> threejs + echarts + 加地球 三维展示地图 -> 正文阅读

[JavaScript知识库]threejs + echarts + 加地球 三维展示地图

效果图

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>hujiulong - earth</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            html {
                width: 100%;
                height: 100%;
            }
            body {
                width: 100%;
                height: 100%;
                color: #808080;
                font-family:Monospace;
                font-size:13px;
                text-align:center;
                background-color: #ffffff;
                margin: 0px;
                overflow: hidden;
            }

            #container {
                width: 100%;
                height: 100%;
            }

            #info {
                position: absolute;
                width: 100px;
                right: 0;
                font-size: 14px;
                padding-top: 10px;
            }

            #info > a {
                color: #eee;
                text-decoration: none;
            }
        </style>
    </head>
    <body>
        <div id="info">
            <a href="https://github.com/hujiulong/echarts-three-earth">hujiulong</a>
        </div>
        <div id="container"></div>

        <script src="./libs/three.min.js"></script>
        <script src="./libs/OrbitControls.js"></script>
        <script src="./libs/echarts.min.js"></script>
        <script src="./data/world.js"></script>
        <script src="./data/population.js"></script>
        <script>
            var camera, controls, scene, renderer;

            var raycaster = new THREE.Raycaster();
            var mouse = new THREE.Vector2();

            var directionalLight;

            var earth;

            var mapSize = {
                width: 4096,
                height: 2048
            };
            var mapCanvas, mapTexture;

            init();
            animate();

            // 初始化echarts地图
            function initMap() {

                mapCanvas = document.createElement( 'canvas' );
                mapCanvas.width = mapSize.width;
                mapCanvas.height = mapSize.height;

                mapTexture = new THREE.Texture( mapCanvas );

                var chart = echarts.init ( mapCanvas );

                option = {
                    visualMap: {
                        show: false,
                        min: 0,
                        max: 1000000,
                        text:[ 'High', 'Low' ],
                        realtime: false,
                        calculable: true,
                        inRange: {
                            color: [ 'lightskyblue', 'yellow', 'orangered' ]
                        }
                    },
                    backgroundColor: 'rgb( 255, 255, 255 )',
                    series: [
                        {
                            type: 'map',
                            mapType: 'world',
                            roam: true,
                            aspectScale: 1,
                            layoutCenter: [ '50%', '50%' ],
                            layoutSize: 4096,
                            itemStyle:{
                                emphasis:{ label: { show: true } }
                            },
                            data: population    // from population.js
                        }
                    ]
                };

                chart.setOption( option );
                mapTexture.needsUpdate = true;

                // 选中或移出时才更新贴图
                // 内存向显存上传数据很慢,应该尽量减少贴图更新
                chart.on( 'mouseover', function () {
                    mapTexture.needsUpdate = true;
                } );

                chart.on( 'mouseout', function () {
                    mapTexture.needsUpdate = true;
                } );

            }

            // 初始化three.js场景
            function initScene() {

                var container = document.getElementById( 'container' );

                // 场景
                scene = new THREE.Scene();

                // 相机
                camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
                camera.position.z = -500;

                // 渲染器
                renderer = new THREE.WebGLRenderer();
                renderer.setClearColor( 0x333333 );
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );

                container.appendChild( renderer.domElement );

                // 控制器
                controls = new THREE.OrbitControls( camera, renderer.domElement );
                controls.enableDamping = true;
                controls.dampingFactor = 0.1;
                controls.enablePan = false;
                controls.rotateSpeed = 0.4;

                // 平行光
                directionalLight = new THREE.DirectionalLight( 0xffffff, 0.9 );
                scene.add( directionalLight );

                // 环境光
                var light = new THREE.AmbientLight( 0x202020 );
                scene.add( light );

                // 地球
                var earthGeometry = new THREE.SphereBufferGeometry( 200, 36, 36 );
                var earthMaterial = new THREE.MeshLambertMaterial( { map: mapTexture, color: 0xffffff } );
                earth = new THREE.Mesh( earthGeometry, earthMaterial );

                scene.add( earth );

            }

            function init() {

                initMap();

                initScene();

                window.addEventListener( 'resize', onWindowResize, false );

                container.addEventListener( 'mousemove', onMouseMove, false );

            }


            function onMouseMove( event ) {

                mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
                mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

                raycaster.setFromCamera( mouse, camera );       // 通过鼠标坐标和相机位置构造射线

                var intersected = raycaster.intersectObject( earth );   // 获取射线和地球的相交点

                if ( intersected && intersected.length > 0 ) {

                    // 根据射线相交点的uv反算出在canvas上的坐标
                    var x = intersected[ 0 ].uv.x * mapSize.width;
                    var y = mapSize.height - intersected[ 0 ].uv.y * mapSize.height;

                    // 在mapCanvas上模拟鼠标事件,这里或许有更好的方法
                    var virtualEvent = document.createEvent( 'MouseEvents' );
                    virtualEvent.initMouseEvent( 'mousemove', false, true, document.defaultView, 1, x, y, x, y,false, false, false, false, 0, null );
                    mapCanvas.dispatchEvent(virtualEvent);
                    
                }


            }

            function onWindowResize() {

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

            }

            function animate() {

                requestAnimationFrame( animate );       // 循环渲染

                controls.update();

                render();

            }

            function render() {

                // 平行光始终从相机位置照向地球
                directionalLight.position.copy( camera.position )
                renderer.render( scene, camera );

            }
        </script>

    </body>
</html>

文件不上传了,有需要可以私聊。
更多可以了解下:https://github.com/ecomfe/echarts-gl
网盘里面存储名字:echarts+threejs+earth

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:20:07  更:2022-02-28 15:23:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:37:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码