当前位置: 首页 > news >正文

echarts 绘制3D中国地图

一、项目背景

本项目基于 ECharts 和 ECharts-GL 实现了一个3D中国地图的可视化页面,支持地图区域高亮、涟漪散点、动态飞线等效果,适用于地理数据展示、流向分析等场景。

二、效果图

  • 3D中国地图,带有地形贴图和立体边界。
  • 主要城市以涟漪散点高亮显示。
  • 城市间流向以动态飞线展示,直观表现数据流动。
    在这里插入图片描述

三、实现过程

1. 技术选型

  • ECharts:强大的数据可视化库,支持丰富的图表类型和地理可视化。
  • ECharts-GL:ECharts 的 3D 扩展,支持三维地图、三维柱状图等高级可视化效果。
  • Vue.js:前端主流框架,负责页面结构和生命周期管理。

2. 地图数据准备

使用了 china.json 作为中国地图的 GeoJSON 数据源,放置于 src/utils/china.json。
贴图采用了 map.svg,增强地图的地形感和美观度。
点击这里获取中国地图json

3. 主要实现步骤

(1)地图注册与初始化

在 mounted 钩子中,注册中国地图并初始化 ECharts 实例:

import * as echarts from 'echarts'
import "echarts-gl";
import geoJson from '@/utils/china.json'mounted() {//点击散点城市坐标位置const chinaData = [{ name: '北京市', value: [116.405285, 39.904989] },{ name: '成都', value: [104.0657, 30.6598] },{ name: '上海', value: [121.4737, 31.2304] },{ name: '拉萨', value: [91.11, 29.97] }];const myChart = echarts.init(document.getElementById('mapContainer'));this.initChart('china', chinaData, myChart)
}
(2)3D地图与贴图

使用 geo3D 配置项实现三维地图。
通过 colorMaterial.detailTexture 属性,将2D地图渲染为纹理贴图,贴在3D地图表面,提升真实感。

因3d地图无法实现散点效果,故此采用3d和2d贴合实现,散点效果

