基于Cesium实现无偏移无变形叠加多源数据的方法与流程

文档序号:31702894发布日期:2022-10-01 09:17阅读:691来源:国知局
基于Cesium实现无偏移无变形叠加多源数据的方法与流程
基于cesium实现无偏移无变形叠加多源数据的方法
技术领域
1.本发明属于地理信息技术领域,尤其涉及一种基于cesium实现无偏移无变形叠加多源数据的方法。


背景技术:

2.webgl(web graphics library,网络图形库)是一个开源免费、跨平台的三维图形api(application programming interface,应用程序编程接口),其主要作用是在浏览器端渲染三维数据,其特点是相较于以前的二维技术渲染更加高效,能够渲染数以亿计的三角网格,常应用于cad、虚拟现实、科学可视化程序等。其中cesium渲染引擎是基于webgl实现的三维地球和地图可视化库,它被设计用来显示三维gis(geographic information system,地理信息系统)数据,例如倾斜摄影数据、矢量数据、栅格数据以及地形数据等等。
3.cesium支持3d、2.5d和2d渲染模式,其默认的坐标系统是wgs84大地坐标系统,采用的投影方式为经纬度直投,这种投影的特点是变形极大,纬度越高,变形越大。虽然cesium有2.5d平面三维模式,但受限于其wgs84的基础坐标体系,并不能加载高斯坐标系下的三维gis数据。目前,高斯坐标系因其高斯投影无变形的特点仍广泛应用于工程项目上,所以加载该坐标系下的三维数据是一项十分迫切的需求,故需要实现一套能加载高斯坐标系数据的三维gis渲染引擎。因cesium广泛使用且开源的特点,故选择基于cesium实现高斯坐标系下三维gis数据加载的功能。


技术实现要素:

4.鉴于上述问题,本发明的目的在于提供一种基于cesium实现无偏移无变形叠加多源数据的方法,旨在解决现有cesium渲染引擎无法加载高斯坐标系数据的技术问题。
5.本发明采用如下技术方案:所述基于cesium实现无偏移无变形叠加多源数据的方法,包括下述步骤:步骤s1、在cesium场景模式中配置高斯坐标系的基准数据范围;步骤s2、建立高斯坐标系和笛卡尔坐标系之间的转换接口;步骤s3、设置金字塔加载方案;步骤s4、对于接收到的待加载多源数据,如果多源数据为模型数据或矢量数据,则进行预处理;步骤s5、在高斯坐标系下,根据多源数据类型选择调用转换接口或金字塔加载方案进行数据加载。
6.进一步的,步骤s1中,所述基准数据范围表示一个矩形范围,取多源数据中范围最大的一个,所述基准数据范围表示一个矩形范围,取多源数据中范围最大的一个,包括四个值,分别为最小x值xmin、最小y值ymin、最大x值xmax,最大y值ymax。
7.进一步的,步骤s2中,所述转换接口包括高斯坐标系向笛卡尔坐标系转换的正算接口,以及笛卡尔坐标系向高斯坐标系转换的反算接口;所述正算接口处理过程为:首先通
过经纬度直投的投影方式将高斯坐标转化为地理坐标,然后再将地理坐标系转化为笛卡尔坐标;所述反算接口处理过程为:首先将笛卡尔坐标转换为地理坐标,然后将地理坐标通过经纬度直投的方式换算到高斯坐标;其中正算接口处理过程具体如下:201、设平移基准点[0, 0],对多源数据的高斯坐标进行投影计算:x = r * x0y = r * y0其中r是地球的长半径,x0和y0是多源数据的高斯x坐标、y坐标;202、计算坐标平移量:tx = (e.xmin+e.xmax) /2

xty = (e.xmin+e.xmax) /2

y其中e是基准数据范围;203、计算平移后的坐标:ax = gx

txay = gy

ty204、反投影计算:cx = ax / rcy = ay / r205、计算得到笛卡尔坐标:通过cesium提供的接口cartesian.fromradians(cx, cy)计算得到笛卡尔坐标c;其中反算接口处理过程具体如下:211、转换地理坐标:利用cesium提供的接口cartesian.toradians(c)将笛卡尔坐标转换到地理坐标carto;212、 对地理坐标carto进行投影计算:x
’ꢀ
= carto.x * ry
’ꢀ
= carto.y * r213、计算高斯坐标:gx = x
’ꢀ
+ txgy = y
’ꢀ
+ ty 。
[0008]
进一步的,所述步骤s3具体过程如下:s31、利用基准数据范围结合地图中心点计算偏移量:311. 对地图中心点进行投影计算:x" = r * x1y" = r * y1其中x1和y1即为中心点x坐标和y坐标;312. 计算坐标平移量:tx" = (e.xmin+e.xmax) /2

