利用GDAL实现导航道路的外扩线生成
2018-04-08巩岩
巩 岩
(测绘出版社,北京 100045)
随着科学技术的发展,导航地图在人们日常生活中的作用越来越重要。目前,国内已经有数家导航地图服务商,如高德地图、百度地图、腾讯地图等。这些服务商自己采集原始导航数据,或者通过数据供应商获得一部分导航数据,而从原始导航数据到成品导航地图中间,必然涉及数据再处理环节。目前,对导航数据的处理,一方面集中在对地理信息属性的关联添加上,如对关注点(POI)要素需要添加名称、电话等关联信息;另一方面需要对现有的导航数据的空间属性进行深加工,以适应新的导航需求或地图渲染效果需求。现阶段,研发人员大多基于二次开发库(如ArcGIS engine等)进行数据处理,如果考虑软件平台成本需求和自身研发时间限制,就需要一些开源库的支持,而GDAL(geospatial data abstraction library)是目前处理栅格数据和矢量数据较为成熟的开源库。GDAL不仅为读取地理信息数据提供较为成熟的接口,还提供一定的算法和工具,能实现地理信息数据的处理。本文首先介绍GDAL的一些基础知识,然后探讨如何利用GDAL实现导航数据的空间处理,最后利用实例探讨导航道路的外扩线生成方法。
1 GDAL概述
GDAL是一个在X/MIT许可协议(MIT许可证源自麻省理工学院Massachusetts Institute of Technology,MI又称为X条款或X11条款)下的开源空间数据转换库。它能够使用单一的抽象数据模型来支持大多数的地理数据格式。除此之外,这个库还同时包括了操作矢量数据的OGR(open GIS simple feature reference implementation)库,一般将这两个库合称为GDAL/OGR,或者直接简称为GDAL。
截至GDAL 2.1.2版,此开源库已经可以支持142种栅格数据格式和84种矢量数据格式。同时,能够在C、C++、Python、Ruby、VB、Java、C#等多个语言环境下运行。使用GDAL的优势还在于它是开源地理空间基金会(open source geospatial foundation,OSGeo)支持的开源库,可以与国内外大部分软件实现对接。GDAL可以同时无缝集成GEOS、PROJ等著名开源库的一些功能,实现对要素的拓扑运算、坐标转换等功能。许多著名的GIS软件都是用了GDAL,如Esri的ArcGIS9.3、Google的Google Earth及开源的GRASS GIS系统等。
GDAL使用抽象数据模型来解析它所支持的数据格式,抽象数据模型包括数据集、坐标系统、仿射地理坐标转换、大地控制点、元数据、栅格波段、颜色表、子数据集域、图像结构域、XML域等。对于栅格数据的处理,GDAL常用的类有GDALMajorObject类、GDALDdataset类、GDALDriver类、GDAL Driver Manager类;对于矢量数据的处理,OGR则封装了驱动类、图层类、几何类、空间参考类、要素类、属性类等。从中可以看出,其广泛完整的代码体系库可以很好地支持研发人员完成GIS项目开发需求。
2 线要素处理的数学原理
导航道路数据处理涉及点线面等多个类型的要素数据。其中针对线要素的处理也是较为重要的一部分。如在只有一条道路线的情况下,数据人员通过测量道路宽度可以计算出双行线、人行道等导航需要的线信息,可以节省大量的数据采集成本。
2.1 线段外扩点坐标计算
已知坐标点A(x1,y1)、B(x2,y2),线要素外扩距离为l,通过这些已知条件求解线段对应的向两边外扩线段端点坐标。设求解方向是由A到B,则其方向的反正切值可以表示为
根据方向角的反正切值计算坐标点A的坐标平移量,即
从而求出A点对应的两个外扩点的坐标值分别为C1(x1+Δx,y1+Δy)、C2(x1-Δx,y1-Δy)。坐标点B的计算方法与其类似。
通过以上计算外扩点方法可以得到一条道路线段缓冲出来的两条线段,但线段与线段可能并不相交,也会有交叉情况,这时还需要对求出的线段进行相互求交点的处理。
2.2 两条直线的交点求解
已知直线L1上面已知点坐标为(x1,y1)、(x2,y2),直线L2上面已知点坐标为(x3,y3)、(x4,y4),分别计算其直线斜率为
当k1=k2时,判定其是否为平行线。不平行的情况可以通过下式计算其交点P的坐标,即
当x2=x1时,交点坐标计算公式简化为
当x3=x4时,交点坐标计算公式简化为
利用以上直线求交点公式,可以进一步对很多条外扩线段相互求交点,然后通过判定其交点是在线段内部还是外部来决定新生成的外扩线是增加内插交点还是外扩交点。从而最终形成一条平滑的外扩道路线。
3 导航道路的外扩线生成
基于以上对外扩线生成的数学原理分析,本文利用GDAL实现导航道路外扩线生成。GDAL开源库提供了多格式的GIS数据接口,如本文测试数据采用mapInfo格式的道路数据。
GDAL读取数据实例代码如下:
GDALAllRegister();∥构建数据驱动
GDALDataset* pDataset=(GDALDataset*)GDAL Open Ex(pszName,
GDAL_OF_VECTOR,NULL,NULL,NULL);∥创建数据集
OGRLayer*pLayer=(OGRLayer*)pDs->GetLayer(0);∥打开图层
同时,集成GEOS库的GDAL具备拓扑分析能力,这就可以利用拓扑分析功能,首先将道路线按照一定缓冲距离直接缓冲为道路面,然后利用数学原理将多出的道路面截断处理成道路线,这是本文提出的缓冲区法构建道路外扩线的基本原理。而另一种方法几何法主要是利用线段求点,最后在处理为平滑道路外扩线。
3.1 几何法
几何法生成外扩线原理是进入图层后遍历要素所获取的坐标信息,然后根据以上数据原理逐个求出外扩点,最后连接成新的道路线。原始道路如图1所示,其一条道路的外扩线生成结果如图2所示。
图1 原始道路
图2 几何法生成道路外扩线
3.2 缓冲区法
缓冲区法主要原理是对一整条道路构建缓冲区。缓冲区法需要GDAL支持拓扑运算构建缓冲区图形,这就需要在编译GDAL时加入GEOS的信息。
建立缓冲的代码如下:
∥建立缓冲
∥缓冲距离:dbufferdis
OGRGeometry* pBufferGeo=pGeometry->Buffer
(dbufferdis);
通过以上函数实现线转面的操作;然后对缓冲面的起末端进行运算处理,去除起末端圆弧部分;最终留下平行的两条线就是需要的外扩线。其效果如图3所示。
对比两种方法可发现,几何法运算速度较快,且生成图形点的数量基本与原始道路一致;缓冲区法运行时效率上略慢于几何法,但其几何形状能够更好地进行展现。但是,缓冲区法还存在折点过多的问题,需要进一步进行抽稀处理。
图3 缓冲区法生成道路外扩线
以上算法是只针对一条道路的数据进行处理。当进行多条道路处理时,会遇到外扩线道路未连接或交叉的情况,如图4、图5所示。
图4 两条原始道路相连
图5 相连两条道路生成外扩线出现分离或交叉
此时需要进行进一步的处理,方法是依据直线求交点公式对外扩线道路做截断或延长处理。首先,遍历首尾相连的两条道路对应的外扩线段是否有交点,有交点则进行道路截断,无交点则需要对已生成外扩线进行外延至交点处。具体结果如图6所示。
图6 平滑处理后结果
从图6可以看出,两条道路通过平滑处理后的效果,可以生成与原始道路一致效果很好的外扩道路。
4 总 结
本文概要介绍了优秀的GIS开源库GDAL的基础知识,然后针对导航道路外扩线的生成提出了几何法和缓冲区法两种实现导航道路外扩线生成的方法。通过实例分析发现,GDAL可以很好地实现对导航数据的空间处理。
实测效果显示,几何法在运算速度上和其接边效果上要优于缓冲区法;而缓冲区法对一条很长道路的拟合效果要好于几何法,这要归因于GEOS构建缓冲区的算法较好,但是由于进行起末端半圆弧截断时不能较好地测定何时进行截断,因此缓冲区法的接边效果不如几何法。另外,缓冲区法也有不足,如生成结点过多,需要进一步进行抽稀处理,从而避免这些问题。
参考文献:
[1] 李国标,庄雅平,王珏华.面向对象的GIS数据模型——地理数据库[J].测绘通报,2001(6):37-39.
[2] 吴升,王家耀.近年来地理信息系统的技术走向[J].测绘通报,2000(3):20-21.
[3] 肖志强,鲍光淑,黄继先.融合SAR和TM图像更新GIS道路网络数据[J].测绘学报,2006,35(1):46-51.
[4] 仇林遥,杜志强,谢金华.大文件高分辨率遥感影像的实时可视化方法[J].武汉大学学报(信息科学版),2016,41(8):1021-1026.
[5] 葛亮,何涛,王均辉,等.基于GDAL的瓦片切割技术研究[J].测绘与空间地理信息,2014(7):130-132.
[6] 张祖勋,黄明智.时态GIS的概念、功能和应用[J].测绘通报,1995(2):12-14.
[7] 田昕.SARINFORS软件地理空间抽象数据模型[D].北京:北京林业大学,2004.
[8] 朱凌.Web GIS及其常用软件比较[J].测绘通报,2002(9):60-61.
[9] 邓晓光,吴华意,李德仁,等.基于特征的基础地理信息分类编码方法研究[J].测绘通报,2008(4):21-24.
[10]孔帅可,乔保军,付征叶.基于GDAL的ESRI Shapefile格式文件处理[J].计算机时代,2014(8):43-45.
[11]司连法,王文静.快速Dijkstra最短路径优化算法的实现[J].测绘通报,2005(8):15-18.
[12]盛业华,郭达志.GIS环境下空间要素的制图综合方法[J].测绘通报,1995(3):26-30.
[13]苏光日,范义鹏,张学之,等.GDAL在地理国情监测项目中的应用[J].测绘与空间地理信息,2014(1):86-88.
[14]邹时林,谢刚生,李大军.地理要素编码在GIS数据转换中的应用[J].测绘通报,2007(5):22-25.
[15]熊伟成,杨必胜,董震.面向车载激光扫描数据的道路目标精细化鲁棒提取[J].地球信息科学学报,2016,18(3):376-385.
[16]杨驰.GIS空间分析建模构想[J].测绘通报,2006(11):22-25.
[15]解鹏,杨俊.基于空间景观格局的耕地图斑地形因子自动化提取工艺[J].测绘通报,2013(8):81-83.
[16]黄先锋,李娜,张帆,等.利用LiDAR点云强度的十字剖分线法道路提取[J].武汉大学学报(信息科学版),2015,40(12):1563-1569.