osgEarth数据加载及组织解析.docx
《osgEarth数据加载及组织解析.docx》由会员分享,可在线阅读,更多相关《osgEarth数据加载及组织解析.docx(16页珍藏版)》请在冰豆网上搜索。
osgEarth数据加载及组织解析
osgEarth数据加载及组织解析
1.osgEarth的数据加载流程
由前文可知,用户可以使用osgEarth自己的earth文件,简单指定各种数据源,而不用关心数据如何渲染,便能在三维球上显示各种地形数据。
本节,将会解读osgEarth如何解析earth文件,利用用户提供的数据源,来构建三维球上的各种地形。
图3.1所示是加载数据的整体流程,本节将就这四个步骤进行具体的解读。
图3.1osgEarth数据加载整体流程
1.1读取earth文件
osgEarth继承了OSG的插件机制,所以osgEarth提供了专门读取earth文件的osgdb_earth插件。
通过查找并调用此插件,达到读取earh文件的目的。
图3.2展示了查找读取earth插件的具体流程:
图3.2查找读取earth插件的具体流程
这个具体流程展示了osgEarth如何找到读取earth的插件osgdb_earth.dll。
这个流程其实也是osg插件机制中的具体流程,主要在read函数中根据文件后缀名查找读写插件,查找策略见前文2.1.3的OSG插件机制,找到插件后便根据文件名构建ReadNodeFunctor的仿函数,然后调用doRead()函数来具体读取。
无论读取earth文件,还是读取影像数据、高程数据或一般的文字,都是这样一个流程,通过找到具体插件后调用插件里的doRead函数。
在osgdb_earth中,主要就是将earth文件中的内容转换成后面构造map需要的conf对象。
图3.3展示了一个包含标签比较全面的earth文件,图3.4为转换后的conf结果结构图:
-tt--'■-=nhs"r.:
r==''bm门门f、i_t」r>'--^-=---=ii■;ii<.
=frl?
-flndri,FfiT:
=Marlalr,>
,,/riatia/inwo«/17L-34-35-1095-1095/0.tif
<£eatuze3nanue^buiLAIbqs17[ijrlvei:
=natjr">
・・/data/bofiton_buildin7B_utnil9kalip
al_inde:
451ilesizefac^QT>
oelectcrGlass-"hoildingsH1/>
"F匸ion普》
图3.3普通earth文件内部代码
图3.4earth文件转换后的conf对象结构图
如图所示,将earth文件中的标签转换成就conf对象就是将标签语言的嵌套转换成父子关系,然后每个对象包含自己的属性值。
1.2构建map
由上一节可知,通过earth插件,将earth文件中的数据属性,渲染属性等构成conf对象。
接下来,就是根据这些属性,来构造一个包含影像、高程、模型等的map。
图3.5展示了osgEarth构造map流程:
EarthFileSerializer2.cpp
MaskLayer.h
图3.5通过属性构造map对象
由图可知,此时构造的map,并没有实际的读取数据,仅仅是将从earth文件中获取的conf对象属性进行分类,构造了一个逻辑map,主要指定了map包含什么图层,每个图层的名字、数据源和所需driver插件。
1.3构建mapNode
这一步将是加载数据中的重点。
在这一步,将会通过上一步获取的map对
象及options对象,调用具体的driver插件,来构成地形节点。
构建mapNode的过程可以分为两步,第一步是在osgViewer(OSG最基本
的场景图形浏览器,osgEarth最基本的场景图形浏览器是在osgViewer基础上改进的osgEarth_viewer,其主要是加载组织地形数据等,核心渲染功能还是osgViewer)渲染前的预处理,主要在地形引擎的prelnitialize()中完成。
osgEarth2.4的默认地形引擎为MpterrainEngineNode,所以一般是在
MpterrainEngineNode:
:
prelnitialize()中完成第一步。
这其中,主要完成地形节点的初步框架构建,及底图影像的加载。
如图3.6所示
图3.6构建mapNode第一步逻辑
第二步便是在osgviewer开始渲染,创建漫游,相机开始添加场景时,进行后续的添加,并使用TileKey管理构建四叉树组织。
此时根据视点范围及距离,通过OSG的PagedLOD分页机制,动态调度选择加载区域瓦片节点。
关于数据如何按四叉树进行组织,分页LOD如何动态调度选择加载数据将在后文进行详细解读。
此处主要关注构建mapNode的流程和最后mapNode的逻辑节点树。
如图3.7所示。
图3.7构建mapNode第二步逻辑
F面便来解读每一步的详细流程。
图3.8构建mapNode第一步详细流程
图3.8展示的是构建mapNode第一步的详细流程,最后生成包含了地形节点、模型节点和overlay模型节点的子树。
其中,在根据map的空间参考坐标系设置TerrainEngineNode的坐标系和椭球模型时,map对象有获取profile属性。
Profile是确定数据的空间信息重要属性,其如何确定数据的空间信息将在后文进行详细说明。
若map对象的options中没有设置profile,默认将其中的SRS(空间参考系)设置为WGS84坐标系。
图3.9构建mapNode第二步详细流程
图3.9展示的是构建mapNode第二步详细流程。
此处只挑出了重点的函数,主要创建了第一层的TileKey和根节点。
每个rootNode包含四叉树索引组织的key,包括范围信息等,然后还包含这块范围的各种数据,所以,创建根节点的createRootNode将是我们下面分析的重点。
图3.10创建根节点的逻辑流程
图3.10展示的是创建根节点的逻辑流程。
由图可知,归纳为做了两件事,第一件即创建了包含影像图层、高程图层及TileKey的瓦片模型,第二件事是将这个模型以PagedLOD形式加入根节点。
其中TileKey包含模型的空间信息,能正确确定数据在三维球上的正确位置,且以四叉树形式被组织起来。
PagedLOD
即分页LOD,能根据视点范围动态选择加载哪些节点。
这两个技术将在后文详细解读。
图3.11createRootNode流程
图3.11展示了创建根节点的详细流程。
其中,在创建影像图层和高程图层中,相应的execute函数里分别调用了createlmage(函数和createHeightfields()函数,这两个函数根据数据中的option属性,调用了相应driver的插件,而进行了实际具体的数据读取。
如果需要写自己的插件读取影像数据或高程数据,则必须
重载这两个函数。
Locators.cpp
图3.12GeoLocator的具体空间信息处理
GeoLocator确定了瓦片模型的位置,如图3.12所示,主要通过key获取地形块的范围,然后再移至相应的位置。
综上,一个包含地形节点、模型节点和overlay模型节点的mapNode便被正确的构成了。
其中最主要的便是地形节点的构造,它包含的影像图层、高程图层等都以四叉树结构进行组织,以分页LOD模式进行动态调度渲染。
更为详细的流程图,可参见附件中的osgEarth数据读取流程。
1.4加载节点至场景树
最后的加载节点至场景树很简单,就是创建一个group节点,将mapNode
包含进去,然后这个将加入osgViewer的渲染流程。
具体代码如下:
osg:
:
Group*root=newosg:
:
Group();
root->addVhild(mapNode.get());
在程序运行时,因为视野的改变,osgEarth会利用PagedLOD动态的加载卸载瓦片节点,而会重复上面构造mapNode的步骤来构造新的节点。
2.空间信息组织编码及位置确定
上一节内容解读了osgEarth如何将earth文件读入,并利用其中的XML标签构建地形结点从而达到渲染目的。
这一节则主要解读如何将数据放入三维球正确的位置并进行组织。
简单而言,关于位置属性的记录,osgEarth就只是利用任何地形数据都会包括的投影坐标系及经纬度信息进行定位。
这样的优点在于,无论何种数据源的数据,只要能最后确定一定的投影参考系,便能保证被放置在正确的位置,数据之
间保持正确的拓扑关系和逻辑关系。
而相关的投影系转换,标准,表达方式,国际上规定也十分明确。
一个统一的标准,使osgEarth能接纳更多源的数据。
本节,就会首先介绍osgEarth相关的空间参考系,然后再解读其具体如何确定数据在三维球上的位置。
同时,由前文可知,osgEarth通过创建用四叉树结构的分层瓦片缓存,可以快速加载大地形数据。
最后,将解读其生成的缓存文件编码。
2.1空间参考系
osgEarth中,每个map对象,layer对象,tilesource对象,均有决定其所属空间位置的属性profile。
Profile中,包含记录对象空间参考系的属性SRS。
通常,我们用经纬度来表示数据的位置。
可是不同空间参考系中,相同的经纬度不一定表示一个地方。
所以,osgEarth中每个数据对象都会包含空间参考系属性SRS。
一个空间参考系,包含以下内容[15]:
1坐标系类型
2水平基准
3高程基准
4投影
下面也就这四个方面对osgEarth的空间参考系进行介绍。
(一)坐标系类型
osgEarth支持三种地图的显示方法。
1地理坐标系类型
展示的方式便是三维数字地球,使用角度制的经纬度。
代表包括WGS84坐
标系和NAD83坐标系。
2投影坐标系类型
展示的方式是将三维区域投影到二维(X,Y)平面。
代表包括UTM投影,墨卡托投影。
①ECEF
即EarthCenteredEarthhFixed是osgEarth自定义的坐标系类型,是一种三维的笛卡尔坐标系,原点定于球心,X轴指向纬度/经度(0,0),丫轴指向纬度/经度(0,-90),Z轴指向北极。
其坐标系体系同OSG的世界坐标系体系是一致的,如图3.13所示。
(二)水平基准面
根据地理空间测量方法的不同,基准面便会不同。
同一个地方也可以有不同的基准标准。
因为地球并不是一个完美的球体,甚至不是一个完美的椭球,所以为了拟合地球的形状,特定的地方会选用特定的水平基准面。
一般而言,在北美会使用WGS84和NAD83,在欧洲会使用ETR89。
在osgEarth中,默认的水平基准面是WGS84,如果没有为数据设定相应的水平基准信息,osgEarth会默认设置WGS84的相关参数。
(三)高程基准面高程基准是为了测量高程的。