x"ty" = (e.ymin+e.ymax) /2

y"
其中e为基准数据范围;s32、对传入的数据范围进行偏移量的叠加操作,得到了一个新的数据范围:e1".xmin = e1.xmin
ꢀ–ꢀ
tx"e1".xmax = e1.xmax
ꢀ–ꢀ
tx"e1".ymin = e1.ymin
ꢀ–ꢀ
ty"e1".ymax = e1.ymax
ꢀ–ꢀ
ty"e1为传入的数据范围,e1"为新的数据范围。
[0009]
进一步的,步骤s4中,模型数据的预处理过如下:将模型数据建模顶点坐标采用正算接口转化为笛卡尔坐标;矢量数据的预处理过如下:对矢量数据设置数据范围。
[0010]
进一步的,步骤s5中,如果多源数据为栅格数据,则根据金字塔加载方案得到正确的地图瓦片数据范围,并根据栅格服务地址发起请求进行加载;如果多源数据为地形数据,则根据金字塔加载方案得到正确的地形数据范围,并根据地形服务地址进行渲染地形;如果多源数据为矢量数据,根据设置的数据范围,调用正算接口将矢量数据的坐标转为笛卡尔坐标;如果多源数据为模型数据,则从请求到的模型描述文件中的矩阵中抽取平移值,然后将该平移值组合成笛卡尔坐标,通过反算接口转换成高斯坐标,即得到了高斯坐标体系下模型的真实坐标。
[0011]
本发明的有益效果是:本发明通过建立高斯坐标系和笛卡尔坐标系之间的转换接口,并设置金字塔加载方案,将场景移动到地图中心坐标为0的地方,可以充分利用赤道处无变形的特点来达到还原数据真实性的效果,最后根据不同类型多源数据采用相应方案进行加载,最终达到了数据叠加无偏移无变形的效果,满足了实际工程的需求。
附图说明
[0012]
图1是本发明实施例提供的基于cesium实现无偏移无变形叠加多源数据的方法的流程图。
具体实施方式
[0013]
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0014]
cesium受限于其特定的坐标系统,本身是不能加载高斯坐标系的数据,并且cesium采用的是经纬度直投的投影方式,这种投影的特点是变形极大,纬度越高,变形越大。为了能加载高斯坐标系下的三维数据,本发明提供了一种基于cesium实现的无偏移无变形叠加高斯坐标下多源三维gis数据的方法。
[0015]
为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。
[0016]
图1示出了本发明实施例提供的基于cesium实现无偏移无变形叠加多源数据的方法的流程,为了便于说明仅示出了与本发明实施例相关的部分。
[0017]
所述基于cesium实现无偏移无变形叠加多源数据的方法,包括下述步骤:步骤s1、在cesium场景模式中配置高斯坐标系的基准数据范围。
[0018]
首先本步骤通过场景对象新增一个场景模式,具体操作时,通过场景对象viewer
下挂载localmode属性,用户设置此属性即表明开启本地模式,业务上为加载高斯坐标系数据做准备。设置localmode属性开启本地模式后,本实施例可实现多源数据的加载功能。
[0019]
另外,本步骤还需配置一个全局的基准数据范围,该基准数据范围为后续计算平移量作为依据。具体操作时,可在场景对象viewer下挂载localextent属性,其表示的是一个矩形范围,包含有四个值:xmin、yminy、xmax、ymax,即最小x值、最小y值、最大x值,最大y值。该属性的值取自多源数据,即栅格数据、矢量数据、地形数据、模型数据中范围最大的一个,比如地形数据的范围最大,则取它的范围作为基准数据范围。
[0020]
步骤s2、建立高斯坐标系和笛卡尔坐标系之间的转换接口。
[0021]
cesium的坐标框架是空间直角坐标系,属于笛卡尔坐标的一种,故其输入坐标是笛卡尔坐标,加载高斯坐标系数据前提是需要支持高斯坐标的输入,因此需要将高斯坐标系转化为笛卡尔坐标系。
[0022]
其中高斯坐标转笛卡尔坐标属于正算,操作时在笛卡尔类cartesian类中增加接口cartesian.fromgauss,即正算接口,具体通过经纬度直投的投影方式将高斯坐标转化为地理坐标,然后再将地理坐标系转化为笛卡尔坐标。
[0023]
接口cartesian.fromgauss有三个参数,x0、 y0、e,表达式为cartesian.fromgauss(x0, y0, e),x0和y0是输入的多源数据高斯坐标,e为所述的基准数据范围。
[0024]
正算接口处理过程具体如下:201、设平移基准点[0, 0],对多源数据的高斯坐标进行投影计算:x = r * x0y = r * y0其中r是地球的长半径,x0和y0是多源数据的高斯x坐标、y坐标;202、计算坐标平移量:tx = (e.xmin+e.xmax) /2

