基于OpenStreetMap与OpenGL的矢量地图三维重建

  最近做了一个有趣的程序,将2D的地图数据进行了3D上的重建,类似于百度地图与谷歌地图的三维地图。地图数据来自于OpenStreetMap,这是一个地图开源网站,可以XML文件格式导出很精确的地图数据,再基于这些数据使用Qt下的OpenGL进行三维重建工作,

(这次程序就不上传了,上传了也没人看,看也看不懂,简单了解下思想就可以了,有缘看到这篇博客的同学就自己写吧,理解起来也不难。如真需要程序,请私信我,我实在懒得整理了,手动笑哭😂)

如下图所示:

                                                                   图1 OpenStreetMap网站 

                                  图2 三维重建效果

                                图3 三维重建矢量图

一.OpenStreetMap

  从OpenStreetMap导出的文件以.osm为文件后缀,具有较精确的全球地图数据,由全球志愿者共同维护。OSM定义了三种数据类型,“node”,“way”,”relation”,他们之间的关系与拓扑结构类似。

“node”:表示某个特征点的信息,主要是id编号与经纬度坐标“lat”与“lon”。

“way”: 一系列“node”的集合,表示一条不封闭的道路,如高速公路,乡间小径;或者一个封闭的区域,如建筑物,湖泊等。主要存储一系列“node”的ID编号与tag标签信息,这些tag标注了这些“way”是“highway”还是“building”;

“relation”: 一系列“way”的集合,这些路与封闭区域的集合表示一个行政区域,或者自然保护区等等。

该文件数据格式为XML,以文本方式打开,如下面两图所示:

                                  图4 OSM---"node"

                                  图5 OSM---"way"

  根据这些信息,可以通过正则表达式的思想一行一行的读取osm文件,一边读一边对这个文件中的“node”与“way”数据进行存储(这里暂不考虑relation),并使用Qt里的画笔进行绘制。  

                                             图6 Qt绘制OSM数据  

二.三维重建

    前文已经提过,“way”是“node”的关系集合,表示某条不封闭的道路,或者是某封闭的建筑区域。

   2.1道路重建

    简单来说,三维重建是针对一条线表示的不封闭道路进行点的扩充,下图所示红线为“way”的连线,以“node”N1为例,计算相邻两个“node”的矢量V0与V1,与垂直于xy平面的矢量(0, 0, 1)叉乘,算出在xy平面上分别与矢量V0与V1垂直的矢量V2与V3,V2与V3相加得矢量V4,则V4矢量的方向即为N1的扩充“node”N1‘所在的方向,反方向则为另一个扩充“node”N1’‘所在的方向。

    则相邻的四个扩充节点N0’,N0’’,N1‘,N1’‘可以作为一个单元,抬高一定高度,形成新的四个扩充节点,则这八个节点可以作为一个方格作为三维重建的几何造型,如下图所示。

   2.2 封闭区域   

    封闭区域的重建更为简单,借鉴道路重建的思想,将组成封闭区域的所有node连线组成面,经这个面抬起一定高度形成新的面,两个面结合互相连线即是一个几何造型。当然这个面可能是不规则凹边形,不为OpenGL所识别,需要提前对这个面进行三角剖分。另外,OSM文件中并没有提供确切的高度信息,所以我们根据生活经验给出一些简单的高度信息,再用纯色块加一些简单的光照进行渲染。构成三维重建模型。

下图为西安某区域的地图重建信息。

 

展开阅读全文

没有更多推荐了,返回首页