geo3D: {map: 'china',regionHeight: 2.1,shading: 'color',colorMaterial: {detailTexture: mapBg, // 纹理贴图textureTiling: 1},// ... 视角、边界等配置
}
(3)下层地图与分层效果

通过 series 添加 map3D 类型,设置不同的 regionHeight,实现地图分层立体感。

(4)2D地图贴图生成

LoadMapping 方法生成2D地图配置,主要用于生成纹理贴图。
贴图采用 SVG 图像,提升地图的美观度和辨识度。

itemStyle: {areaColor: {type: 'pattern',image: require('../assets/images/map.svg'),repeat: 'no-repeat',},
}
(5)涟漪散点与飞线

使用 effectScatter 实现城市位置的涟漪散点动画。
使用 lines 实现城市之间的动态飞线,模拟流向效果。

{type: `effectScatter`,coordinateSystem: `geo`,rippleEffect: { period: 5, scale: 4, brushType: 'fill' },itemStyle: { normal: { color: 'yellow', shadowBlur: 10, shadowColor: '#333' } },symbolSize: 16,data: [ ... ]
},
{type: 'lines',effect: { show: true, period: 4, trailLength: 0.4, symbol: 'arrow', symbolSize: 7 },lineStyle: { normal: { color:'#1DE9B6', width: 3, opacity: 0.6, curveness: .3 } },data: [ ... ]
}
(6)完整代码
<template><div><div style="width: 100%; height: 100%;"><div class="contanier"></div><div ref="mapContainer" id="mapContainer" style="width: 100%; height: 100vh;"></div></div></div>
</template>
<script>
import * as echarts from 'echarts'
import "echarts-gl";
import geoJson from '@/utils/china.json'
export default {data() {},mounted() {const chinaName = 'china';const chinaData = [{ name: '北京市', value: [116.405285, 39.904989] },{ name: '成都', value: [104.0657, 30.6598] },{ name: '上海', value: [121.4737, 31.2304] },{ name: '拉萨', value: [91.11, 29.97] }];const myChart = echarts.init(document.getElementById('mapContainer'));this.initChart('china', chinaData, myChart)},methods: {initChart(name, data, myChart) {// const myChart = echarts.init(this.$refs.mapContainer);echarts.registerMap("china", geoJson); // 注册地图const canvas = document.createElement(`canvas`);var mapBg = echarts.init(canvas, null, {width: 1024,height: 1024,});const chartOption = this.LoadMapping(name);mapBg.setOption(chartOption);let option = {backgroundColor: '#000000',// 上层geo3D: {map: 'china',regionHeight: 2.1, //地图厚度label: {show: false,color: '#fff',},itemStyle: {borderWidth: 1, //分界线宽度borderColor: '#fff', //分界线颜色},emphasis: {label: {show: false,},},shading: 'color', // lambert  color  realistic  只有为color时,可以设置colorMaterial,实现将平面地图贴在3D地图上colorMaterial: {detailTexture: mapBg, // 纹理贴图textureTiling: 1 // 纹理平铺,1是拉伸,数字表示纹理平铺次数},viewControl: {distance: 90, // 地图视角 控制初始大小beta: 0, //旋转视角alpha: 90, //视角center: [0, 0, 0],},},series: [// 下层{type: "map3D",map: "china",regionHeight: 2, //地图厚度label: {show: false,color: '#ff000000',},itemStyle: {normal: {color: "rgba(52, 299, 218, 1)",}},viewControl: {distance: 90, // 地图视角 控制初始大小beta: 0, //旋转视角alpha: 90, //视角center: [0, 0, 0],},},],}myChart.setOption(option, true);},// 2D地图LoadMapping(name) {var chartOption = {geo: {show: true,map: name,top: '0',width: 1024,label: {position: 'top',distance: 4,normal: {show: true,textStyle: {color: '#fff'}},},itemStyle: {areaColor: {type: 'pattern',image: require('../assets/images/map.svg'), // 贴图(山形地貌图)repeat: 'no-repeat',},},},series: [{type: `effectScatter`,  // 散点, scatter不能实现涟漪效果coordinateSystem: `geo`,showEffectOn: 'render',zlevel: 5,rippleEffect: {period: 5,scale: 4,brushType: 'fill'},hoverAnimation: true,itemStyle: {normal: {color: 'yellow',shadowBlur: 10,shadowColor: '#333'}},symbolSize: 16,data: [{ name: '北京市', value: [116.405285, 39.904989] },{ name: '成都', value: [104.0657, 30.6598] },{ name: '上海', value: [121.4737, 31.2304] },{ name: '拉萨', value: [91.11, 29.97] },]},{type: 'lines',zlevel: 6,effect: {show: true,period: 4, //箭头指向速度,值越小速度越快trailLength: 0.4, //特效尾迹长度[0,1]值越大,尾迹越长重symbol: 'arrow', //箭头图标symbolSize: 7, //图标大小},lineStyle: {normal: {color:'#1DE9B6', //尾迹线条颜色width: 3,opacity: 0.6,// opacity: 0.2, //尾迹线条透明度curveness: .3 //尾迹线条曲直度}},data: [{coords: [[104.0657, 30.6598],[116.405285, 39.904989]]}, {coords: [[121.4737, 31.2304],[116.405285, 39.904989]]}, {coords: [[91.11, 29.97],[116.405285, 39.904989]]}]}]}return chartOption;}}
}
</script>

六、总结

本项目通过 ECharts-GL 实现了高质量的3D中国地图可视化,集成了贴图、分层、动画等多种高级效果,适合用于地理数据分析、流向展示等多种场景。开发过程中,合理利用 ECharts 的配置项和资源管理,可以高效实现复杂的可视化需求。


文章转载自:
http://chicklet.hyyxsc.cn
http://attica.hyyxsc.cn
http://ampleness.hyyxsc.cn
http://austronesian.hyyxsc.cn
http://annunciation.hyyxsc.cn
http://chibcha.hyyxsc.cn
http://benmost.hyyxsc.cn
http://amateurism.hyyxsc.cn
http://allocatee.hyyxsc.cn
http://atween.hyyxsc.cn
http://ammonia.hyyxsc.cn
http://balustrade.hyyxsc.cn
http://antiauthoritarian.hyyxsc.cn
http://asthmatoid.hyyxsc.cn
http://checkered.hyyxsc.cn
http://benthos.hyyxsc.cn
http://antipyrin.hyyxsc.cn
http://benefic.hyyxsc.cn
http://chowtime.hyyxsc.cn
http://betweenbrain.hyyxsc.cn
http://abe.hyyxsc.cn
http://afghanistan.hyyxsc.cn
http://berkeleyan.hyyxsc.cn
http://brett.hyyxsc.cn
http://chlorosis.hyyxsc.cn
http://amboceptor.hyyxsc.cn
http://cheekybone.hyyxsc.cn
http://chromoplast.hyyxsc.cn
http://adamancy.hyyxsc.cn
http://bladebone.hyyxsc.cn
http://www.dtcms.com/a/280633.html

相关文章:

  • React强大且灵活hooks库——ahooks入门实践之开发调试类hook(dev)详解
  • PostgreSQL 数据库中 ETL 操作的实战技巧
  • React源码6 三大核心模块之一:commit, finishConcurrentRender函数
  • 前端学习笔记:React.js中state和props的区别和联系
  • haproxy负载均衡
  • AntV G6 基础元素详解(React版)
  • 【PTA数据结构 | C语言版】创建哈夫曼树
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第二十一讲)
  • 【PDF识别改名】使用京东云OCR完成PDF图片识别改名,根据PDF图片内容批量改名详细步骤和解决方案
  • 同样是“跳转”,为何forward地址栏不变,redirect会变?
  • RNN、GRU 与 LSTM 计算成本深入对比
  • 基于光场相机的激光增材制造熔池温度场原位多眼监测​​
  • 【zynq7020】PL的“Hello LED”
  • FPGA高端图像ISP培训课程,提供工程源码+视频教程+FPGA开发板
  • Softhub软件下载站实战开发(十八):软件分类展示
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • Vmware中安装的CentOS7如何扩展硬盘大小
  • 语言模型玩转3D生成:LLaMA-Mesh开源项目
  • 【鸿蒙HarmonyOS】鸿蒙app开发入门到实战教程(二):封装自定义可复用组件
  • 前端面试专栏-工程化:25.项目亮点与技术难点梳理
  • 手搓RAG
  • 知识增强型Agent开发新范式:基于ERNIE-4.5的检索增强生成架构实践
  • 力扣-使用双指针的方法的题们(持续更新中。。。
  • NipaPlay(视频播放器) v1.3.24 绿色版
  • ubuntu22.04谷歌浏览器中文输入法bug
  • 非实时的防控场景
  • 其他常见 HTTP 方法
  • redisson 设置了过期时间,会自动续期吗
  • 论文略读:QM-ARC: QoS-aware Multi-tier Adaptive Cache Replacement Strategy
  • 2025华为ODB卷-任务总执行时长-三语言题解