Three.js + D3.js 实战:手把手教你打造可交互3D中国地图(附完整代码)

three3D地图 基于Vue实现Three.js+GeoJSON三维可视化炫酷地图(省市标签、地图流光、动态文字、高光定位、星空背景) 阅读详情

Three.js + D3.js 实战:从零构建高交互性3D中国地图可视化系统

最近在做一个数据大屏项目,客户要求将全国的业务数据以三维地图的形式直观呈现,并且要能点击、能下钻、有动画。市面上现成的图表库要么效果太“平”,要么定制化程度不够。折腾了一圈,最终决定用 Three.js 和 D3.js 自己动手搭一套。这个组合听起来有点硬核,但实际用下来,你会发现它给的可控性和表现力是其他方案难以比拟的。

这篇文章,我就把自己从踩坑到实现的全过程梳理出来,重点不是给你一段能直接拷贝的代码,而是帮你理解背后的原理和设计思路。无论你是想做一个酷炫的数据看板,还是想在产品里加入地理维度的3D分析,相信这些实战经验都能给你带来启发。我们会从最基础的数据获取和坐标转换讲起,一步步实现地图渲染、交互高亮、视角聚焦,甚至飞线和光柱这些高级特效。准备好了吗?我们开始。

1. 项目基石:数据、坐标与三维场景搭建

任何地图可视化的起点都是数据。对于中国地图,我们需要一份包含各省份边界坐标的 GeoJSON 数据。这类数据可以从一些公开的地理信息平台获取。拿到数据后,第一个要解决的问题是:如何将经纬度坐标转换成 Three.js 能理解的平面直角坐标?

1.1 GeoJSON 数据与墨卡托投影

GeoJSON 数据中的 coordinates 字段存储的是经纬度数组,例如 [116.405285, 39.904989] 代表北京。Three.js 的三维空间使用的是笛卡尔坐标系(x, y, z),我们需要一个转换函数。这就是 D3.js 的 d3-geo 模块大显身手的地方,它提供了成熟的墨卡托投影方法。

import * as d3 from 'd3';

// 创建墨卡托投影转换函数
const projection = d3.geoMercator()
  .center([104.0, 37.5]) // 以中国地理中心为投影中心
  .scale(120)            // 缩放系数,决定地图大小
  .translate([0, 0]);    // 平移,通常先设为[0,0],后续调整

// 使用:将经纬度 [116.405, 39.905] 转换为 Three.js 中的 (x, y)
const [x, y] = projection([116.405285, 39.904989]);
// 注意:转换后的y轴方向与Three.js默认可能相反,有时需要取负值 (-y)

这里有几个参数需要根据你的画布大小和需求调整:

  • center: 投影的中心点经纬度,设为中国的中心,能让地图在视觉上更居中。
  • scale: 这是最关键的一个参数。值太小,地图会缩在屏幕一角;值太大,地图会超出画布。需要反复调试。
  • translate: 通常与 scale 配合使用,用于将投影后的地图平移到场景中心。

提示:调试阶段,可以创建一个简单的点(如 THREE.SphereGeometry)放在投影后的坐标上,快速验证你的 projection 函数是否正确,以及 scale 是否合适。

1.2 初始化 Three.js 基础环境

在转换坐标之前,我们需要先搭建好 Three.js 的“舞台”。这包括场景、相机、渲染器和控制器。

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';

// 1. 场景 - 所有3D对象的容器
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x0a1a2a); // 设置一个深蓝色背景

// 2. 相机 - 观察场景的视角
const camera = new THREE.PerspectiveCamera(
  60, // 视野角度 (FOV)
  window.innerWidth / window.innerHeight, // 宽高比
  0.1, // 近裁剪面
  2000 // 远裁剪面
);
camera.position.set(0, -100, 150); // 初始相机位置,俯视角度

// 3. 渲染器 - 将3D场景绘制到HTML Canvas上
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio); // 适配高清屏
document.body.appendChild(renderer.domElement);

// 4. 轨道控制器 - 允许用户用鼠标拖拽、缩放、旋转地图
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 启用阻尼,产生平滑的交互效果
controls.dampingFactor = 0.05;

// 5. 光源 - 没有光,3D物体将是全黑的
const ambientLight = new THREE.AmbientLight(0xffffff, 0.6); // 环境光,均匀照亮
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8); // 方向光,产生阴影和立体感
directionalLight.position.set(100, 100, 50);
scene.add(directionalLight);

