通过地图数据配合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地图的更多相关文章

  1. Three.js实现3D地图实例分享

    本文主要给大家介绍了关于利用Three.js开发实现3D地图的实践过程,文中通过示例代码介绍的非常详细,对大家学习或者使用three.js具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习 ...

  2. Javascript实战开发:教你使用raphael.js绘制中国地图

    最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作.在本文中,我给大 ...

  3. 使用three.js开发3d地图初探

    three是图形引擎,而web二维三维地图都是基于图形引擎的,所以拿three来开发需求简单的三维地图应用是没什么问题的. 1.坐标转换 实际地理坐标为经度.纬度.高度,而three.js使用的是右手 ...

  4. 利用d3.js绘制中国地图

    d3.js是一个比較强的数据可视化js工具. 利用它画了一幅中国地图,例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3ZhcDE=/ ...

  5. three.js实现世界3d地图

    概况如下: 1.THREE.Shape绘制世界地图平面地图: 2.THREE.ExtrudeGeometry将绘制的平面沿着Z轴拉伸,实现3d效果: 效果图如下: 预览地址:three.js实现世界3 ...

  6. js基于谷歌地图API绘制可编辑圆形与多边形

    之前的工作中需要在谷歌地图上绘制可编辑多边形区域,所以基于谷歌地图API封装了个html页面,通过调用js绘制多边形并返回各点的经纬度坐标:当然首先你要保证你的电脑可以打开谷歌地图... 新建一个ht ...

  7. 绘制3D的js库

      有哪些值得推荐的绘制3D的js库?   4 个回答 默认排序​ 草皮子 HTML5/GAME 4 人赞同了该回答 只用过three.js,所以推荐这个.不清楚你打算用来做什么,总的来说,得看你的运 ...

  8. Threejs 开发3D地图实践总结

    前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂直于我们想要照亮的物体表面的向量.法线代表 ...

  9. Threejs 开发3D地图实践总结【转】

    Threejs 开发3D地图实践总结   前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂 ...

随机推荐

  1. cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort

    cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort sort(b,e) sort(b,e,p) stable_sort(b,e) stable_sort(b,e,p) ...

  2. 7.kubernetes集群版本升级

    1.查看原集群的Node节点的版本号 [root@hdss7-22 opt]# kubectl get node -o wide 2.将要升级的kubernetes版本上传到node节点上并解压(v1 ...

  3. Spring:如何实现注解的组合

    Spring中存在很多注解组合的情况,例如@RestController @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ ...

  4. 微信小程序点击保存图片到本地相册——踩坑

    在微信小程序中要保存图片到本地相册,需要获取相册权限. 总之整个功能实现下来需要如下几个小程序的API:wx.getSetting,wx.authorize,wx.openSetting,wx.dow ...

  5. java-递归(文件查找)

    import java.io.File; /** * @Author: heq * @Date: 2020/6/23 20:51 */ public class Test { public stati ...

  6. caffe的python接口学习(5)生成deploy文件

    如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.prototxt文件,这个文件实际上和test.prototxt文件差不多,只是头尾不相同而也.deploy文件没有第一层数据输入层, ...

  7. C# 从1到Core--委托与事件

    委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变.本文温故一下这些改变,以及在NET Core中关于事件的一点改变. 一.C#1.0 从委托开始 1. 基本方式 ...

  8. 洛谷 P6582 【座位调查】

    这道题就两个步骤: 1.找联通块个数:判断是否符合标准并且找联通块个数 我用的广搜实现的,思路挺简单的: 先找一个联通块的端点,根据题中的定义,一个联通块的端点,周围所不是座位的个数(指上下左右),只 ...

  9. Linux中快捷生成自签名ssl证书_113资讯网

    一.生成CA私钥 mkdir ca cd ca #创建私钥 (建议设置密码) openssl genrsa -des3 -out myCA.key 2048 生成CA证书 # 20 年有效期 open ...

  10. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...