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

three.js 3D可视化地图

threejs地图

可视化地图——three.js实现
this.provinceInfo = document.getElementById('provinceInfo');
// 渲染器
this.renderer = new THREE.WebGLRenderer({antialias: true
});
this.renderer.setSize(window.innerWidth, window.innerHeight);
this.container.appendChild(this.renderer.domElement);this.labelRenderer = new THREE.CSS3DRenderer(); //新建CSS3DRenderer
this.labelRenderer.setSize(window.innerWidth, window.innerHeight);
this.labelRenderer.domElement.style.position = 'absolute';
this.labelRenderer.domElement.style.top = 0;
document.body.appendChild(this.labelRenderer.domElement);// 场景
this.scene = new THREE.Scene();
// 假设 scene 是一个 Scene 对象
const textureLoader = new THREE.TextureLoader();
this.scene.background = textureLoader.load("img/bg.png");// 相机 透视相机
this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
this.camera.position.set(this.orbitParams.pos.x, this.orbitParams.pos.y, this.orbitParams.pos.z);
this.camera.lookAt(this.orbitParams.target.x, this.orbitParams.target.y, this.orbitParams.target.z);

地图数据的加载渲染

this.map = new THREE.Object3D();
this.map.add(cityPointGroup);
this.map.add(cityGroup);
this.map.add(flyGroup);let _this = this;
_this.maptext = [];
const projection = d3.geoMercator().center([104.0, 37.5]).scale(80).translate([0, 0]);
let pintArr = [];
const textureLoader = new THREE.TextureLoader();
const material = new THREE.MeshPhongMaterial({color: '#03121b',transparent: true,normalScale: new THREE.Vector2( 0.150, 0.150 ),normalMap: textureLoader.load( 'img/OIP-C.jpg' ),opacity: 0.9
});const material1 = new THREE.MeshBasicMaterial({color: '#15d0b1',transparent: true,// normalMap: textureLoader.load( 'img/earth_normal_2048.jpg' ),opacity: 0.7
});chinaJson.features.forEach(elem => {// 定一个省份3D对象const province = new THREE.Object3D();// 每个的 坐标 数组const coordinates = elem.geometry.coordinates;// 循环坐标数组coordinates.forEach(multiPolygon => {multiPolygon.forEach(polygon => {const shape = new THREE.Shape();const lineMaterial = new THREE.LineBasicMaterial({color: '#15d0b1',});const lineGeometry = new THREE.Geometry();let boundingBox = {max: { x:undefined,y:undefined },min: { x:undefined,y:undefined }};for (let i = 0; i < polygon.length; i++) {const [x, y] = projection(polygon[i]);if (i === 0) {shape.moveTo(x, -y);}shape.lineTo(x, -y);lineGeometry.vertices.push(new THREE.Vector3(x, -y, 4.01));if(undefined==boundingBox.max.x) boundingBox.max.x = x;if(undefined==boundingBox.max.y) boundingBox.max.y = -y;if(undefined==boundingBox.min.x) boundingBox.min.x = x;if(undefined==boundingBox.min.y) boundingBox.min.y = -y;if(x > boundingBox.max.x) boundingBox.max.x = x;if(-y > boundingBox.max.y) boundingBox.max.y = -y;if(x < boundingBox.min.x) boundingBox.min.x = x;if(-y < boundingBox.min.y) boundingBox.min.y = -y;}let width = Math.abs( boundingBox.max.x - boundingBox.min.x );let height = Math.abs( boundingBox.max.y - boundingBox.min.y );const extrudeSettings = {depth: 4,bevelEnabled: false,UVGenerator : {generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {  },generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {}}};const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);const mesh = new THREE.Mesh(geometry, [material, material1]);const line = new THREE.Line(lineGeometry, lineMaterial);mesh.userData.oldMaterial = true;province.add(mesh);province.add(line)})})province.properties = elem.properties;if (elem.properties.contorid) {const [x, y] = projection(elem.properties.contorid);province.properties._centroid = [x, y];}_this.map.add(province);if (elem.properties.center) {const [x, y] = projection(elem.properties.center);const center = new THREE.Vector3(x, -y, 4.01);_this.maptext.push( {pos:center,text:elem.properties.name} );}if (elem.properties.name == "北京市") {const [x, y] = projection(elem.properties.center);const center = new THREE.Vector3(x, -y, 4.01);pintArr.push(center.clone())}
})this.scene.add(this.map);
this.loadFont(_this.maptext);
_this.ctrlBarDatas( true,'bar','北京市' );

