three.js 绘制3d地图
通过地图数据配合three可以做出非常酷炫的地图,在大数据展示中十分常见。
这篇郭先生就来说说使用three.js几何体制作3D地图。在线案例点击原文地址。
地图的数据是各个地图块的点数组,通过THREE.ExtrudeGeometry方法挤压出地图的版块,然后通过THREE.Line方法画出地图的分割线。地图的数据参见DATAV.GeoAtlas,鼠标悬浮到地图版块高亮,效果如图

1. 得到数据,遍历数据,处理数据
rawMap() {
this.worldGeometry = mapJson; //mapJson就是地图的json数据
this.worldGeometry.features.forEach((worldItem, worldItemIndex) => {
worldItem.geometry.coordinates.forEach(worldChildItem => {
worldChildItem.forEach(countryItem => { //每个版块的点数组
this.drawExtrude(this.drawShape(countryItem)) //传递数据画出地图的shape,返回结果再传到drawExtrude方法得到ExtrudeGeometry网格
this.drawLine(countryItem); //传递数据画出地图边线
});
});
});
group.scale.y = 1.2; //group里面包含所有版块网格
scene.add(group);
lineGroup.scale.y = 1.2; //lineGruop里面包含所有线的网格
scene.add(lineGroup);
this.render();
}
2. 传递数据画出地图的shape,返回结果再传到drawExtrude方法得到ExtrudeGeometry网格。
drawShape(posArr) {
var shape = new THREE.Shape();
shape.moveTo(posArr[0][0] - this.offsetX, posArr[0][1] - this.offsetY);
posArr.forEach(item => {
shape.lineTo(item[0] - this.offsetX, item[1] - this.offsetY);
});
return shape;
}
drawExtrude(shapeObj) {
var geometry = new THREE.ExtrudeGeometry(shapeObj, this.options);
var material1 = new THREE.MeshPhongMaterial({
color: this.bgColor,
specular: this.bgColor
});
var material2 = new THREE.MeshBasicMaterial({
color: 0x008bfb
});
let shapeGeometryObj = new THREE.Mesh(geometry, [material1, material2]);
shapeGeometryObj.name = 'board';
group.add(shapeGeometryObj);
}
3. 传递数据画出地图边线
drawLine(posArr) {
let geometry1 = new THREE.Geometry();
let geometry2 = new THREE.Geometry();
posArr.forEach(item => {
geometry1.vertices.push(
new THREE.Vector3(
item[0] - this.offsetX,
item[1] - this.offsetY,
1.01
)
);
geometry2.vertices.push(
new THREE.Vector3(
item[0] - this.offsetX,
item[1] - this.offsetY,
-0.01
)
);
});
let lineMaterial = new THREE.LineBasicMaterial({ color: 0x008bfb });
let line1 = new THREE.Line(geometry1, lineMaterial);
let line2 = new THREE.Line(geometry2, lineMaterial);
lineGroup.add(line1);
lineGroup.add(line2);
}
4. 鼠标悬浮后高亮版块
handleMousemove(event) {
event.preventDefault();
let mouse = new THREE.Vector2(0, 0);
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
this.raycaster.setFromCamera(mouse, camera);
let intersects = this.raycaster.intersectObjects(group.children);
this.previousObj.material[0].color = new THREE.Color(this.bgColor);
if(intersects[0] && intersects[0].object) {
intersects[0].object.material[0].color = new THREE.Color(0xffaa00);
this.previousObj = intersects[0].object; //previousObj保存悬浮的对象,鼠标移开后恢复颜色。
}
}
主要代码部分就是这样,我们也可以在颜色改变时加入一些渐变动画,three.js可以写出各种各样的地图,这是入门级的版本,希望给萌新一些启发。
转载请注明地址:郭先生的博客
three.js 绘制3d地图的更多相关文章
- Three.js实现3D地图实例分享
本文主要给大家介绍了关于利用Three.js开发实现3D地图的实践过程,文中通过示例代码介绍的非常详细,对大家学习或者使用three.js具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习 ...
- Javascript实战开发:教你使用raphael.js绘制中国地图
最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作.在本文中,我给大 ...
- 使用three.js开发3d地图初探
three是图形引擎,而web二维三维地图都是基于图形引擎的,所以拿three来开发需求简单的三维地图应用是没什么问题的. 1.坐标转换 实际地理坐标为经度.纬度.高度,而three.js使用的是右手 ...
- 利用d3.js绘制中国地图
d3.js是一个比較强的数据可视化js工具. 利用它画了一幅中国地图,例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3ZhcDE=/ ...
- three.js实现世界3d地图
概况如下: 1.THREE.Shape绘制世界地图平面地图: 2.THREE.ExtrudeGeometry将绘制的平面沿着Z轴拉伸,实现3d效果: 效果图如下: 预览地址:three.js实现世界3 ...
- js基于谷歌地图API绘制可编辑圆形与多边形
之前的工作中需要在谷歌地图上绘制可编辑多边形区域,所以基于谷歌地图API封装了个html页面,通过调用js绘制多边形并返回各点的经纬度坐标:当然首先你要保证你的电脑可以打开谷歌地图... 新建一个ht ...
- 绘制3D的js库
有哪些值得推荐的绘制3D的js库? 4 个回答 默认排序 草皮子 HTML5/GAME 4 人赞同了该回答 只用过three.js,所以推荐这个.不清楚你打算用来做什么,总的来说,得看你的运 ...
- Threejs 开发3D地图实践总结
前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂直于我们想要照亮的物体表面的向量.法线代表 ...
- Threejs 开发3D地图实践总结【转】
Threejs 开发3D地图实践总结 前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂 ...
随机推荐
- Shiro反序列化复现
Shiro反序列化复现 ——————环境准备—————— 目标靶机:10.11.10.108 //docker环境 攻击机ip:无所谓 vpsip:192.168.14.222 //和靶机ip可通 1 ...
- Apache Hudi:云数据湖解决方案
1. 引入 开源Apache Hudi项目为Uber等大型组织提供流处理能力,每天可处理数据湖上的数十亿条记录. 随着世界各地的组织采用该技术,Apache开源数据湖项目已经日渐成熟. Apache ...
- opencv c++访问某一区域
int main(){ cv::Mat m1(,, CV_8UC1); for(int i=;i<m1.rows;++i) for(int j=;j<m1.cols;++j) m1.at& ...
- Blazor带我重玩前端(一)
写在前面 曾经我和前端朋友聊天的时候,我说我希望有一天可以用C#写前端,不过当时更多的是美好的想象,而现在这一切正变得真实…… 什么是Blazor 我们知道浏览器可以正确解释并执行JavaScript ...
- java常用的格式化
日常工作中,总会遇到一些格式化显示的需求,下面做一些简单的整理 JDK中java.text下提供了格式化常用的工具类,具体结构见下图 时间日期格式化 DateFormat 采用DateFormat.g ...
- JavaWeb网上图书商城完整项目--day02-3.regist页面输入框失去焦点进行校验
当输入框输入数据之后,当输入框失去焦点的时候,我们需要对输入的数据进行校验 l 用户名校验: 用户名不能为空: 用户名长度必须在3 ~ 20之间: 用户名已被注册(需要异步访问服务器). l 登录 ...
- Python3-内置类型-集合类型
Python3中的集合类型主要有两种 set 可变集合 可添加和删除元素,它是不可哈希的,因此set对象不能用作字典的键或另一个元素的集合 forzenset 不可变集合 正好与set相反,其内容创建 ...
- 14 张思维导图构建 Python 核心知识体系
ZOE是一名医学生,在自己博客分享了很多高质量的思维导图.本文中所列的 14 张思维导图(高清图见文末),是 17 年作者开始学习 Python 时所记录的,希望对大家有所帮助.原文:https:// ...
- [CEOI1999]Parity Game 题解
P5937 [CEOI1999]Parity Game 洛谷P5937 P5937 [CEOI1999]Parity Game 前言: 个人感觉这道题初看想不到并查集啊!(说实话我题都没读懂,第二遍才 ...
- Bootstrap 3.3
https://jeesite.gitee.io/front/bootstrap/3.3/v3.bootcss.com/index.htm