xty = (e.xmin+e.xmax) /2

y其中e是基准数据范围;203、计算平移后的坐标:ax = gx

txay = gy

ty204、反投影计算;cx = ax / rcy = ay / r205、计算得到笛卡尔坐标:通过cesium提供的接口cartesian.fromradians(cx, cy)计算得到笛卡尔坐标。cartesian.fromradians是弧度坐标转笛卡尔坐标的接口,cesium系统自带接口。
[0025]
笛卡尔坐标转高斯坐标属于反算,操作时对应再笛卡尔类cartesian类中增加接口cartesian.togauss,即反算接口,其步骤与正算步骤是相反的,即先将笛卡尔坐标转换为地理坐标,然后将地理坐标通过经纬度直投的方式换算到高斯坐标。
[0026]
反算接口的表达式是cartesian.togauss(c, e),其中c是输入的笛卡尔坐标,e是
基准数据范围。
[0027]
反算接口处理过程具体如下:211、转换地理坐标:利用cesium提供的接口cartesian.toradians(c)将笛卡尔坐标转换到地理坐标carto;212、 对地理坐标carto进行投影计算:x' = carto.x * ry' = carto.y * r213、计算高斯坐标:gx = x
’ꢀ
+ txgy = y
’ꢀ
+ ty 。
[0028]
步骤s3、设置金字塔加载方案。
[0029]
栅格服务和地形服务的加载都要依托金字塔方案,如常见的web墨卡托投影金字塔方案,可加载基于wgs84坐标的地图服务。
[0030]
本步骤设置的金字塔加载方案用于加载高斯坐标系下的栅格数据和地形数据。具体操作时,首先声明金字塔方案类customtillingscheme,金字塔方案类的构造函数需要传入场景对象viewer,地图切片每级分辨率组成的分辨率数组resolutions,发布地图服务的数据范围dataextent。然后实现投影project和反投影unproject接口,其具体实现即是采用高斯坐标和笛卡尔坐标的正算接口和反算接口。最后重新计算数据范围。
[0031]
重新计算数据范围具体操作是:先将场景移动到地图中心点即坐标为0的地方,即利用基准数据范围结合地图中心点计算偏移量;对传入的数据范围进行偏移量的叠加操作,得到了一个新的数据范围。本步骤中,利用场景对象viewer中的localextent属性结合地图中心点(即坐标为0的点)计算偏移量,然后对金字塔加载方案传入的数据范围dataextent进行偏移量的叠加操作,即得到了一个新的数据范围。将场景移动到地图中心坐标为0的地方可以充分利用赤道处无变形的特点来达到还原数据真实性的目的。
[0032]
具体的:s31、首先通过基准数据范围结合地图中心点计算偏移量。
[0033]
地图中心点位也是场景平移后所处的位置,其具体含义是本初子午线和赤道的交点,在该点附近地图是没有变形的,利用该特性即达到了加载高斯场景无变形的目的。其中有一个比较重要的概念就是偏移量,其含义就是将高斯坐标场景进行移动所需要的移动的距离,其具体计算过程是:311. 对地图中心点进行投影计算:x" = r * x1y" = r * y1其中x1和y1即为中心点x坐标和y坐标;312. 计算坐标平移量:tx" = (e.xmin+e.xmax) /2

x"ty" = (e.ymin+e.ymax) /2