相关文章:

three.js 3D可视化地图

threejs地图 可视化地图——three.js实现 this.provinceInfo document.getElementById(provinceInfo); // 渲染器 this.renderer new THREE.WebGLRenderer({antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.container.appendChild…...

Unity所有关于旋转的方法详解

前言&#xff1a;欧拉角和四元数的简单描述 我们在Inspector面板上看到的rotation其实是欧拉角&#xff0c; 我们将Inspector面板设置成Debug模式&#xff0c;此时看到的local Rotation才是四元数。 Unity中的欧拉旋转是按照Z-X-Y顺规执行的旋转&#xff0c;一组欧拉旋转过程中…...

Vue3

目录 一、 Vue3简介 1. 性能的提升 2. 源码的升级 3. 拥抱TypeScript 4. 新的特性 二、 创建Vue3工程 1. 基于 vue-cli 创建 2. 基于 vite 创建(推荐) 3. 一个简单的效果 三、Vue3核心语法 1. OptionsAPI 与 CompositionAPI &#xff08;1&#xff09;Options API …...

浅谈业务场景中缓存的使用

浅谈缓存 一、背景二、缓存分类1.本地缓存2.分布式缓存 三、缓存读写模式1.读请求2.写请求 四、缓存穿透1.缓存空对象2.请求校验3.请求来源限制4.布隆过滤器 五、缓存击穿1.改变过期时间2.串行访问数据库 六、缓存雪崩1.避免集中过期2.提前更新缓存 七、缓存与数据库一致性1.设…...

Itext生成pdf文件,html转pdf时中文一直显示不出来

之前使用freemark模板渲染ftl页面,转出的pdf中&#xff0c;css2有些样式好像不支持&#xff0c;比较常用的居中样式都没有效果&#xff0c;text-align:center 改造成使用html页面来转pdf&#xff0c;css2的样式可以生效,itext是不支持css3的弹性布局的ITextRenderer pdfRendere…...

题目 1138: C语言训练-求矩阵的两对角线上的元素之和

问题描述&#xff1a; 求矩阵的两对角线上的元素之和 样例输入&#xff1a; 3 1 2 3 4 5 6 7 8 9 样例输出&#xff1a; 25 问题分析&#xff1a; 因为奇数阶矩阵的主对角线和副对角线上的元素有重复&#xff0c;偶数阶矩阵的主对角线和副对角线上的元素无重复&#x…...

第6讲自定义icon实现

自定义icon实现 component下新建SvgIcon目录&#xff0c;再新建index.vue 定义svg-icon组件 <template><svg class"svg-icon" aria-hidden"true"><use :xlink:href"iconName"></use></svg> </template>&…...

花费200元,我用全志H616和雪糕棒手搓了一台可UI交互的视觉循迹小车

常见的视觉循迹小车都具备有路径识别、轨迹跟踪、转向避障、自主决策等基本功能&#xff0c;如果不采用红外避障的方案&#xff0c;那么想要完全满足以上这些功能&#xff0c;摄像头、电机、传感器这类关键部件缺一不可&#xff0c;由此一来小车成本也就难以控制了。 但如果&a…...

AUTOSAR OS TASK

什么是TASK? 我们在裸机中跑代码,程序永远只能单活动流水执行,当程序需要等待的时候,CPU就一直在waiting状态,无法高效的利用CPU,这个时候就引入了并发运行需求。一个系统能同时执行多个不同活动的系统叫做并发系统。其中这个系统中的每个并发执行的活动都由TASK(任务)…...

陇剑杯 2021刷题记录

题目位置&#xff1a;https://www.nssctf.cn/上有 陇剑杯 2021 1. 签到题题目描述分析答案小结 2. jwt问1析1答案小结 问2析2答案小结 问3析3答案 问4析4答案 问5析5答案 问6析6答案 3. webshell问1析1答案 问2析2答案 问3析3答案 1. 签到题 题目描述 此时正在进行的可能是_…...

