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.法向量问题 法线是垂 ...
随机推荐
- Java 设置PDF平铺图片背景(水印)
一.概述及环境准备 本文介绍使用免费版PDF库-Free Spire.PDF for Java加载图片来设置成PDF平铺图片背景的效果,也可以作为平铺图片水印来使用:编辑代码前,需要先导入jar文件, ...
- PytorchMNIST(使用Pytorch进行MNIST字符集识别任务)
都说MNIST相当于机器学习界的Hello World.最近加入实验室,导师给我们安排了一个任务,但是我才刚刚入门呐!!没办法,只能从最基本的学起. Pytorch是一套开源的深度学习张量库.或者我倾 ...
- opencv C++图像读取
int main(){ cv::Mat img=cv::imread("/home/nan/图片/highdeepth/starry.jpg",cv::IMREAD_REDUCED ...
- MongoDB设计方法及技巧
MongoDB是一种流行的数据库,可以在不受任何表格schema模式的约束下工作.数据以类似JSON的格式存储,并且可以包含不同类型的数据结构.例如,在同一集合collection 中,我们可以拥有以 ...
- JavaWeb网上图书商城完整项目--11.项目所需jquery函数介绍
1.下载jquery的函数包 2.强函数包添加到工程的web-root目录下 3.在jsp文件中加载js文件 <script type="text/javascript" s ...
- shell基本正则表达式
基本正则表达式 星号* 匹配它前面的字符串或正则表达式任意次(包括0次).比如,“1122*” 将匹配11+1个或多个2,其可能匹配的字符串将是112.1122.112222.11223343等 句点 ...
- 记一次发布/更新npm包的过程及包版本管理
您可以发布包含package.json文件的任何目录.这里如何首次发布程序包以及如何在以后更新程序包. 如何发布包 制备 了解npm政策 在开始之前,如果您对网站礼仪,命名,许可或其他指南有疑问,最好 ...
- CI CD概念
CI:持续集成 Continuous Integration CD:持续发布 Continuous Delivery (完)
- 第三方登陆---GITEE
第三方登陆QQ通行入口 https://www.cnblogs.com/Yangbuyi/p/13194007.html 呼~~~~ 应身边的同学要集成第三方登陆 gitee.github.qq登陆. ...
- 基于git的博客(含站点与小程序)
1 效果 静态站点: blog.makergyt.com 备用链接: github.blog.makergyt.com 小程序: 语雀:<MakerGYT blog> 2 需求分析 2.1 ...