y"其中e为基准数据范围。
[0034]
s32、对传入的数据范围进行偏移量的叠加操作,得到了一个新的数据范围。
[0035]
加载诸如地形数据和栅格数据时,需要创建自定义金字塔方案对象,创建该对象时需要输入具体数据的数据范围,用以计算其平移后的数据范围。其方法就是将输入的数据范围与平移量相减。基体计算如下:e1".xmin = e1.xmin
ꢀ–ꢀ
tx"e1".xmax = e1.xmax
ꢀ–ꢀ
tx"e1".ymin = e1.ymin
ꢀ–ꢀ
ty"e1".ymax = e1.ymax
ꢀ–ꢀ
ty"e1为传入的数据范围,e1"为新的数据范围。
[0036]
步骤s4、对于接收到的待加载多源数据,如果多源数据为模型数据或矢量数据,则进行预处理。
[0037]
本步骤只预处理模型数据和矢量数据以适配高斯场景,栅格数据和地形数据无需做特殊处理,正常发布服务即可。
[0038]
对于模型数据,其在建模的时候对于顶点的生成有两种建模方式,一种是建模中心点位于原点处,但其顶点均需使用高斯坐标下的坐标来进行建模赋值;另一种是建模中心点是真实的高斯坐标系坐标,然后顶点设置为相对于该坐标的相对坐标。采用这两种方式建模的模型数据,需要对模型顶点坐标进行处理,即采用高斯坐标转笛卡尔坐标的正算接口将顶点坐标转化为笛卡尔坐标,用以重新计算模型包围盒和父子节点的转换矩阵。
[0039]
对于矢量数据,需要对其增加属性,即增加属性localextent,其值是该矢量数据的数据范围。目的是在运行时判断数据是否是高斯数据,如果是则借助设置的localextent属性将高斯坐标换算至笛卡尔坐标以期得到正确的渲染结果。
[0040]
步骤s5、在高斯坐标系下,根据多源数据类型选择调用转换接口或金字塔加载方案进行数据加载。
[0041]
本步骤需要针对不同类型的多源数据采用相应方案。多源数据有栅格数据、矢量数据、地形数据、模型数据等。
[0042]
本实施例在具体操作时,通过设置customtileimageryprovider类用于栅格数据的加载,其构造函数需要传入自定义金字塔方案customtillingscheme、栅格服务地址;设置 customterrainprovider类用于地形数据的加载,需要传入参数为自定义金字塔方案customtillingscheme和地形服务地址;设置customgeojsondatasourceprovider类用于矢量数据的加载,需要传入矢量数据的服务地址;设置customtilesetprovider类用于模型数据的加载。
[0043]
如果多源数据为栅格数据, cesium渲染引擎根据金字塔加载方案得到正确的地图瓦片数据范围,并根据栅格服务地址发起请求进行加载。
[0044]
如果多源数据为地形数据,则cesium渲染引擎根据金字塔加载方案得到正确的地形数据范围,并根据地形服务地址进行渲染地形。
[0045]
如果多源数据为矢量数据,无需传入金字塔方案,根据设置的数据范围,调用正算接口将矢量数据的坐标转为笛卡尔坐标。具体操作时,设置gausscrsfunction接口,是替换cesium已有的矢量数据坐标转笛卡尔坐标的接口,gausscrsfunction接口传入之前预处理时设置的localextent属性,然后调用之前高斯坐标转笛卡尔坐标的正算接口来将这些矢
量数据的坐标转为笛卡尔坐标以供cesium渲染引擎使用。
[0046]
如果多源数据为模型数据,无需传入金字塔方案,设置实现重定位relocate接口用以计算模型真实的位置并定位,具体操作从请求到的模型描述文件中的矩阵中抽取平移值,然后将该平移值组合成笛卡尔坐标,通过反算接口转换成高斯坐标,即得到了高斯坐标体系下模型的真实坐标。这里模型描述文件是一个json文件,名称为tileset.json,其内部有一个名为transform的属性节点,表示的是模型的转换矩阵,是4
×
4的四阶矩阵,它是模型旋转平移缩放的整合,其中矩阵中第四列的前三个数即为平移值。
[0047]
因此本步骤通过四种类型的多源数据通过对应的定义类来执行加载操作。
[0048]
综上,由于cesium目前仅能加载wgs84坐标系下的三维数据,且其2.5d的平面三维模式因投影方式的问题变形极大,本发明提供了一种能加载高斯坐标系多源三维数据的方法,可保证这些数据如栅格数据、矢量数据、地形数据和模型数据在叠加后的位置准确无偏移,能够保证其加载后不变形,满足实际工程需求。
[0049]
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1