// 6. 动画循环
function animate() {
  requestAnimationFrame(animate);
  controls.update(); // 必须在动画循环中更新控制器
  renderer.render(scene, camera);
}
animate();

// 7. 响应窗口大小变化
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.inner
Three.js绘制3D中国地图 下载区域经纬度json数据,在本地重命名放置到 项目目录下。 阅读详情

相关推荐

Three.js实战:打造交互式3D中国地图可视化

本文详细介绍了如何使用Three.js构建交互式3D中国地图可视化项目。从数据准备、核心架构搭建到地图渲染与交互设计,全面解析了技术实现细节,包括D3.js投影转换、省份几何体创建和性能优化技巧,帮助开发者快速掌握3D地图开发的核心技能。

weixin_33738555的博客 476

Vue2+Three.js实战:如何用阿里云地图数据打造3D中国地图(附完整代码)

本文详细介绍了如何使用Vue2和Three.js结合阿里云地图数据构建高精度3D中国地图的全流程。从环境搭建、数据准备到核心架构设计,再到地图模型构建和高级视觉效果实现,提供了完整的代码示例和性能优化策略。特别适合前端开发者和数据可视化工程师学习3D地图开发技术。

weixin_29019241的博客 421

保姆级教程:用Vue3+Three.js从零打造一个可交互的3D中国地图(附完整源码)

本文提供了一份详细的Vue3与Three.js实战教程,教你从零构建一个交互式3D中国地图应用。教程涵盖环境搭建、地理数据处理、3D模型生成、交互系统实现以及高级视觉效果,特别关注性能优化和用户体验,并附完整源码。适合前端开发者学习3D数据可视化技术。

weixin_33737134的博客 396

手把手教你用Three.js + D3.js打造一个可交互的3D中国地图(附完整代码)

本文详细介绍了如何使用Three.js和D3.js构建一个可交互的3D中国地图,涵盖从地理数据处理到三维渲染的全流程技术。通过实战代码示例,帮助开发者掌握3D可视化核心技术,实现高效的地理数据展示与交互功能。

weixin_28717411的博客 428

用Three.js+OrbitControls打造可旋转的3D中国地图:新手避坑指南

本文详细介绍了如何使用Three.js和OrbitControls创建可旋转的3D中国地图,涵盖环境搭建、地图数据处理、光照系统配置、OrbitControls高级技巧及性能优化等关键步骤。通过实战经验和避坑指南,帮助开发者快速掌握3D地图开发技术,提升项目效率。

weixin_29002209的博客 207

Three.js打造交互式3D中国地图:从数据加载到动态高亮

本文详细介绍了如何使用Three.js构建交互式3D中国地图,涵盖从数据加载到动态高亮的全流程。通过阿里云DataV.GeoAtlas获取GeoJSON数据,结合D3.js进行坐标转换,实现精准地图渲染。文章重点讲解了场景初始化、数据加载、交互实现及性能优化技巧,并提供了省份高亮、Tooltip显示等进阶功能的代码示例,帮助开发者快速掌握3D地图开发核心技术。

time3的博客 361

Vue3+Three.js实战:手把手教你打造可交互的3D行政区划地图(含飞线特效)

本文详细介绍了如何使用Vue3和Three.js构建高交互性的3D行政区划地图,包括环境搭建、地图数据处理、3D渲染核心技术、多级地图切换、交互功能实现以及飞线特效等高级功能。通过实战案例,帮助开发者掌握从基础到进阶的3D地图开发技巧,提升Web应用的空间数据可视化能力。

weixin_30897233的博客 396

基于Three.js与GeoJSON打造动态交互式3D地图实战指南

本文是一份基于Three.js与GeoJSON构建动态交互式3D地图的实战指南。详细介绍了从环境搭建、数据获取、坐标投影到3D模型构建的核心流程,并重点讲解了如何实现悬浮高亮、点击交互、动态光柱与标注等高级效果,帮助前端开发者快速掌握创建炫酷、可定制化3D地图可视化项目的完整技能。

weixin_29015801的博客 262

Vue3与Three.js联袂打造:3D地图可视化开发全流程解析