前端常见的设计模式

说到设计模式&#xff0c;大家想到的就是六大原则&#xff0c;23种模式。这么多模式&#xff0c;并非都要记住&#xff0c;但作为前端开发&#xff0c;对于前端出现率高的设计模式还是有必要了解并掌握的&#xff0c;浅浅掌握9种模式后&#xff0c;整理了这份文章。 六大原则&…...

OpenAI视频生成模型Sora的全面解析:从ViViT、扩散Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…...

3个密码学相关的问题

一、离散对数问题&#xff08;Discrete Logarithm Problem, DLP&#xff09; 问题描述&#xff1a;给定 有限阿贝尓群 G中的2个元素a和b&#xff0c;找出最小的正整数x满足&#xff1a;b a ^^ x &#xff08;或者证明这样的x不存在&#xff09;。 二、阶数问题&#xff08;O…...

5G网络eMBB、uRLLC、mMTC

ITU&#xff08;国际电信联盟&#xff09;于2015年9月正式定义了5G的三大应用场景&#xff1a;eMBB&#xff08;增强型移动宽带&#xff09;、uRLLC&#xff08;低时延高可靠通信&#xff09;、mMTC&#xff08;海量物联网通信&#xff09;。 eMBB是4G MBB&#xff08;移动宽带…...

matplotlib图例使用案例1.1:在不同行或列的图例上添加title

我们将图例进行行显示或者列显示后&#xff0c;只能想继续赋予不同行或者列不同的title来进行分类。比较简单的方式&#xff0c;就是通过ax.annotate方法添加标签&#xff0c;这样方法复用率比较低&#xff0c;每次使用都要微调ax.annotate的显示位置。比较方便的方法是在案例1…...

nginx 日志改为json格式

nginx 日志改为json格式 场景描述效果变更旧样式新样式 场景描述 正常使用nginx时&#xff0c;使用默认的日志输出格式&#xff0c;对于后续日志接入其他第三方日志收集、清洗环节&#xff0c;因分隔符问题可能不是很友好。 xxxx - - [19/Feb/2024:11:16:48 0800] "GET …...

【DDD】学习笔记-应用服务

Eric Evans 为运用领域驱动设计的系统架构划定了层次&#xff0c;在领域层和展现层之间引入了应用层&#xff08;Application Layer&#xff09;&#xff1a;“应用层要尽量简单&#xff0c;不包含业务规则或者知识&#xff0c;而只为下一层&#xff08;指领域层&#xff09;中…...

【医学大模型】MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化,便于LLM理解和应用

MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化&#xff0c;便于LLM理解和应用 提出背景对比传统医学大模型流程步骤临床指导树流程图识别临床决策支持系统 总结解决方案设计数据收集与处理系统实施临床决策支持 提出背景 论文&#xff1a;https://arxiv.org/p…...

YOLOV8改进系列指南

基于Ultralytics的YOLOV8改进项目.(69.9) 为了感谢各位对V8项目的支持,本项目的赠品是yolov5-PAGCP通道剪枝算法.具体使用教程 专栏改进汇总 二次创新系列 ultralytics/cfg/models/v8/yolov8-RevCol.yaml 使用(ICLR2023)Reversible Column Networks对yolov8主干进行重设计,里…...

FlinkSql一个简单的测试程序

FlinkSql一个简单的测试程序 以下是一个简单的 Flink SQL 示例&#xff0c;展示了如何使用 Flink Table API 和 Flink SQL 进行基本的数据流处理。 定义数据实体 CC &#xff1a; - CC 类表示数据流中的元素&#xff0c;包含两个字段&#xff1a; character &#xff08;字符&a…...

Golang笔记1-变量与类型

Go 变量与类型 1. 怎么声明变量 // var 写法&#xff1a;可以在函数外用&#xff08;全局&#xff09; var name string "张三" var age int 25 var isAdmin bool // 不赋值就是零值// : 短声明&#xff1a;只能在函数内用&#xff08;日常首选&#xff09; name :…...

