首页 > 其他分享 >研发三维GIS系统笔记/实现wgs84投影-001

研发三维GIS系统笔记/实现wgs84投影-001

时间:2023-10-08 09:16:54浏览次数:41  
标签:wgs84 EQUATOR 投影 virtual 001 WGS GIS real2 84

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);

 

标签:wgs84,EQUATOR,投影,virtual,001,WGS,GIS,real2,84
From: https://www.cnblogs.com/FastEarth/p/17748016.html

相关文章

  • 001二次函数顶点坐标公式怎么求
    (1)二次函数的定义式和图像一般地,把等号右边自变量的最高次数是2的函数叫做二次函数,其表达式有三种:1、一般式:f(x)=ax²+bx+c(a、b、c是常数),x为自变量,其中a称为二次项系数,b为一次项系数,c为常数项。二次函数的图像是开口向上或者向下的抛物线,二次项系数a决定二次函数图像的开......
  • Logisim学习笔记
    教程计算机硬件系统设计(基于Logisim)-华中科技大学.谭志虎demo从零开始demo菜单->分析电路:(与Multisim有何不同?)todo......
  • P1025 [NOIP2001 提高组] 数的划分 题解
    题目传送门本题共有两种方法,分别是递归深搜和动态规划方法一:递归深搜Solution从小到大一一枚举每一个划分的数,。只要找到一种方案就记录,具体细节代码中有注释。Code#include<bits/stdc++.h>usingnamespacestd;intn,k,ans;voiddfs(intstart,intstep,intsum){......
  • ArcGIS地图投影与坐标系转换的方法
      本文介绍在ArcMap软件中,对矢量图层或栅格图层进行投影(即将地理坐标系转为投影坐标系)的原理与操作方法。  首先,地理坐标系与投影坐标系最简单的区别就是,地理坐标系用经度、纬度作为空间衡量指标,而投影坐标系用米、千米等长度单位作为空间衡量指标。  在GIS处理中,将原本为......
  • 高效管理体验?试试docker registry连接
    Linux本地DockerRegistry本地镜像仓库远程连接DockerRegistry本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pullorpush(拉取和推送)镜像,不受本地局域网限制!1.部署DockerRegistry使用官网安装方式,docker命令一键启动,该命令启动一个registry的容器,版本是2,......
  • 数字孪生结合GIS能够在公共交通领域作出什么贡献?
    数字孪生结合地理信息系统(GIS)在公共交通领域具有潜在的重大贡献,这种结合可以帮助城市更高效地规划、运营和改进公共交通系统。以下是一些关键方面的讨论,以说明数字孪生和GIS在这一领域的作用:数字孪生技术的兴起为公共交通系统提供了全新的工具。通过数字孪生,城市可以创建现实世界......
  • RegisterApplicationRestart 重启进程api 注意事项
    若要注册要重启的应用程序,请调用RegisterApplicationRestart函数。Windows错误报告(WER)如果应用程序至少运行了60秒,然后才无响应或遇到未经处理的异常,则会重启应用程序。https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-registerapplication......
  • ArcGIS Pro 3创建Python环境失败的解决方法
    当使用ArcGISPro的包管理器创建新的Python环境时,遇到以下错误提示,无法成功创建。permissionError:[Errno13]Permissiondenied:'C:\\ProgramFiles\\ArcGIS\\Pro\\bin\\Python\\envs\\arcgispro-py3\\etc\\jupyter\\jupyter_notebook_config.json'解决方法:重启ArcGISPro......
  • 【SqlServer系列】001、SELECT语句
     SELECT语句 1、 1基本的select语句1、1、1从表中选择列selecta,bfromtable1、 1、2选择所有列select*fromtable  1、 2 where子句1、2、1 null值注意: 在搜索条件中有null数据时可能会出现unknown值。null值不同于空白或0,只表示值未知。并......
  • R语言用普通最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类|附代码数
    原文链接:http://tecdat.cn/?p=21379 原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于回归的研究报告,包括一些图形和统计输出。本文我们对逻辑回归和样条曲线进行介绍。logistic回归基于以下假设:给定协变量x,Y具有伯努利分布,  目的是估计参数β。回想一下,针对该......