本文详细解析了使用Vue3与Three.js开发3D地图可视化的全流程。从Vite环境搭建、Three.js基础场景创建,到核心的GeoJSON数据处理与墨卡托投影转换,再到利用GSAP实现动态动画与交互,最后探讨了性能优化与组件化架构。文章旨在帮助前端开发者高效构建功能丰富、性能优异的3D地图应用,适用于智慧城市、数据大屏等场景。

weixin_29021195的博客 397

Three.js实战:从零构建天地图3D可视化场景

本文详细介绍了如何使用Three.js结合天地图API构建3D可视化场景,从环境搭建、瓦片加载到3D地形生成和性能优化。通过实战代码示例,帮助开发者快速掌握WebGL地理可视化技术,适用于智慧城市、应急指挥等专业场景。

weixin_29021195的博客 455

threejs全国3d地图

threejs全国3d地图

DCN交换机通过boot模式升级

LIC导入成功后,输入enable进入特权模式,把网线接到通讯网口上,配置好对应interface vlan地址,在enable模式用 copy tftp://x.x.x.x/xxxxxx_nos.img nos.img待提示write ok时,reload设备完成升级。交换机启动后,在显示以下信息时输入“Ctrl+B”,一定得是手动按“Ctrl+B”进入的boot模式才能正常升级。升级交换机成功,在BootROM模式下,执行命令run或reboot,回到CLI配置界面。# 交换机通过boot模式升级。

m0_72501865的博客 948

IEEE Transactions on Industrial Informatics(TII)投稿全流程解析:从准备到成功提交

本文详细解析了向IEEE Transactions on Industrial Informatics(TII)投稿的全流程,涵盖从投稿前的格式准备、内容结构优化到在线提交系统实操等关键环节。重点强调了遵守TII严格的格式规范、双盲评审要求以及如何构建有说服力的学术叙述,旨在帮助研究者提升稿件质量,顺利通过评审。

weixin_28396629的博客 1871

基于FPGA的 SelectIO IP核 的仿真验证-----( LVDS差分高速传输)

SelectIO IP核 的仿真验证

qq_43618170的博客 1万+

LVDS系列11:Xilinx Ultrascale系可编程输入延迟(一)

按照IDELAYCTRL的参考时钟频率可以准确计算获取到,如200M参考时钟抽头分辨率为78ps,Ultrascale系列相对于7系列架构大改,体现便是U/U+系列的抽头增加到512个,同时每个抽头的分辨率就无法像7系列那样能得到一个准确的值,是一个波动的范围值,抽头分辨率随着工艺温度电压的变化而变化。EN_VTC:电压温度补偿开启的使用信号,COUNT模式下不能使用,必须保持为0,TIME模式下需要使用,在延迟工作时要启用温度电压补偿,在修改抽头值时需要关闭温度电压补偿,修改完后启用;

weixin_38828382的博客 1942

【proteus】模拟串口和物理串口通讯

proteus提供了两种串口,一种是模拟的串口,还有一张是用软件仿真到硬件的物理串口。他们的区别就是:模拟串口只能在proteus内部进行通讯,但是物理可以通过软件映射到硬件上和单机或者串口软件通讯。 物理串口在元器件搜索COMPIM即可找到。 模拟串口在这里: PROTEUS仿真图: 物理串口COMPIM的设置: 模拟串口的设置: VSPD是一款虚拟串口软件,VSPD下载链接: 链接:https://pan.baidu.com/s/1AZygJCeWZfQTnxdCb_3TPg 提取码:12pm

阿蛋的博客 8934

Python爬虫实战:使用最新技术爬取新浪新闻首页数据

本文详细介绍了三种爬取新浪新闻首页的技术方案,从简单的requests-html到强大的Playwright,再到分布式Scrapy架构。小规模爬取:requests-html或aiohttp方案需要JavaScript渲染:Playwright方案大规模分布式爬取:Scrapy-Redis方案。

2201_76125261的博客 1244

96.在 Vue 3 中使用 OpenLayers 探究加载 Point、Polygon 的极限

在前端 GIS(地理信息系统)开发中,OpenLayers 作为一个功能强大的 Web 地图库,广泛用于加载地图、渲染矢量数据(点、线、面)、叠加图层等场景。然而,当涉及到。

小彭的博客 1159

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1121

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: Excel数据导入避坑指南:枚举校验的5种实现方案对比
下一篇: LoadRunner负载机配置全攻略:从安装到实战避坑指南(Windows/Linux双平台)
github5actions
博客等级 码龄1天 0粉丝 1824原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值