APP下载

基于osgearth局部等高线画法研究及实现

2018-05-28邹韬曹红艳杨东升石国良

电脑知识与技术 2018年9期

邹韬 曹红艳 杨东升 石国良

摘要:针对在地理信息系统上绘制等高线时常常需要将全部高程数据读入缓存,造成三维等高线渲染速度慢、绘制效率低的问题,本文提出了一种由用户鼠标选定关心区域,根据用户指定采样行数、采样列数和等高线间距等参数,高效、快速地在osgearth平台上绘制三维等高线的一种画法及实现。并将局部等高线做成插件,方便系统集成,其中的二维等值线算法也适用于计算二维等值面其他问题地实现。

关键词:osgearth;局部等高线; 高程数据

中图分类号:TN911 文献标识码:A 文章编号:1009-3044(2018)09-0203-04

Abstract: For drawing the contour lines in the geographic information system often needs to be all the elevation data into the cache, resulting in slow rendering, 3D contour rendering problems of low efficiency, this paper proposes a mouse by the user selected regions of interest, according to user specified sampling number of rows, columns and contour sampling spacing, and achieve a drawing efficiently and quickly rendering 3D contour on the osgearth platform. In addition, the local contour line is made into a plug-in to facilitate the integration of the system, and the two dimensional contour algorithm is also applied to the realization of other problems of the two-dimensional ISO surface.

Key words: osgearth; local contour; elevation data

osg是一個开源的场景图形管理开发库,它对底层的opengl进行了封装。osg拥有强大的插件库,使用户可以利用这些插件库完成自己的应用程序。osgearth是带有GIS功能的osg图形库,利用它用户可快速搭建起数字地球,及做出基于此的各种应用程序。等高线的画法是gis系统中不可回避的课题,也是gis系统中常用的功能。本文利用osgearth平台及高程数据,根据用户给定的参数,利用栅格算法,在地理信息系统上高效绘制出局部等高线。

1平台概述

1.1坐标系

坐标系是GIS图形系统图形显示、数据组织分析的基础,建立完善的坐标投影系统对于GIS应用来说是非常重要的。GIS系统的坐标系大致有三种Plannar Coordinate System(平面坐标系统)Geographic Coordinate System(地理坐标系统)Projection Coordinate System(投影坐标系统)。平面坐标系统常常在小范围内使用,它不需要投影或坐标转换。地理坐标系统是球面坐标系统,是以经纬度为单位进行存储的。

地图坐标系统是由二个因素决定的:大地基准面和投影系统。大地基准面指特定椭球体对特定地区地球表面的逼近。我国的两个大地基准面为北京54基准面和西安80基准面。投影坐标系统就是利用不同的投影规则将球面坐标投影到大地基准面上,从而得到不同的投影坐标系统。常用的投影规则有:高斯-克吕格投影、墨卡托投影等。它们的主要区别在于南北网格的比例系数是上,高斯-克吕格投影的中央经线投影后保持长度不变,即比例系数为1,而墨卡托投影的比例系数为0.9996。

本文采用WGS84坐标系统,基准面采用WGS84椭球体基准面。它是地心坐标系,即以地心作为椭球体中心的坐标系。椭球体长半轴为6378137米,短半轴为6356752.3142米。投影方式为高斯投影。在配置文件中进行如下设置:

epsg:4326

1.2影像数据

影像数据也称作纹理数据,是地理信息系统中最基本的数据结构。影像数据通常采用瓦片金字塔形式进行存储。影像瓦片技术是一种地图预缓存技术,将配置好的一定坐标范围的地图,按照固定的若干个比例尺(瓦片级别)和指定图片尺寸,切成若干行及若干列的正方形图片,以指定的格式保存成图像文件,按照一定的命名规则和组织方式存储到目录系统中或是数据库系统里,形成金字塔模型的静态地图缓存,影像瓦片所得到的地图瓦片也称瓦片(Tile)。影像瓦片金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变。

影像瓦片采用四叉树结构进行瓦片划分,四叉树是一种每个非叶子节点最多只用4个分支的树型结构,也是一种层次的数据结构,其特性是能够实现空间递归分解。以一副使用WGS84投影坐标的地球全球地图为例,在0图层,这幅影像分成2个影像瓦片,每个瓦片跨度为180°*180°。 图层1在图层0影像的基础上提高2倍的分辨率,也就是说对于同一影像,被分成90°*90°的片段,因此产生8块影像瓦片。在图层2,分辨率提高到含有32块45°*45°的瓦片数据,图层3也就是22.5°*22.5°,含有128块影像瓦片,以此类推。

影像瓦片文件的解析一般采用XML文件格式。影像瓦片文件表現为一个典型的树状结构。根节点资源表示一个完整的地图,子节点表示该地图的名称,子节点<abstract>表示该地图的简要描述,子节点<srs>表示该地图使用的空间参考,子节点<origin>表示原点坐标。</p><p>子节点<tilesets>的子节点集合< TileSet>由规则采样图像数据块构成,一个<tileset>表示在某一尺度上一系列固定大小均匀采样数据块。一个<tileset>的存储路径由<href>属性决定。Units-per-pixel表示瓦片的分辨率,即每个像素代表的度数。配置文件做如下设置:</p><p><?xml version="1.0" encoding="UTF-8" ?></p><p><tilemap tilemapservice="http://127.0.0.1/" version="1.0.0"></p><p><title>ImageLayers

osgeaeth Soft

epsg:4326

<!--tiletype>hang_sjz_standard_hang

