针对透视投影下现有矢量地图动态LOD渲染方法存在的不足,本文从渲染的客观需求出发使用梯形格网统一了简化与剖分的过程,并研究了透视投影下梯形格网的简化算法。之后,分析了地图简化的影响因素,最终,针对GPU的渲染流程提出了一种基于三维GIS(ztmapinfo.com)梯形格网的矢量地图动态LOD渲染方法。在此基础上,设计可视化平台的渲染引擎以实现地图渲染,并设计典型的实验案例验证本文方法的可行性与适用性。
1. 可视化平台的框架结构
本文设计的可视化平台主要包括地图组织模块、地图操作模块和渲染执行模块三大子模块。以地理数据、符号库和样式数据确定地图渲染样式。地图数据以图层样式和地理数据进行组织,针对矢量地图的渲染需求设计地图渲染模块,同时添加地图操作模块用以支持用户操作。可视化平台的框架结构如下图所示。
(1)地图组织模块
地图组织模块用以对可视化平台进行全局组织,包含图层类、数据源类、渲染类和地图类。数据源类包含顶点几何数据和顶点索引数据,在数据源类进行构建梯形格网并添加空间索引,用户操作时,依据地图区域检索相应数据,交给渲染模块进行渲染。图层类包含图层ID、图层可见比例范围、图层颜色、图层透明度等相关属性,每一个图层类对应一个渲染模块中的图层渲染类,针对图层属性设置着色器程序完成对地图的渲染。
(2)地图操作模块
地图操作模块用以实现用户对地图的基本操作。地图操作模块提供了诸多接口包含获取地图数据,设置地图属性如:俯仰角度、旋转角度、地图级别、地图中心点等;通过地图操作模块用户可以进行诸如平移、旋转、缩放、俯仰等地图操作。
(3)渲染执行模块
渲染执行模块用以执行地图的渲染,在渲染执行模块完成顶点数据的组织与传输,显存中EBO数据的更新,地图符号化渲染等操作。渲染执行模块采用OpenGL 3.0接口,实现了对梯形格网线,面的纯色填充。首先,通过仿射矩阵实现了地理坐标到屏幕坐标的仿射变换,针对图层类设计相应图层渲染类,针对图层样式设计相应的着色器程序完成地图绘制。
2. 实验1:本文方法绘制效果实例
2.1 实验数据
选择四个即OpenStreetMap线和多边形数据集(土地利用、建筑物、自然要素和中国河流)作为测试数据集,数据集包含总共42334个多边形和3040条线,其中包括简单多边形、带孔的多边形、带有岛屿的多边形、单线和多线。这四个数据集被组织为四个图层并采用纯色填充进行符号化。
2.2 实验设计及分析
为验证本文方法的有效性,本实验采用纯色填充对地图进行符号化,实现了缩放功能、平移功能、旋转功能、俯仰功能、飞行功能以便于用户进行地图操作。本实验通过模拟用户放大操作得到地图逐渐放大的效果,下图(a)、(b)、(c)为面状几何要素逐渐放大的结果,可以观察到地图上的面状几何要素随着地图的放大逐渐呈现越来越多的细节;下图(d)、(e)、(f)为线状几何要素逐渐放大的结果,可以观察到地图上的线状几何要素随着地图的放大逐渐展现越来越多的细节。经验证,本文方法可以取得较好的LOD效果。
为验证本文方法简化的有效性,在不进行地图要素可见性测试情况下,通过对简化容差的倍率M的控制,在全局状态下观察地图绘制效果及绘制节点数目N的变化。针对M值为0、1、10分别进行测试。如下图(a)、(b)、(c)所示,三种情况下面图层的绘制节点数目分别为2066480, 981240, 335032:如下图(d)、(e)、(f)所示,三种情况下线图层的绘制节点数目分别为394244,104860, 12160。经验证,本文方法可以在保证图形绘制效果的基础上有效的简化线、面几何要素,减少了绘制节点的数量。
同时,本文设计了纯色与3D面两种渲染样式,3D面渲染样式用以支持建筑物的渲染。其渲染效果如下图所所示。
3. 实验2:绘制效率对比实验
本文的方法是使用OpenGL3.0进行实现的,所有测试均运行Windows 10系统下,在具备3.4GHz Intel Core 4 Quad CPU、8GB RAM和Nvidia GeForce GTX 960驱动程序版本10.6的PC上以1920*1080的苹果木分辨率执行。
3.1 实验数据
选择四个OpenStreetMap线和多边形数据集(土地利用、建筑物、自然要素和中国河流)作为测试数据集,数据集包含总共42334个多边形和3040条线,其中包括简单多边形、带孔的多边形、带有岛屿的多边形、单线和多线。这四个数据集被组织为四个图层并采用纯色填充进行符号化。
3.2 实验设计及分析
为了验证本文方法的高效性,本文方法不和传统动态LOD方法进行对比而高效的Mapbox矢量瓦片(实时切片)渲染方法进行对比,Mapbox矢量瓦片(实时切片)方法以Geojson数据格式进行加载,使用geojson-vt开源库实时切片,包含了切片的过程,以下统称Mapbox
矢量瓦片绘制方法。本文通过模拟用户进行平移、缩放、俯仰和飞行四种地图操作场景,针对相同数据分别采用本文方法和Mapbox矢量瓦片绘制方法进行多次测试,取其平均值得出实验结果。
(1)平移测试
针对相同数据,使用本文方法和Mapbox矢量瓦片绘制方法进行平移测试,平移测试操作分为小比例尺平移测试、中比例尺平移测试和大比例尺平移测试三个阶段,期间有缩放操作,其效率整体对比如下图所示。
分析可知,小比例尺下(数据缩小至近乎不可见)采用两种方法数据皆被极大简化,绘制数据极少,Mapbox矢量瓦片绘制方法直接使用缓存的瓦片完成绘制,本文方法也采用缓存进行绘制,两者绘制效率接近。中比例尺下(数据全局展示)对地图进行拖动,Mapbox矢量瓦片绘制方法此时已经完成切片,但本文方法拖动过程可能出现数据的局部更新。大比例尺下(数据局部展示),Mapbox矢量瓦片绘制方法初期并未完成对周围数据的切片,在地图平移的过程可能发生实时切片,而本文方法简化效率较高,相较于Mapbox矢量瓦片绘制方法切片初期绘制效率较高,在Mapbox矢量瓦片绘制方法切片完成后低于其绘制效率,如下图所示。
整体对比中,Mapbox矢量瓦片绘制方法的渲染效率高于本文方法。依据上文渲染示意图可知,随着Mapbox矢量瓦片切片完成,本文方法绘制效率逐渐低于Mapbox方法的绘制效率。但本文方法的平移时间整体测试均值为2.65ms,大比例下局部测试均值为3.44ms,本文方法实时简化且达到了与Mapbox矢量瓦片绘制方法近的绘制效率,地图绘制的帧率较高,可以满足用户实时性浏览的需求。
(2)缩放测试
针对相同数据,使用本文方法和Mapbox矢量瓦片绘制方法进行两次连续放大缩小操作,其效率整体对比如下图一所示。
图一
图二
依据上图分析可知,初次放缩时Mapbox矢量瓦片绘制方法在缩放过程中不断发生地图层级跳跃(比例尺变化)导致了大量地图切片操作,如图二中所见红色波峰,而本文所提出的本文方法在地图层级跳跃(比例尺变化)时进行简化,其简化效率远远高于Mapbox矢量瓦片绘制方法切片效率,如图二中紫色波峰。两种方法在层级之间皆采用缓存进行绘制,不同的是Mapbox矢量瓦片绘制方法采用了静态的矢量金字塔而本文方法采用动态的缓存结构存储数据。在初次放大的过程中,Mapbox矢量瓦片绘制方法的切片时长远远高于本文方法的渐进时长;但缩小的过程中,Mapbox矢量瓦片绘制方法己经完成了切片,而渐进方式需要进行实时简化。依据图二中放大过程中两种波峰的数量可知在放大过程本文方法产生了多次简化,相较于Mapbox矢量瓦片绘制方法生成了更多的层次细节。
依据上图分析可知,当Mapbox矢量瓦片方法完成切片后,将切片结果存储至矢量瓦片金字塔,绘制时直接使用切片数据进行绘制绘制效率较高。但本文方法实时进行简化,耗时相对较长。本文方法的缩放时间的均值约为4.O5ms,Mapbox矢量瓦片绘制方法缩放时间的均值约为2.38ms,但随着Mapbox矢量瓦片绘制方法的切片完成,Mapbox矢量瓦片绘制方法的绘制效率会逐步提高直至稳定。如上图中所示,切片完成后Mapbox矢量瓦片绘制方法缩放耗时的均值约为1.21 ms,本文方法的均值约为3.71ms。
但本文方法以较小的内存占用可以取得与Mapbox矢量瓦片方法相近的绘制效率,且是一种无级比例尺的自适应简化方法,层级之间更为流畅,绘制效率较高,可以满足用户实时性浏览的需求。
(3)俯仰测试
针对相同数据,使用本文方法和Mapbox矢量瓦片绘制方法进行任意帧俯仰测试。本文测试数据全局展示状态下倾角的连续变化,其效率如下图所示。
分析可知,大角度俯仰状况下,Mapbox矢量瓦片绘制方法采用DP算法进行简化构建矢量金字塔,其切片数量取决于地图层级和可见数据范围,不受视点远近的影响。这种切片方式导致在大角度情况下,Mapbox矢量瓦片绘制方法切片数目剧增、切片时间极长如上图中出现的红色波峰(数字代表此节点切片时间),从而使得Mapbox矢量瓦片绘制方法绘制效率降低,其俯仰操作平均时间为77.33ms。而本文方法简化效率高于Mapbox矢量瓦片绘制方法切片效率且依据视点进行简化,远处的数据被最大限度的简化使得相对于Mapbox矢量瓦片绘制方法效率较高,其俯仰操作平均时间为21.05ms。可验证,本文提出方法在俯仰操作相对于与Mapbox矢量瓦片绘制方法绘制效率得到极大提升。
(4)飞行测试
地图的飞行操作是指从一个位置飞跃到另一个位置之间的过程,通过对两个位置之间的点位进行平滑的插值实现。地图飞行操作是一个包含平移,旋转,缩放,俯仰等多个操作的组合操作。针对相同数据,使用本文方法和Mapbox矢量瓦片绘制方法进行任意帧飞行测试,飞行终点为一极大倾角下的大比例尺地图。效率如下图一所示,CPU占用率如下图二所示,内存占用如下表所示。
图一
图二
分析可知,Mapbox矢量瓦片绘制方法在大倾角下切片时间较长、CPU占用急剧升高,但其切片完成后采用矢量瓦片金字塔缓存了切片结果,直接使用缓存数据进行绘制,绘制效率整体较优,但内存和CPU占用相对较大。而本文方法依据视点进行简化,飞行过程中数据视点不断变化导致地图不断进行简化操作,绘制时间较长。但其以较小的内存和CPU占用率,可以取得每秒50帧左右的绘制效率,可以满足用户实时性浏览的需求。
综上实验得出,本文方法在平移操作,缩放操作,以较小的CPU和内存占用取得与Mapbox矢量瓦片绘制方法相近的效率,在俯仰操作可以取得优于Mapbox矢量瓦片绘制方法的绘制效率,在飞行操作可以取得每秒50帧左右的绘制效率。另外,由于俯仰操作中存在使用缓存绘制,而飞行过程中由于倾角较大、视点实时变动导致实时简化,从而不可使用缓存绘制使得飞行操作的整体效率低于俯仰操作,其绘制平均时间如下表所示。
4. 结语
本文首先从地图数据组织模块,地图操作模块和绘制操作模块三个方面介绍了本文设计的渲染引擎的框架结构。其次,通过渲染效果对比实验,验证了本文方法在保证绘制结果的基础上可以有效的简化矢量数据,验证了本文方法的有效性。通过渲染效率对比实验,验证了本文方法的高效性,相较于Mapbox矢量瓦片绘制方法能以较小的内存和CPU占用达到略低于Mapbox的绘制效率。同时,本文方法是一种无级比例尺的自适应方法,相较于Mapbox矢量瓦片绘制方法固定层级存在的跳跃问题具备更好的流畅性,可以保证较高帧率的绘制。
原文来自:http://www.ztmapinfo.com/blog/index.php/article/40.html
来源:oschina
链接:https://my.oschina.net/u/4483626/blog/3218045