C++20 协同调度原语:利用 std::atomic::wait/notify 实现低功耗自旋锁在高并发下的快速响应协议

各位同仁&#xff0c;女士们&#xff0c;先生们&#xff0c;欢迎来到今天的技术讲座。在现代C编程中&#xff0c;高性能与低功耗的追求从未停止。随着多核处理器的普及和异步编程模型的兴起&#xff0c;对并发原语的精细化控制变得尤为关键。C20标准为我们带来了诸多激动人心的…...

避坑指南:RK3588以太网调试那些‘看起来通了但实际没通’的坑(附千兆网线识别与ifconfig -a用法)

RK3588以太网深度排雷手册&#xff1a;从"假连通"到真稳定的实战指南 当你看到eth0接口亮起绿色指示灯&#xff0c;ifconfig显示RX/TX数据包在跳动&#xff0c;甚至ping命令能收到零星回复时&#xff0c;是否觉得RK3588的网络已经调试成功&#xff1f;且慢——这可能…...

基于信息流的移动智能终端隐私保护关键技术研究(中期检查报告)

一、基本情况论文题目 基于信息流的移动智能终端隐私保护关键技术研究 √ 课题进展情况 本课题按开题报告所预定的内容及进度顺利进行,课题进展情况正常。目前已经在开题文献阅读的基础上,对Android隐私保护与信息流分析技术进行了深入研究,挖掘出了信息流分析技术应用于…...

不用重复编译!共享ModelSim仿真库的终极技巧(Vivado 2018+版本通用)

共享ModelSim仿真库的高效复用策略&#xff08;Vivado 2018通用指南&#xff09; 当团队协作开发FPGA项目或频繁切换不同工程时&#xff0c;每次重新编译仿真库不仅耗时&#xff0c;还会占用大量存储空间。本文将揭示如何通过巧妙配置modelsim.ini文件实现仿真库的跨工程共享&a…...

从安装到实战:在快马生成项目中体验openclaw本地安装与即时数据抓取

从安装到实战&#xff1a;在快马生成项目中体验openclaw本地安装与即时数据抓取 最近在做一个数据采集的小项目&#xff0c;需要从网站上抓取一些公开信息。经过调研发现openclaw这个工具很适合我的需求&#xff0c;但网上关于它的本地安装和实际应用的完整教程比较少。于是我…...

雷达信号处理中的‘模糊函数’到底是什么?用Python仿真LFM信号的距离多普勒耦合现象

雷达信号处理中的‘模糊函数’到底是什么&#xff1f;用Python仿真LFM信号的距离多普勒耦合现象 雷达信号处理中&#xff0c;匹配滤波器的性能直接影响目标检测的精度。当目标存在径向运动时&#xff0c;回波信号会产生多普勒频移&#xff0c;导致匹配滤波器出现失配。描述这种…...

【AI理论学习】深入解析词向量训练:从CBOW到Skip-Gram的实战对比

1. 词向量基础&#xff1a;从One-hot到分布式表示 第一次接触词向量时&#xff0c;我和大多数人一样被各种术语绕晕了。直到用实际项目踩过坑才明白&#xff0c;词向量本质上就是让计算机"理解"词语含义的数学工具。想象你教小朋友认字&#xff0c;既可以通过死记硬背…...

2026山东大学软件学院项目实训(一)

Vue 3工程化实践与组件设计 核心任务概述 本次项目实训聚焦Vue 3前端工程化配置与全局组件开发&#xff0c;目标是通过模块化设计提升代码复用率&#xff0c;并建立规范的前后端协作流程。核心任务包括&#xff1a; 使用Pinia实现全局状态管理基于Ant Design Vue完成响应式布…...

MySQL数据库备份实战:全量、增量、差异备份到底怎么选?

MySQL数据库备份实战&#xff1a;全量、增量、差异备份到底怎么选&#xff1f; 作为数据库管理员&#xff0c;每天最担心的莫过于数据丢失。记得去年我们团队遇到过一次硬盘故障&#xff0c;当时如果没有完善的备份策略&#xff0c;后果不堪设想。选择正确的备份方式不仅关系到…...