属性TileFormat表示高程瓦片的尺寸为15*15像素的正方形,数据类型为heightfield,数据格式为osgb。加载影像高程后的地图效果如下:

2 设计与实现

2.1原理

根据用户确定的等高线划分区域,高程采样行列数,利用线形差值方法,得到等高线区域内所有采样点经纬度信息,压入容器 vector中。从地理信息系统当前等级高程瓦片数据中,由采样点经纬度值得到采样点对应的高程信息,同样压入到容器vector中。最后根据等高线间距对vector中的高程数据进行分组,得到每个采样点的高度等级。这样,把每个采样点的经纬度、高度、高度等级信息进行整理,压入容器map中,作为数据源,供算法调用。

在采样点容器map中,依据每四个相邻点构成一个矩形,作为等高线划分基础单元。由每个基础单元的高度等级及高程瓦片数据的等高阈值,得出等高线与基础单元四个采样点之间的拓扑关系,继而得到每条等高线与矩形边的交点坐标。利用线形插值的方法连接基础单元边界上高程值相等的点。其中,基础单元顶点与等高线相交的拓扑关系有以下16种情况组成。加号表示顶点高程值大于等高线高程,减号表示顶点高程值小于等高线高程值。

按照拓扑关系,连接矩形中每两个高度相同的交点为一条等高遍历所有顶点,得到若干条等高线。遍历所有等高线,递归查找有相同交点的相连等高线及相连等高线的相连等高线,直至所有具有相同交点的等高线都相连,得到若干条闭合的等高线。使用OSG的三维渲染技术根据等高线的顶点位置在三维地理信息系统中绘制等高线,并在每条等高线上标注高度值。以下为基础单元顶点与等高线交点拓扑关系图:

2.2实现

为实现局部等高线插件化使用的目的,在程序设计中,创建ContourMeasure和ContourResult两个类,其中CContourMeasure用于和用户做交互,接收用户的输入参数。ContourResult则处理局部等高线的具体算法与实现。

利用CContourMeasure中的UpdateContour函数将用户输入参数传入功能插件。ContourResult中SetContourInterval、SetRow、SetColumn对用户传入的参数进行设置,UpdateContourNode执行是否从当前瓦片数据中得到高程值,用于更新等高线瓦片数据的级别。CreatContourNode等高线绘制函数,利用osgearth的osgEarth::Annotation::FeatureNode节点对等高线上高程值相等的交点连接,利用osgearth::GeoHeightField获取当前瓦片数据的高程值,用于计算等高线基础单元的交点坐标。程序流程图如下:

利用函数addChild函数将等高线绘制叶子节点加入根节点root中,交给osg视景器osg::viewer进行渲染处理。CreatContourNode核心源代码如下:

if (m_rpContourNode.valid())

{

removeChild(m_rpContourNode.get());

m_rpContourNode.release();

}

auto mapLineData = GetLineDataByPointData(m_vecPointData );

osgEarth::Features::FeatureList m_featureList;

while(listLineData.size()>0)

{

int nCount = 0;

auto pLineData = *listLineData.begin();

listLineData.erase(listLineData.begin());

osg::ref_ptr rpLine = new osgEarth::Symbology::LineString;

Check(pLineDa ta,listLineData,rpLine,0,nCount);

rpLineFeature = new osgEarth::Features::Feature(rpLine, m_pSrs, osgEarth::Symbology::Style());

rpLineFeature->geoInterp() = osgEarth::GEOINTERP_RHUMB_LINE;

m_featureList.push_back(rpLineFeature);

}

m_rpContourNode = new osgEarth::Annotation::FeatureNode(m_pMapNode, m_featureList, m_Linestyle);

m_rpContourNode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);m_rpContourNode->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);

addChild(m_rpContourNode.get());

最后利用函數Frame函数对每一帧的数据进行刷新,视景器osg::viewer显示每一帧局部等高线绘制结果。不同参数局部等高线的绘制显示效果如下:

1) 采样等级相同,采样行列数不同

采样等级100,采样行数列数100*100

采样等级100,采样行数列数1000*1000

2) 采样行列数相同,采样等级不同

3结束语

本文以osgearth为基础地理信息平台,分层提取了DEM高程数据,根据用户给定的局部地理信息参数、等高线采样行列数、等高线等级参数,构建起等高线绘制基础单元。依据局部地理范围内等高线与基础单元相交的16种拓扑关系,循环遍历了每个等高线绘制基础单元。利用线形插值方法将高程值相等的交点连接起来。最后所有基础单元中的等高线构成整个区域的等高线显示效果。这种方法,不仅地提高了等高线的渲染效率,而且显示范围灵活可控,作为地理信息系统的基本功能,封装成插件形式,方便项目灵活调用。

参考文献:

[1] 聂欣,李鑫慧,吴良林.基于DEM生成等高线的方法[J].地理空间信息,2009,7(4):85-87.

[2] 陈钟鸣,闫建强。一种由DEM获取等高线的方法[J].物探装备,2017,27(2):130-132

[3] 边淑莉,柳佳佳,王海龙,等.基于规则格网DEM的等高线提取算法的优化与实现[J].测绘科学,2008,33(6):151-153.

[4] 肖鹏,刘更代,徐明亮.OpenSceneGraph 三维渲染引擎编程指南[M].北京:清华大学出版社,2010.

[5] 赵建三.基于格网DEM 的自适应等高线内插方法[J].中南工业大学学报,2003,34(3):315-318.

[6] 张显全,刘忠平.基于格网模型的等高线算法[J].计算机科学,2005,33(9):199-201.