osgEarth数据加载及组织解析 联系客服

发布时间 : 星期二 文章osgEarth数据加载及组织解析更新完毕开始阅读2c81f29fec3a87c24028c4a2

GeoLocator::createForKey创建地形块的locator:首先,根据key获取该地形块的范围,分别为double xmin, double ymin, double xmax, double ymax Key中的extent中存储相应info,createForExtent具体处理然后根据地形块对应的范围,创建LocatorSpatialReference::createLocator(double xmin, double ymin, double xmax, double ymax, bool plate_carre ),如果空间参考系为地理坐标系(不是投影)或者map为平面则将 xmin, ymin, xmax, ymax由度数转化为弧度,然后调用getTransformFromExtents( xmin, ymin, xmax, ymax ),否则直接用度数调用static osg::MatrixdgetTransformFromExtents(double minX, double minY, double maxX, double maxY){从原点向左下角移动, osg::Matrixd transform;x轴放大(maxX-minX) transform.set(倍,y轴放大(maxY- maxX-minX, 0.0, 0.0, 0.0,minY)倍 0.0, maxY-minY, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, minX, minY, 0.0, 1.0); return transform;}Locators.cpp图3.12 GeoLocator的具体空间信息处理

GeoLocator确定了瓦片模型的位置,如图3.12所示,主要通过key获取地形块的范围,然后再移至相应的位置。

综上,一个包含地形节点、模型节点和overlay模型节点的mapNode便被正确的构成了。其中最主要的便是地形节点的构造,它包含的影像图层、高程图层等都以四叉树结构进行组织,以分页LOD模式进行动态调度渲染。

更为详细的流程图,可参见附件中的osgEarth数据读取流程。

1.4 加载节点至场景树

最后的加载节点至场景树很简单,就是创建一个group节点,将mapNode包含进去,然后这个将加入osgViewer的渲染流程。

具体代码如下:

osg::Group* root = new osg::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]: ①坐标系类型 ②水平基准 ③高程基准 ④投影

下面也就这四个方面对osgEarth的空间参考系进行介绍。 (一)坐标系类型

osgEarth支持三种地图的显示方法。 ①地理坐标系类型

展示的方式便是三维数字地球,使用角度制的经纬度。代表包括WGS84坐标系和NAD83坐标系。

②投影坐标系类型

展示的方式是将三维区域投影到二维(X,Y)平面。代表包括UTM投影,墨卡托投影。

① ECEF

即Earth Centered Earthh Fixed。是osgEarth自定义的坐标系类型,是一种三维的笛卡尔坐标系,原点定于球心,X轴指向纬度/经度(0,0),Y轴指向纬度/经度(0,-90),Z轴指向北极。其坐标系体系同OSG的世界坐标系体系是一致的,如图3.13所示。

Z

Y轴 轴

X轴

图3.13 ECEF

(二)水平基准面

根据地理空间测量方法的不同,基准面便会不同。同一个地方也可以有不同的基准标准。因为地球并不是一个完美的球体,甚至不是一个完美的椭球,所以为了拟合地球的形状,特定的地方会选用特定的水平基准面。一般而言,在北美会使用WGS84和NAD83,在欧洲会使用ETR89。

在osgEarth中,默认的水平基准面是WGS84,如果没有为数据设定相应的水平基准信息,osgEarth会默认设置WGS84的相关参数。 (三)高程基准面

高程基准是为了测量高程的。有许多类的高程基准,osgEarth支持两种高程基准:大地基准面(基于椭球)和大地水准面(基于地球上一些高程点)。

osgEarth内置以下四种高程基准面: ①Geodetic(大地基准面)。此为默认高程基准面,osgEarth使用水平基准面椭球来作参考。

②EGM84 geoid(大地水准面) ③EGM96 geoid(大地水准面),一般被称为MSL,在DTED和KML数据中会被使用

④EGM2008 geoid(大地水准面)

在osgEarth中,默认的高程基准面是geodetic高程水准面,海拔依据HAE(height above ellipsoid)来测量。 (四)投影

SRS同时也提供投影信息,即将三维点投影到二维平面的方法。 因为osgEarth依赖GDAL和OGR两个工具库,所以它能支持上千种投影方法,如有名的UTM投影,兰伯特投影。

SRS使用WKT(Well Known Text),PROJ4或EPSG方式来表达SRS空间参考系。这三种方式都是国际上比较通用的方式,这也增加了osgEarth的通用性。本文就不详细介绍这三种空间参考系表达方法了。

2.2 数据组织及位置确定

在前文的数据预处理中有提到过,osgEarth是实时建立分层瓦片集来进行实时渲染。简单而言,osgEarth就是通过记录了SRS和范围信息的profile属性,创建瓦片数据TileSource,并通过TileKey来进行四叉树进行管理。

(-180,90)

(180,90)

西半球

东半球

第一层

lod:0

(-180,-90) (-180,90)

TileKey

第二层

lod:1

x 0 1

2 3

0 1 2 3 4 5 6 7 第三层

y

lod:2

………… TileKey(2,5,1)

图3.14 瓦片分层LOD

如图3.14所示,osgEarth中的世界范围是以经纬度来表示,若将球形表面剖开铺成平面,其最左为西经180度,最右为东经180度,最上为北纬90度,最下为南纬90度。

实时加载时,osgEarth会根据map或数据的profile属性实时进行分层瓦片化。表3.1列出的是profile中关于瓦片分层的一些属性,其中的数值是一个全球影像数据的属性值。下面将会详细解说osgEarth如何利用这些数据将数据分层瓦片化,并确定数据的位置。

extent srs west east south north numTilesWideAtLod0 numTilesHighAtLod0 fullSignature horizSignature 空间参考系 -180 180 -90 90 2 1 3be5346 3be5346 profile 表3.1 map对象profile属性 numTilesWideAtLod0和 numTilesHighAtLod0是确定最高一层的宽度与高度,即行数与列数。默认是宽度为2,高度为1。这个默认值正好将第一层的全球数据分成东西半球。然后osgEarth将继续向下分层瓦片,随着一层层的深入,地形