张震 ,张硕,马召恒
(1.山东科技大学测绘科学与技术学院,山东 青岛 266510; 2.河南省地矿局第二地质勘察院,河南 许昌 461000)
进入新世纪以来,随着“数字地球”、“数字城市”的不断发展,传统的摄影测量技术由于其生产周期长、费用高、效率低等缺点,已经不能满足信息发展的需要。LiDAR 作为测绘领域一项具有革命性的成就之一,通过几十年的发展,如今的LiDAR 技术日趋完善,它正广泛应用于测绘领域的各个方面。相对于欧美国家成熟的LiDAR 技术来说,我国目前在这方面的研究和应用还处于刚刚起步的阶段,相关的数据处理方法还处于技术探索和发展的阶段。
为了能有一个同一的标准,2003年美国摄影测量与遥感(ASPRS)协会下的LiDAR 委员会发布了主要面向机载LiDAR 数据的标准格式LAS。可视化工具包(Visualization Toolkit,VTK)是一个面向对象的可视化类库,由于其功能强大、方便使用以及源代码开放等特点,它被广泛用于可视化工具的开发领域中。本文以2009年发布的LAS 1.3 为基础,通过对其数据格式的解析与分析,在挪威TrollTech 公司开发的Qt 平台上,结合VTK 技术,以C++为开发工具,实现了对LAS文件中的点云数据的快速读取显示,为后期对LiDAR数据处理奠定了初步的基础。
机载LiDAR 系统是一个集多种电子设备于一身的集成系统。其主要组成包括:①激光测距仪,发生激光脉冲并接受回波;②动态差分GPS,用于确定扫描中心的空间位置;③惯性测量单元IMU,确定扫描仪的姿态;④高分辨率的数码相机,与激光扫描仪同步获取航空影像。
(1)激光测距原理
激光测距的基本原理是利用光在空气中的传播速度已知这一特性,测定光波在被测距离上往返传播的时间来求得距离值。它主要采用两种测距原理,即脉冲激光测距和连续波激光测距。由于连续波激光测距雷达的平均发射功率较低,测距能力比相应的脉冲激光雷达测距差很多,所以当前大多数雷达系统都采用脉冲激光测距来测量距离。
(2)机载LiDAR 技术对地定位原理
假设地理空间中一点O 的三维坐标(X0,Y0,Z0)已知,求出这一已知点到待定点A(XA,YA,ZA)的向量P(模,方向余弦),则A 点的坐标可以根据O 点坐标与向量P 求出,如图1所示。
图1 机载LiDAR 技术对地定位原理
XA=X0+△X
YA=Y0+△Y
ZA=Z0+△Z
其中:
△X=FX(Φ,ω,Κ,θ,S)
△Y=FY(Φ,ω,Κ,θ,S)
△Z=FZ(Φ,ω,Κ,θ,S)
已知点O 的三维坐标(X0,Y0,Z0)由GPS 提供;方向余弦由观测平台的法线的俯仰角Φ、侧滚角ω、航偏角K 及观测方向与法线间夹角θ 组成的矢量矩阵求出,观测平台法线的Φ,ω,K 由姿态装置给出;矢量的模S 由激光测距仪给出,上述X0,Y0,Z0,Φ,ω,K,θ,S已知,那么任意测定点A 的三维坐标(XA,YA,ZA)即可求出。
机载LiDAR 数据一般有两种格式:一种是ASCII格式,这种格式的数据便于读取,但是它没有压缩,Li-DAR 数据通常都是海量数据,存储和处理起来占用的内存较大;另一种是目前国际上通用的机载LiDAR 数据的标准格式LAS,LAS 数据格式文件采用的是二进制格式,包含更多的信息,占用的内存空间相对较小,LAS 标准格式是由美国摄影测量与遥感协会2003年开始发布的,经过改进,目前已有5 种版本,分别是LAS1.0,1.1,1.2,1.3,2.0,其中LAS1.3 版本是最常见到的数据格式。
LAS1.3 数据格式由二进制数据组成,包含一个头文件区,变长记录区和点记录区。头文件区包含一个公共区,后面紧接着变长记录。公共区块包含一些描述数据整体情况的记录,比如点记录数,坐标边界。变长记录包含一些变长类型数据,有投影信息,元数据,波形数据包信息和用户应用数据。如果包含波形数据包的话,那么它位于所有点数据记录的末尾。它被放置在该处以方便对它的分离或实体化。该记录是一个扩展变长记录(EVLR)。EVLR 的存储格式为无符号超长整型,允许存储比一个变长记录更多的信息。
VTK 是一个用于3D 计算机图形学、计算机图像处理以及可视化应用程序的设计与开发,同时可以免费获取,开放源代码的独立类库。它包括两个基本的子系统:一个是已经编译好的C++类库;另一个接口层,提供了支持Java,Tcl 和Python 等解释性语言的接口。VTK 支持多线程,分布式运算,可支持多种用户交互方式,支持事件/观察者(Command/Observer)用户事件处理模式并提供包括点(Point),线(Lines)和三角网(Triangle Strips)等多种基本绘制图元,它可以在Windows,Linux 和Unix 等平台下的多种编程调用,所以它被广泛用于可视化工具的开发领域中。
由于VTK 的类库特别庞大,所以根据各个类在类库中的作用,将类库中的类分成如下几部分:公共部分(Common)、图形处理部分(Graphics)、图像处理部分(Imaging)、文件读写部分(IO)、绘制部分(Rendering)、数据转换部分(Filtering)等,每部分被编译成相应的动态连接库。各部分在类库中的层次如图2所示。
图2 VTK 类库中的层次
VTK 是在OpenGL 函数库的基础之上,采用面向对象的方法发展起来的,它有两种不同的方式:图形模型(Graphics Models)和可视化模型(Visualization Models)。图形模型是三维图形的抽象,侧重于对图像、图形的操作和处理;可视化模型是可视化过程中数据流程的模型,侧重于在可视化过程中的数据流。VTK 可视化管道图如图3所示。
图3 VTK 可视化管道图
Qt 是由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI 程式,也可用于开发非GUI 程式。Qt 的良好封装机制使得Qt 的模块化程度非常高,可重用性较好,同时它支持2D/3D 图形渲染和OpenGL,这对于用户开发来说是非常方便的。现有2010年获取的位于焦作市西北约30 km 处的太行山区部分机载LiDAR 点云数据作为实验数据,其数据格式为LAS 1.3。在Qt 平台上,结合VTK 技术,以C++为开发工具,即可实现这片区域点云数据的可视化(如图4所示)。其主要可视化程序设计过程如下:
图4 太行山区部分LiDAR 点云数据的可视化
(1)获取点云数据
vtkPoints* pPoint=vtkPoints::New( ) ;
vtkPolyData* pdata=vtkPolyData::New( ) ;
pdata->SetPoints( pPoint) ;
(2)设置颜色表中的颜色
vtkLookupTable* pColorTable=vtkLookupTable::New( ) ;
pColorTable->SetHueRange(0,1) ;
pColorTable->SetNumberOfColors(225) ;
pColorTable->Build( ) ;
(3)创建映射器mapper 及演员actor
vtkPolyDataMapper* mapper=vtkPolyDataMapper::New( ) ;
vtkActor* actor=vtkActor::New( ) ;
mapper->SetInput( pdata) ;
actor->SetMapper( mapper) ;
(4)创建渲染器ren 及显示窗口renwin
vtkRenderer* ren=vtkRenderer::New( ) ;
vtkRenderWindow* renwin=vtkRenderWindow::New( ) ;
ren->AddViewProp( actor) ;
renwin->AddRenderer( ren) ;
renwin->SetSize(800,800) ;
(5)创建交互窗口inter 及点云数据可视化显示
vtkRenderWindowInteractor* inter = vtkRenderWindowInteractor::New( ) ;
inter->SetRenderWindow( renwin) ;
inter->Initialize( ) ;
inter->Start( ) ;
机载LiDAR 作为一种新兴的现代化测量技术手段,它可以快速获取地面地物的三维数据,得到点云数据。由于点云数据处理起来相对比较麻烦,笔者通过对机载LiDAR 点云数据标准格式的研究,基于VTK 技术编程实现了点云数据的快速读取显示,有助于后期生成DEM,三维建模等进一步的研究。
[1]杨洋,张永生.基于LiDAR 数据的建筑物轮廓提取[J].测绘科学,2010,35(3) :203 ~205.
[2]陈松尧,程新文.机载LiDAR 系统原理及应用综述[J].测绘工程,2007,16(2) :27 ~31.
[3]张靖,高伟.LAS 格式解析及其扩展域的应用[J].测绘科学,2008,33(3) :154 ~155.
[4]常君明,邱磊,邹早建.基于VTK 的CFD 可视化系统开发和应用[J].武汉理工大学学报,2004,26(4) :83 ~85.
[5]刘玉芳,王润怀,宋金星.基于VTK 的三维地层可视化探讨[J].河南理工大学学报,2009,28(3) :303 ~306.
[6]李清泉,李必军,陈静.激光雷达测量技术及其应用研究[J].武汉测绘科技大学学报,2000,25(5) :387 ~392.