研发三维GIS系统笔记/实现wgs84投影-002
四叉树代码修改完善
原来的代码中,没有使用投影转换,直接使用的是世界坐标(单位是米),
CELLQuadTree::CELLQuadTree(
CELLTerrainInterface* pInterface
,CELLQuadTree* parent
,const real2 vStart
,const real2 vEnd
,int level
,ChildId corner)
{
_terrain = pInterface;
/// 这里使用y作为高度,因为如果是三维,后续初始化后应该使用高程数据填充
/// 初始化用0,
_aabb.setExtents(vStart.x, 0, vStart.y, vEnd.x, 0, vEnd.y);
real3 vXenter = _aabb.getCenter();
/// 这里计算经纬度,输入世界坐标转换成经纬度
real2 vLonLat = pInterface->spRef()->worldToLongLat(real2(vLonLat.x,vLonLat.z));
/// 调用接口根据经纬度计算出来瓦片的Id,加载瓦片会根据该id访问 网络/磁盘瓦片,例如 d:/data/vTileId.z/vTileId.x/vTileId.y.jpg
int3 vTileId = pInterface->spRef()->getKey(level,vWorld.x,vWorld.y);
_tileId._lev = level;
_tileId._col = vTileId.x;
_tileId._row = vTileId.y;
_cornerId = corner;
_parent = parent;
_vStart = vStart;
_vEnd = vEnd;
_childs[0] = 0;
_childs[1] = 0;
_childs[2] = 0;
_childs[3] = 0;
_uvStart = float2(0.0f, 0.0f);
_uvEnd = float2(1.0f, 1.0f); _terrain->getCounts()._nodes ++;
_flag = 0;
_flag &= ~FLAG_HAS_IMAGE;
/// 如果是没有父点,则说明是根节点,直接请求瓦片,不做处理
if (_parent == nullptr)
{
_terrain->request(this);
return;
}
/// 如果不是根节点,那么默认情况下是没有瓦片数据的,则使用父亲节点数据作为子节点的输入
/// 需要重新计算UV坐标,子节点的坐标应该是父节点的一半
float2 vHalf = (_parent->_uvEnd - _parent->_uvStart) * 0.5f;
float2 vCenter = (_parent->_uvStart + _parent->_uvEnd) * 0.5f;
_textureId = _parent->_textureId;
/// 不同的子节点,UV计算是不一样的
switch (corner)
{
case CHILD_LT:
_uvStart = vCenter - float2(vHalf.x,0);
_uvEnd = vCenter + float2(0,vHalf.y);
break;
case CHILD_RT:
_uvStart = vCenter;
_uvEnd = vCenter + vHalf;
break;
case CHILD_LB:
_uvStart = vCenter - vHalf;
_uvEnd = vCenter ;
break;
case CHILD_RB:
_uvStart = vCenter - float2(0,vHalf.y);
_uvEnd = vCenter + float2(vHalf.x,0);
break;
default:
break;
}
if (_parent->hasFlag(FLAG_HAS_IMAGE))
{
_flag |= FLAG_RENDER;
}
/// 重点:引用父节点数据
_textureId = _parent->_textureId;
_terrain->request(this);
}
上图:
当一张瓦片被分裂成四张后,会存一个问题,瓦片是否有数据,默认情况下,使用父节点的书作为子节点输入
纹理坐标如下代码:
switch (corner)
{
case CHILD_LT:
_uvStart = vCenter - float2(vHalf.x,0);
_uvEnd = vCenter + float2(0,vHalf.y);
break;
case CHILD_RT:
_uvStart = vCenter;
_uvEnd = vCenter + vHalf;
break;
case CHILD_LB:
_uvStart = vCenter - vHalf;
_uvEnd = vCenter ;
break;
case CHILD_RB:
_uvStart = vCenter - float2(0,vHalf.y);
_uvEnd = vCenter + float2(vHalf.x,0);
break;
default:
break;
}
瓦片裂分流程代码:
1 vSize = _aabb.getHalfSize();
2 _childs[CHILD_LT] = new CELLQuadTree(
3 _terrain
4 , this
5 ,real2(vCenter.x - vSize.x,vCenter.z)
6 ,real2(vCenter.x,vCenter.z + vSize.z)
7 ,(int)_tileId._lev + 1
8 ,CHILD_LT
9 );
10
11 _childs[CHILD_RT] = new CELLQuadTree(
12 _terrain
13 ,this
14 , real2(vCenter.x, vCenter.z)
15 , real2(vCenter.x + vSize.x, vCenter.z + vSize.z)
16 , (int)_tileId._lev + 1
17 , CHILD_RT
18 );
19
20 _childs[CHILD_LB] = new CELLQuadTree(
21 _terrain
22 , this
23 , real2(vCenter.x - vSize.x, vCenter.z - vSize.z)
24 , real2(vCenter.x, vCenter.z)
25 , (int)_tileId._lev + 1
26 , CHILD_LB
27 );
28 _childs[CHILD_RB] = new CELLQuadTree(
29 _terrain
30 , this
31 , real2(vCenter.x, vCenter.z - vSize.z)
32 , real2(vCenter.x + vSize.x, vCenter.z)
33 , (int)_tileId._lev + 1
34 , CHILD_RB
35 );
研发三维GIS系统笔记/实现wgs84投影-002的更多相关文章
- VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统
一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...
- 19个三维GIS软件对比
19个三维GIS软件对比 麦豆科研技术中心 days ago 我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方 ...
- 国内外主流的三维GIS软件
我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方向之一.上世纪八十年代末以来,空间信息三维可视化技术成为业界研 ...
- 3DEarth PPT :一款专为GIS系统研发的三维汇报演示系统
3DEarth PPT(三维地球汇报演示系统)又称 3DGis PPT,是专为GIS系统研发的三维汇报演示系统.对有3DGis系统的客户它可以作为一个组件(dll)嵌入原系统,对没有3DGis系统的客 ...
- 三维GIS引擎地图可视化渲染方案设计
1.GIS地图可视化流程 GIS地图可视化就是将空间数据转化为地图数据再进行交互处理的方法,下图一展示了地图可视化的可编程渲染的典型管道,原始空间数据必须处理为图形API支持基础图元用以地图渲染.下图 ...
- 开源(免费)三维 GIS(地形,游戏)
先写想法: 想做个简单的地形漫游,于是考虑在ww直接开发,或找个控件形式的开发组件. 最大的期望有: 1. 支持google的sketchup,快速智能三维建模 2. 设计模式做好点,最好先做成组件形 ...
- 数字孪生,数据驱动下的北京 CBD 智能楼宇三维可视化系统
前言 楼宇作为建筑基础设施的主体,为人们提供着重要的生存空间.随着物联网.人工智能概念的兴起以及智慧城市如火如荼的开展,智能楼宇的重要性越发突显. 随着城市现代化建设的发展,建筑的智能化,特别是公用建 ...
- 类似阿里双十一的可视化看板是怎么做的?无人机三维GIS看板也来了!
天猫双十一数据可视化看板 每年的双十一,天猫都会在整点时刻直播战绩,惊叹于可怕战绩的同时,也会被背后展示的数据大屏吸引,这样让人眼前一亮的可视化数据看板是怎么做出来的? 所谓可视化数据看板,就是挂在墙 ...
- Java web与web gis学习笔记(一)——Tomcat环境搭建
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- 绿色城市智慧运营:Web 3D 垃圾分类 GIS 系统
前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...
随机推荐
- 什么是hive的高级分组聚合,它的用法和注意事项以及性能分析
hive的高级分组聚合是指在聚合时使用GROUPING SETS.CUBE和ROLLUP的分组聚合. 高级分组聚合在很多数据库类SQL中都有出现,并非hive独有,这里只说明hive中的情况. 使用高 ...
- PostgreSQL 12 文档: 部分 VI. 参考
部分 VI. 参考 这份参考中的条目意欲提供关于相应主题的权威.完整和正式的总结.关于使用PostgreSQL的更多信息(以叙述.教程或例子的形式)可以在本书的其他部分找到.见每个参考页面上列出的交叉 ...
- 【Oracle】行转列的函数wm_concat,listagg,xmlagg,pivot以及动态行转列
[Oracle]行转列的几种情况 表的数据如下 朴实无华的函数 1.wm_concat 使用格式: select 分组字段,wm_concat(要转换的列名) from 表名 group by 分组字 ...
- VSCode隐藏一些非必要的文件
VSCode自动编译生成 .exe文件 很烦 所以要隐藏掉 文件,首选项,搜索 files.exclude 在后面添加 **/*.exe 即可
- 【WebRtc】获取音视频数据
首页截图 获取音视频 关键Code 获取摄像头数据 /** * 获取流数据 */ openUserMeida() { var that = this // 判断是否支持获取媒体数据 if (!navi ...
- 如何将Maven项目快速改造成一个java web项目(方式一)
因为实际需要,需要将一个maven项目改造成原生的java-web项目,写这边博客 来记录整个改造的过程.原始的maven项目,使用IDEA打开后,目录结构如下所示 直接通过文件夹查看项目结果如下 首 ...
- idea专业版和idea社区版整合Tomcat,并将war包部署
目录 一.idea专业版部署 二.idea社区版部署 三.错误案例 开发过程中,由于需要运用云平台,所以从新配置开发环境,其它或多或少有些许问题,但解决起来较为轻松.而对于部署注册中心Eureka时, ...
- springboot下使用rabbitMQ之开发配置方式(一)
springboot下使用rabbitMQ之开发配置方式(一) 距离上次发布博客已经小一年了,这次...嗯,没错,我又回来啦... 本次结合着B站某MQ视频以及最近在MQ上的实践聊一聊个人在使用rab ...
- Composer 镜像原理 (1) —— 初识 Composer
相关文章 Composer 镜像原理 (1) -- 初识 Composer Composer 镜像原理 (2) -- composer.json Composer 镜像原理 (3) -- 完结篇 何为 ...
- 基于GPT搭建私有知识库聊天机器人(六)仿chatGPT打字机效果
文章链接: 基于GPT搭建私有知识库聊天机器人(一)实现原理 基于GPT搭建私有知识库聊天机器人(二)环境安装 基于GPT搭建私有知识库聊天机器人(三)向量数据训练 基于GPT搭建私有知识库聊天机器人 ...

