研发三维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 系统
前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...
随机推荐
- 尚医通day13【预约挂号】(内附源码)
页面预览 预约挂号 根据预约周期,展示可预约日期,根据有号.无号.约满等状态展示不同颜色,以示区分 可预约最后一个日期为即将放号日期 选择一个日期展示当天可预约列表 预约确认 第01章-预约挂号 接口 ...
- Ubuntu系统字体命令和字体的安装
本人使用的是Windows 10下的WSL,Linux版本是Ubuntu18.04,系统原始是没有安装任何字体的,mkfontscale.mkfontdir和fc-cache命令也是不存在的,直接运行 ...
- 2023-07-10:Kafka如何做到消息不丢失?
2023-07-10:Kafka如何做到消息不丢失? 答案2023-07-10: Kafka采用多种机制来确保消息的不丢失,其中包括副本机制.ISR(In-Sync Replicas)机制以及ACK机 ...
- requests的基础使用
爬虫介绍 # 爬虫:又称网络蜘蛛,spider,一堆程序,从互联网中抓取数据---->数据清洗---->入库 # 爬虫需要掌握的知识 -抓取数据:发送网络请求(http),获得响应(htt ...
- 【转载】Linux虚拟化KVM-Qemu分析(六)之中断虚拟化
原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...
- 分享我的 Shell 环境,git 操作效率提升 100% !
每当我换到一个新的开发环境,蛮多东西要折腾的.比如 git.golang.环境变量等等.所以特地整理了一下,下次换新电脑也方便. 本文分享我在工作中常用的环境变量 + Shell alias:比如 ...
- 2021-7-12 VUE的生命周期
挂载: beforeCreate created beforeMount mounted:el挂载到实例上时运行 更新: beforeUpdate updated 销毁: beforeDestory ...
- CF1855B Longest Divisors Interval 题解
题意: 给定一个数 \(n\),求一个连续区间 \([l,r]\) 使得 \(n\) 是区间内每个数的倍数,最大化这个区间的长度(多组数据). 思路: 逆向思考一波,( 如果一个数 \(x\) 不是 ...
- python: linux使用多版本python
安装python3.6 $ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt update $ sudo apt install python ...
- vlunhub笔记(一)deathnote
(一)查询靶机ip 通过 arp-scan -l 查询目标靶机ip,查询结果如下图红框所示. (二)信息收集 直接访问目标ip,发现无法访问,只返回网站域名. 网站返回域名,就将该域名添加进hosts ...