研发三维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 系统
前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...
随机推荐
- navicate的安装使用
1 navicat概述 Navicat for MySQL 是管理和开发 MySQL 或 MariaDB 的理想解决方案. 这套全面的前端工具为数据库管理.开发和维护提供了一款直观而强大的图形界面. ...
- 基于JavaFX的扫雷游戏实现(三)——交互逻辑
相信阅读过上期文章,动手能力强的朋友们已经自己跑出来界面了.所以这期我要讲的是交互部分,也就是对于鼠标点击事件的响应,包括计时计数对点击事件以及一些状态量的影响. 回忆下第一期介绍的扫雷规则和 ...
- 吴恩达优化算法 (Optimization algorithms)笔记
Mini-batch 梯度下降(Mini-batch gradient descent) 使用batch梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用mini-batch梯度下降法,一次遍历训 ...
- 我用numpy实现了VIT,手写vision transformer, 可在树莓派上运行,在hugging face上训练模型保存参数成numpy格式,纯numpy实现
先复制一点知乎上的内容 按照上面的流程图,一个ViT block可以分为以下几个步骤 (1) patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patc ...
- 【SpringBoot】注解
Controller - @RestController - @RequestMapping("/path") Controller内方法 @GetMapping("/p ...
- Python根目录中没有Scripts文件夹问题
电脑版本是win10,配置好python的环境变量,确保可以运行python命令. 1.打开cmd命令行输入 python -m ensurepip 2.查看Python根目录下,有没有新生成Scri ...
- 现代C++(Modern C++)基本用法实践:三、移动语义
概述 移动 移动(move)语义C++引入了一种新的内存优化,以避免不必要的拷贝.在构造或者赋值的时候,如果实参是右值(或者左值由std::move转换成右值),便会匹配移动语义的函数调用如下述举例的 ...
- 【转载】AF_XDP技术详解
原文信息 作者:rexrock 出处:https://rexrock.github.io/post/af_xdp1/ 目录 1. 用户态程序 1.1 创建AF_XDP的socket 1.2 为UMEM ...
- 基于ClickHouse解决活动海量数据问题
1.背景 魔笛活动平台要记录每个活动的用户行为数据,帮助客服.运营.产品.研发等快速处理客诉.解决线上问题并进行相关数据分析和报警.可以预见到需要存储和分析海量数据,预估至少几十亿甚至上百亿的数据量, ...
- 论文翻译: FREEVC:朝着高质量、无文本、单次转换声音的目标迈进
原文:FREEVC: TOWARDS HIGH-QUALITY TEXT-FREE ONE-SHOT VOICE CONVERSION 原文地址:https://ieeexplore.ieee.org ...

