研发三维GIS系统笔记/实现wgs84投影-001
1. 工作内容,改造引擎,支持wgs84投影
改造原因:目前投影是墨卡托投影(与Google Map一致) 目前的GIS系统是二维的采用这个坐标系是没有问题的
但不支持wgs84瓦片数据以及高程数据,工作中很多数据是wgs84格式的,尤其很多三维GIS都是采用wgs84投影

wgs84 与mercator 从数据上看,就是跟节点是一个与两个的区别(长方形)

下图Mercator 投影(zhengfangxing)

2. 对现有接口进行抽象,目的是向下兼容原有的引擎(Mercator)投影
抽象类如下定义:
class CELLSpRef
{
public: /// <summary>
/// 经纬度转化为世界坐标
/// </summary>
virtual real2 longLatToWorld(const real2& longLatx) = 0;
/// <summary>
/// 世界坐标转化为经纬度
/// </summary>
virtual real2 worldToLongLat(const real2& world) = 0;
/// <summary>
/// 给定经纬度返回对应的瓦片Id
/// </summary>
virtual int3 getKey(unsigned l,real rLong,real rLat) = 0; };
3. wgs84投影类实现如下:
1 class CELLWgs842d :public CELLSpRef
2 {
3 public:
4 /// <summary>
5 /// 经纬度转化为世界坐标
6 /// </summary>
7 virtual real2 longLatToWorld(const real2& longLatx) override
8 {
9 real2 world;
10 world.x = longLatx.x * WGS_84_RADIUS_EQUATOR;
11 world.y = longLatx.y * WGS_84_RADIUS_EQUATOR;
12 return world;
13 }
14
15 /// <summary>
16 /// 世界坐标转化为经纬度
17 /// </summary>
18 virtual real2 worldToLongLat(const real2& world) override
19 {
20 real2 lonlat;
21 lonlat.x = world.x / WGS_84_RADIUS_EQUATOR;
22 lonlat.y = world.y / WGS_84_RADIUS_EQUATOR;
23 return lonlat;
24 }
25
26 /// <summary>
27 /// 给定经纬度返回对应的瓦片Id
28 /// </summary>
29 virtual int3 getKey(unsigned level, real rLong,real rLat) override
30 {
31 /// 当下版本还在实现中
32 return int3(0,0,level);
33 }
34 };
4. 适配引擎代码
引擎中原来直接调用了Mercator投影,现在需要统一接口,在引擎类中增加一个获取投影接口的类
1 class CELLTerrainInterface
2 {
3 public:
4 virtual ~CELLTerrainInterface()
5 {}
6 /// <summary>
7 /// 创建纹理
8 /// </summary>
9 virtual uint createTexture(const TileId& id) = 0;
10 /// <summary>
11 /// 释放纹理
12 /// </summary>
13 virtual void request(CELLQuadTree* node) = 0;
14
15 /// <summary>
16 /// 释放纹理
17 /// </summary>
18 virtual void cancelRequest(CELLQuadTree* node) = 0;
19
20 /// <summary>
21 /// 释放纹理
22 /// </summary>
23 virtual void releaseTexture(uint texId) = 0;
24
25 /// <summary>
26 /// 获取统计信息
27 /// </summary>
28
29 virtual Counts& getCounts() = 0;
30
31 /// <summary>
32 /// 获取投影,具体使用什么类型的投影,由具体实现决定
33 /// </summary>
34 virtual CELLSpRef* spRef() = 0;
35
36
37 };
5. 改造调用了投影接口的代码
主要集中在四叉树部分,四叉树根据输入的世界坐标创建瓦片,同时根据也是子节点以及其他后代节点裂分的根据。
6. 改造引擎根节点
墨卡托投影下,四叉树的根节点只有一个,现在有两个(wgs84投影)
代码如下:
1 auto root0 = new CELLQuadTree( this
2 , 0
3 , real2(-PI * WGS_84_RADIUS_EQUATOR, -HALF_PI * WGS_84_RADIUS_EQUATOR)
4 , real2(0, +HALF_PI * WGS_84_RADIUS_EQUATOR)
5 , 0
6 , CELLQuadTree::CHILD_LT
7 );
8 auto root1 = new CELLQuadTree( this
9 , 0
10 , real2(0, -HALF_PI * WGS_84_RADIUS_EQUATOR)
11 , real2(-PI * WGS_84_RADIUS_EQUATOR, +HALF_PI * WGS_84_RADIUS_EQUATOR)
12 , 0
13 , CELLQuadTree::CHILD_LT
14 );
15
16 _roots.push_back(root0);
17 _roots.push_back(root1);
研发三维GIS系统笔记/实现wgs84投影-001的更多相关文章
- 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 系统
前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...
随机推荐
- CKS 考试题整理 (07)-RBAC - RoleBinding
Context 绑定到 Pod 的 ServiceAccount 的 Role 授予过度宽松的权限,完成以下项目以减少权限集. Task 一个名为 web-pod 的现有 Pod 已在 namespa ...
- @Inherited元注解的使用
@Inherited注解标记其他的注解用于指明标记的注解是可以被自动继承的. 注意:此注解只对注解标记的超类有效,对接口是无效的. 示例: 先声明两个用@Inherited标记的注解,@Name和@A ...
- Python与TensorFlow:如何高效地构建和训练机器学习模型
目录 标题:<Python 与 TensorFlow:如何高效地构建和训练机器学习模型> 一.引言 随着人工智能的快速发展,机器学习作为其中的一个重要分支,受到了越来越多的关注和应用.而P ...
- RabbitMQ升级过程以及问题解决
1.卸载MQ 如果安装过MQ需先彻底卸载ERlangOTP与rabbitMQ,卸载步骤如下 1. 停止RabbitMQ服务 2. 在控制面板中卸载Erlang与RabbitMQ 3. 删除C:\ ...
- PhotoShop AI 爱国版保姆级安装和使用
上篇Photoshop AI 令人惊叹的生成式填充介绍了 PhotoShop AI 的新特性功能,有人以为我收了 Adobe 公司的钱帮它们做推广~~~.别不信,事实上确有其事,某平台审核直接把它删掉 ...
- Word转换HTML(Java实用版)
前言: 在业务中,如果需要在浏览器中预览Word文档,或者需要将Word文档转成HTML文件保存,那么本章内容,可以帮助到你. 实现这一功能,有多种实现方式,如:docx4j.poi.Free Spi ...
- mysql根据.frm和.ibd文件恢复数据表
忠人之事受人之托 起因是因为一位朋友的数据库服务器被重装了,只剩下一个zbp_post.frm和zbp_post.ibd文件.咨询我能不能恢复,确实我只用过mysqldump这种工具导出数据 然后进行 ...
- QLabel类中的常用方法&信号
setAlignment: 按固定值方式对齐文本 Qt.AlignLeft:水平方向靠左对齐 Qt.AlignRight:水平方向靠右对齐 Qt.AlignCenter:水平方向居中对齐 Qt.Ali ...
- webpack是如何处理css/less资源的呢
上一篇文章 体验了webpack的打包过程,其中js文件不需要我们手动配置就可以成功解析,可其它类型的文件,比如css.less呢? css-loader 首先,创建一个空文件夹,通过 npm ini ...
- [ansible]常用内置模块
前言 ansible内置了很多模块,常用的并不多,可以通过ansible -l命令列出所有模块,使用 ansible-doc module-name 查看指定模块的帮助文档,例如:ansible-do ...