OSGEarth的3D场景可视化关键技术实现 | ![]() |
2. 精密工程与工业测量国家测绘地理信息局重点实验室,湖北 武汉, 430079;
3. 测绘国家级实验教学示范中心,湖北 武汉, 430079
2. Key Laboratory of Precise Engineering and Industry Surveying, National Administration of Surveying, Mapping and Geoinformation, Wuhan 430079, China;
3. Mapping National Experimental Teaching Demonstration Center, Wuhan 430079, China
随着现代测绘科技的不断发展,数字地球在测绘领域的应用也越来越广泛。数字地球,即在空间参考框架下对海量地理信息数据实现多分辨率的真实三维地球场景的构建,同时通过对其进行交互操作实现地理信息的查询。Google Earth作为成熟的商业数字地球软件,虽然能够实现高精度地理信息数据的综合三维显示,但是存在数据源单一、开发模式固定、成本过高等不足之处。OSGEarth开源数字地球渲染库(OSG(open scene graph)是开放源码),集合了Qt绘图引擎、GDAL/OGR数据驱动库、Proj4地图投影库、Curl文件传输库、Geos拓扑操作库、SQLite开源数据库等开源库,具有实时地形渲染,坐标投影转换,矢量、影像、网络地图服务等多源数据加载的强大功能,为创建跨平台的数字地球搭建了开发框架[1-2]。本文在深入研究OSGEarth的整体框架、核心算法与原理的基础上,基于Qt绘图引擎库搭建了OSGEarth二次开发框架平台,开发了实时渲染大型三维地形的数字地球平台,实现了地理信息数据加载、图层渲染与管理、坐标查询、距离测量、注记符号添加、矢量属性查询等三维场景交互操作功能,为三维地理信息服务平台的建设提供空间框架和技术支持。
1 OSGEarth整体框架OSGEarth作为一个在OpenSceneGraph三维渲染引擎库上开发的标准C++组件库,采用类接口的开发模式将其划分为5部分,主要实现地理信息数据源的读取、渲染及显示[3-4]:①核心库:根据三维场景数据节点类型又分为OSGEarth地形数据库、OSGEarthAnnotation标记管理库、OSGEarthFeatures矢量要素库、OSGEarthSymbology样式库、OSGEarthUtil绘制优化算法库,提供了地形数据与影像数据的数据加载、图层管理、进程调度等基本功能;②扩展库:OSGEarthQt库利用Qt框架下的OpenGL三维图形应用程序接口(application program interface,API)提供三维地形场景的渲染机制,实现地形数据与影像数据的综合显示;③插件库:OSGEarth将读取数据的驱动器以插件的形式创建类库,根据其高扩展性使得用户根据需求创建自定义数据格式的插件库,方便后续数据格式的更改;④工具库:提供了影像数据的缓存处理、切片缓存、格式转换等一系列功能库;⑤示例库:提供了地球文件的解析算法以及地理空间数据处理的探究方法[5-7]。
2 数据渲染与管理机制OSGEarth对三维地形场景的渲染与结构管理是在三维渲染引擎OpenSceneGraph的基础上实现地理信息数据的加载,支持本地数据和网络地图服务的影像瓦片集加载,在地球表面生成离线地形模型或实时根据高程图和纹理生成地形[8]。
2.1 网络地图服务为了在三维地形场景中实现多源数据的实时渲染,OSGEarth采用数据插件的方式实现高分辨率影像数据的读取,如ArcGISOptions支持美国环境系统研究所公司ArcGIS服务器发布的地图文档(.mxd, pmf)和地理信息系统(geographic information system,GIS)功能(地址定位器.loc、数据库连接文件.sde、工具箱.tbx),WMSOptions支持基于OGC规范的共享地图数据源,提供地图图像、指定坐标点的要素信息以及地图服务的功能说明信息,TMSOption支持基于OSGeo规范的瓦片数据,通过对数据集预先构建四叉树的细节层次(levels of detail, LOD)模型,提高数据加载速度。
2.2 离线数据加载本文主要针对本地数据进行离线渲染,在获取数据源参数(文件路径、影像瓦片数、最小可见层级、最大可见层级、最小可见距离、最大可见距离等)后利用数据驱动器读取地理信息并以图层的形式加入数据管理器中进行显示与管理。数据加载的整体流程如图 1所示,图 1中,DEM为数字高程模型(digital elevation model)。影像数据与高程数据(GeoTiff)调用GDAL(geospatial data abstraction library)数据驱动器进行地形渲染,利用获取的数据源信息创建影像图层配置类ImageLayerOption和高程图层配置类ElevationLayerOption作为形参传递给影像图层对象ImageLayer、高程图层对象ElevationLayer。矢量数据的获取方式主要包含矢量文件与数据库两种获取方式[9]。本文基于美国环境系统研究所公司的标准矢量格式shapefile以及PostgreSQL数据库的空间数据PostGIS进行矢量数据添加,调用OGR驱动器进行数据读取,在判断矢量数据的几何类型(点类型、线类型、多边形型)后,根据两种不同的渲染方式创建相应图层:①利用AGGLite驱动器将矢量数据栅格化为位图,以影像数据的形式渲染影像图层对象ImageLayer;②利用模型驱动器将矢量数据以模型的方式渲染模型图层对象ModelLayer。三维地形场景的数据源均加入数据管理器类DataManager进行管理,图层管理器类MapCatalogWidget将数据源以图层树的形式在界面上进行管理与可视化,实现图层的可见性、快速定位、删除与属性查看。
![]() |
图 1 离线数据加载过程 Fig.1 Process of Loading Offline Data |
2.3 图层管理机制
OSGEarth对数据源的管理主要是基于图层模式分别对高程图层、影像图层、矢量图层、掩模图层等进行操作,采用Qt扩展框架OSGEarthQt库,实现三维数据可视化、管理以及事件响应机制。本文主要调用了4个模块:①ViewerWidget类将OpenSceneGraph的视图场景与封装QOpenGL库的QGLWidget相结合,实现Qt框架下三维数字地球的显示;②DataManager类将加载的数据以图层的形式利用回调相应事件进行管理;③MapCatalogWidget、LayerManagerWidget可视化控件与DataManager类相关联,实现对图层的更新、编辑与管理;④ActionMangager事件响应机制类,通过MapCatalogWidget、LayerManagerWidget调用实例对象实时监测图层的变化并实现交互操作。
3 空间地理信息查询OSGEarthUtil绘制优化算法库是OSGEarth的核心算法库之一,提供了一系列交互响应事件类,可通过鼠标与三维地形场景的交互操作获取坐标点信息,量测地形两点间距离以及添加图标文字的标注等功能,分别封装于MouseCoordsTool类、MeasureTool类、RTTPicker类等。以下将针对查询坐标和距离、添加标记功能的核心算法进行解析。
3.1 坐标转换OSGEarth将坐标查询封装在MouseCoordsTool类中,主要利用继承自OSGGA::GUIEventHandler类实现鼠标事件的监听与响应,将鼠标下的地面空间坐标值实时显示在三维视图窗口的坐标状态栏中。该核心算法思想是实现三维地形点的坐标值从屏幕坐标系到世界坐标系的矩阵变换。在图 2的屏幕坐标到地理坐标的坐标转换流程图中,为了实现坐标的转换,在已知三维视景体和相机的相关参数后,求取将世界坐标系至相机坐标系的模型视图变换矩阵MV、相机坐标系至投影平面坐标系的投影矩阵MP、投影平面坐标系至屏幕坐标系的视口矩阵MW相乘并求逆后,求得三维视景体的近裁剪平面(znear=0)的投影参考点N与远裁剪平面(zfar=1.0)的投影参考点F,两点相连形成相机视点的法向量M (正方向为视点指向三维场景)。使用该矢量线M与三维地球面S进行空间求交,对相交点集合进行判断是否为空,非空则返回第一个相交点的世界坐标T(X, Y, Z)并根据地球的空间参考系引用标识符SRID转换为地理坐标T(B, L, H)输出,否则继续监视相交集合进行判断。
![]() |
图 2 坐标转换流程 Fig.2 Flow Chart of Coordinate Transform |
3.2 距离量测
三维地形场景中的距离量测主要包括大地线与等角航线两种测量模式。大地线是在椭球面上两点间的唯一的最短程曲线[10]。在MeasureTool类中,利用haversine公式可计算球面上两点间的大地线。大地线曲率a和大地线d1为:
$ \left\{ \begin{array}{*{35}{l}} a={{\sin }^{2}}\left( \frac{\text{d}B}{2} \right)+\cos {{B}_{1}}\cos {{B}_{2}}{{\sin }^{2}}\left( \frac{\text{d}L}{2} \right) \\ {{d}_{1}}=R\times \operatorname{atan}2(\sqrt{a}, \sqrt{(1-a)}) \\ \end{array} \right. $ | (1) |
式中,dB、dL为两点间的纬度差和经度差; B1、B2分别为起点和终点的坐标纬度值; R为球面半径; d1为所求球面上的最短距离值,即为大地线。
等角航线是指地球表面上与经线相交成相同角度的曲线。在地球表面上除经线和纬线以外的等角航线,都是以极点为渐近点的螺旋曲线,但是在墨卡托投影中也表现为直线。一般计算公式为:
$ \left\{ \begin{array}{*{35}{l}} \text{d}\psi =\ln \left( \frac{\left. \tan \left( \frac{\text{ }\!\!\pi\!\!\text{ }}{4}+\frac{{{B}_{2}}}{2} \right) \right)}{\left. \tan \left( \frac{\text{ }\!\!\pi\!\!\text{ }}{4}+\frac{{{B}_{1}}}{2} \right) \right)} \right) \\ {{d}_{2}}=\sqrt{\left( \text{d}{{B}^{2}}+{{\left( \frac{\text{d}B}{\text{d}\phi } \right)}^{2}}\text{d}{{L}^{2}} \right)}\times R \\ \end{array} \right. $ | (2) |
式中,dB、dL为两点间的纬度差和经度差;B1、B2分别为起点和终点的坐标纬度值;R为球面半径;d2为所求球面上的等角航线。
3.3 标记符号标记是显示在地图上的文字信息,它是三维场景漫游过程中对某个物体或位置的样式丰富、放置灵活的标注。OSGEarthAnnotation模块的PlaceNode类通过定义文字样式(TextSymbol)的大小、颜色、内容和图标样式(IconSymbol)的图案与缩放尺度实现对地形表面位置的标记。
但是由于Qt框架下的三维交互可视化与OpenSceneGraph三维视景仿真技术下的地球渲染引擎存在图像存储格式上的差异,因此对标记的交互操作存在QIcon(Qt框架)与OSG::Image(OpenSceneGrapgh框架)的图像格式转换。具体流程操作如图 3所示,将创建的图案文件从QIcon格式转换为QPixmap格式后再转换到QImage格式,提取无符号单字符类型(unsigned char*)的图片数据并转换为OPENGL自定义的无符号单字符类型(GL_UNSIGNED_BYTE)的OSG::Image图像格式。
![]() |
图 3 QIcon与OSG::Image格式转换 Fig.3 Format Transform of QIcon and OSG::Image |
4 开发实例
本文在分析OSGEarth的技术原理基础上,集成了OSGEarth三维地形渲染库与Qt平台,完成了三维数字地球管理平台的相关建设与系统设计。如图 4所示,在三维数字平台地球初始化阶段,根据地球文件(.earth)设置地球的空间参考系、地形起伏程度,添加Google全球影像图以及全球高程数据。在完成初始化配置后,平台能够实现以图层的形式加载矢量(shp/postgis空间数据库)、高程和影像(GeoTiff)的地理信息数据, 利用图层管理器对图层进行快速定位、可见性设置、删除与属性查看等功能,对三维地形场景实现了标记添加、坐标查询、距离量测、矢量属性识别的地理信息查询功能。
![]() |
图 4 三维地形场景系统框架 Fig.4 System Framework of 3D Terrain Scene |
4.1 系统设计
通过“map”、“profile”、“image”、“heightfield”等关键字快速地设置地球的空间参考系以及加载矢量、高程、影像数据等功能,实现了基于WGS84坐标系下的地心坐标系,添加了Google全球影像图与高程数据,同时在三维地形场景中添加了矢量点数据并设置其三维点模型。
4.2 实现过程本文研究基于Google影像与地形数据的三维数字地球的地形加载与渲染,实验结果如图 5所示。在此基础上通过Postgis空间数据库加载了线矢量数据表,实现全球国界线在三维地形场景中的矢量渲染。为了获取该三维地形场景的地理空间信息,如图 6(a)所示打开标记样式管理器选择标记的文字属性与图标属性,将标记添加在三维地形场景中,同时打开距离量测工具与坐标测量工具,在三维视图窗口做左上角与右下角弹出的距离测量状态栏与坐标测量状态栏中显示了两个标记点的大地距离及相应空间坐标位置,效果如图 6(b)所示。通过以上实验可知,该系统具有良好的渲染性能,可完成高效的交互操作,实现地理信息的编辑与空间信息的查询。
![]() |
图 5 三维地形渲染界面 Fig.5 Rendering Interface of 3D Terrain |
![]() |
图 6 地理信息编辑与查询 Fig.6 Editor and Query of Geographic Information |
5 结束语
本文研究了OSGEarth开源框架与QOpenGL三维渲染机制的结合技术,并以全球Google影像数据和地形数据、Natural Earth矢量边界数据集为例,构建了数字地球平台,实现空间数据的读取与渲染,在此基础上搭建空间信息查询系建立了具有坐标查询、距离查询、矢量/标记查询等交互功能的三维GIS应用框架,并通过实例验证了系统的可靠性。
[1] |
Guo Huadong, Wang Lizhe, Chen Fang, et al. Scien- tific Big Data and Digital Earth[J]. Chinese Science Bulletin, 2014, 59(35): 5066-5073. DOI:10.1007/s11434-014-0645-3 |
[2] |
义崇政, 廉光伟, 付海龙, 等. 三维地形实体模型自动建模技术研究[J]. 测绘地理信息, 2017, 42(3): 29-33. |
[3] |
杨化斌. OpenSceneGraph3.0三维视景仿真技术开发详解[M]. 北京: 国防工业出版社, 2012.
|
[4] |
肖鹏. OpenSceneGraph三维渲染引擎编程指南[M]. 北京: 清华大学出版社, 2010.
|
[5] |
陈波, 任清华, 杨化斌. 基于OSGEarth的三维数字地球平台设计与实现[J]. 电子科技, 2015, 28(10): 65-68. DOI:10.3969/j.issn.1009-6108.2015.10.034 |
[6] |
吴晓雪, 任鸿翔, 张显库, 等. 基于OSGEarth三维数字地球建设的研究[J]. 大众科技, 2015, 17(1): 1-3. DOI:10.3969/j.issn.1008-1151.2015.01.001 |
[7] |
韩哲, 刘玉明, 管文艳, 等. OSGEarth在三维GIS开发中的研究与应用[J]. 现代防御技术, 2017, 45(2): 14-21. DOI:10.3969/j.issn.1009-086x.2017.02.003 |
[8] |
吴小东, 许捍卫. 基于OSGEarth的城市三维场景构建[J]. 地理空间信息, 2013, 11(2): 107-110. DOI:10.11709/j.issn.1672-4623.2013.02.034 |
[9] |
王雷, 丁华. 基于OSGEarth的大型三维空战场景的搭建[J]. 软件, 2016, 37(1): 114-116. DOI:10.3969/j.issn.1003-6970.2016.01.025 |
[10] |
孔祥元, 郭际明, 刘宗泉. 大地测量学基础[M]. 2版. 武汉: 武汉大学出版社, 2010.
|