基于ArcGIS Engine的河道横断面自动成图系统设计与
实现
作者简介:郑光辉(1987-),男,汉族,本科,主要研究水利工程测绘、三维激光扫描、无人机航测等。E-mail:*************************
郑光辉
(江西省赣西土木工程勘测设计院,江西 宜春 336000)
摘 要:河道横断面是计算流量和泥沙量的重要参数,通常采用手工方式制作,耗费大量人力、物力和财力,既不灵活,效率又低。设计一种横断面数据自动提取算法,基于ArcGIS Engine 实现了河道横断面自动成图系统,通过对横断面的自动布设和高程信息提取,达到了批量生成河道断面图的目的,对于断面图生产具有一定的参考价值。关键词:ArcGIS Engine;横断面;自动成图
1  引言
河道横断面是指垂直于水流方向的断面,是决定河槽输水能力、流速分布、比降、流向的重要特征,也是计算流量和泥沙量的重要参数。河道横断面制作常采用手工绘图方式,耗费大量人力、物力和财力,既不灵活,效率又低。另外,较成熟的软件极为匮乏,且通用性差、功能单一[1]。因此,迫切需要利用计算机辅助方法实现更快捷、更便利地生成河道断面图。
本文设计一种横断面数据自动提取算法,基于ArcGIS Engine 实现河道横断面自动成图系统。以河道水底数字高程模型为测量数据,利用河道中心线数据自动布设横断线,通过空间关系逐一提取每条横断线上的高程信息, 最终按要求生产标准的断面图成果,达到批量生成断面图的目的,具有一定的实用价值。
2  相关开发技术介绍
2.1 ArcGIS Engine 开发技术
ArcGIS Engine 是一套用于构建定制应用的完整嵌入式GIS 组件库,建立在ArcObjects 之上。ArcObjects 是整个ArcGIS 软件的核心功能库,由平台独立的COM 对象组成[2]。ArcGIS Engine 提供了几乎全部底图的GIS 功能,充分利用ArcGIS 强大的空间查询、空间分析功能,支持面向对象的形式进行开发,通过对底层算法进行封装,提供用户相应的功能类库,从而降低开发难度,提高开发效率。本文采用ArcGIS Engine 组件库/开发引擎进行开发设计。2.2 Teigha 类库
项目要求生成的横断面图成果为.dwg 格式,同
时为了脱离CAD 环境对DWG 图纸的操作,本文采用Teigha 类库实现对DWG 图纸的读写。Teigha 作为一个提供处理DWG 文件的替代方法的库,可便捷读取、编写和处理原始AutoCAD 的对象,另外还提供了许多辅助机制来处理AutoCAD 对象和渲染设备以渲染DWG 数据库。它是一套面向对象的支持多平台、多版本、多格式的CAD 文件类库,可脱离AutoCAD 环境实现CAD 数据的读写操作、绘制渲染和转换输出等[3]。
3  需求分析
以数字高程模型成果(.tif 格式)为基础高程数据源,利用河道中心线数据(.shp 格式)以横断面布设间距自动布设横断线,通过空间关系依次提取横断线上的断面信息,最终按要求批量生成标准断面图。
4  基础数据
4.1 数字高程模型
高程数据源为多幅连片的数字高程模型,格网间距为2米,文件格式为.tif,其中河道范围内为水底高程信息,数据如图1所示。
图1  多幅连片的数字高程模型
4.2 河道中心线数据
河道中心线数据为河道中心线上的点坐标,在水
横断面与中心线交点点位。当遇到中心线上的拐点时,则结束加密,在拐点处重新计算距离并开始加密。依次在河道中心上的加密点处绘制中垂线,此中垂线即
为当前点处的横断面, 按绘制后的横断布设图形数据,
计算横断桩号,并赋值横断面类型、断面名称属性。
横断线自动布设如图3所示。
文上常采用河道主流线,含河道中心线上的主要拐点坐标,文件格式为.shp,该数据主要用于布设横断线。
5  程序设计及实现5.1 总体技术流程系统采用C#语言WINFORM 框架,基于ArcGIS 10.2平台和 framework 4.0开发。以合理表达
地形变化为原则,以数字高程模型成果为基础高程数据源,在河道中心线上以横断面布设间距为间隔,自
动布设横断面。所有横断面布设完成后,逐一对每一条横断面均匀添加加密点,即为断面点,断面点步长
可根据要求具体设定。通过空间关系依次提取每一次横断线上的断面信息,最终按照要求生产标准的断面图形成果,总体技术流程如图2
所示。图
1
多幅连片的数字高程模型
据为河道中心线上的点坐标,在水文上常采用河道主流线,包含河道中心线上的主要拐点.shp,该数据主要用于布设横断线。实现
语言WINFORM 框架,基于ArcGIS 10.2平台和 framework    4.0开发。以合理表达地形字高程模型成果为基础高程数据源,在河道中心线上以横断面布设间距为间隔,自动布设面布设完成后,逐一对每一条横断面上均匀添加加密点,即为断面点,断面点步长可根据过空间关系依次提取每一次横断线上的断面信息,最终按照要求生产标准的断面图形成果,2所示。2总体技术流程
图2  总体技术流程
5.2 横断面的自动布设
河道横断面的布设主要是利用河道中心线,从河道起始点开始按照一定的间距生成等距、垂直于河道中心线的断面。横断面之间具有相等的间距且都与河道中心线垂直的,主要用于河流动力学模型计算[4]。本文采用自动布设算法,实现河道横断面的批量生成。
5.2.1横断面的自动布设
按照横断面布设间距,每隔一段距离在河道中心线上依次添加加密点,加密点为平面坐标,该点作为
图3  横断线的自动布设
桩号和里程命名原则如下:(1)桩号起点与纵断线线条起点一致(若相反需调整线条方向);(2)以桩号起点为基准站立面向终点,左边为横断线线条的起点,右边为横断线的终点(若相反需调整线条方向)。计算里程高程成果时,横断位于纵断位置左侧的里程文件为负值,右侧为正值,交汇点里程为“0”。
5.2.2在横断面上加密断面点
横断面布设完成后,开始加密断面点,用线路逐桩坐标计算程序将整个线路中桩坐标计算出来[5]。在每条横断面与河道中心线交点处,分别沿着中心线前进方向左、右两侧,向横断面加密断面点,加密步长可根据要求具体设定。具体代码如下:
ITopologicalOperator pTopoOperator = pFeatVer.Shape as ITopologicalOperator;
I G e o m e t r y  g e o  = p T o p o O p e r a t o r .Intersect(pFeatHori.Shape,esriGeometryDimension.esriGeometry0Dimension);
if(geo.IsEmpty)
{    return;
}
IPointCollection Pc = geo as IPointCollection;IPoint ptInter = Pc.get_Point(0);
p H o r i S e c t i o n.m _p t I n t e r s e c t P t  = n e w  p o i n t 3d (p t I n t e r.X , p t I n t e r.Y , GetHeightByPos(ptInter.X, ptInter.Y), 0.0);
将交点插入到横断线上
IPointCollection newPts = new PolylineClass();
newPts.AddPoint(ptInter);
ptsHori.InsertPointCollection(1, newPts); 5.2.3提取地形图斑特征点
当达到预设坡度值时必须获取一个点;当达到预设最小保留距离时,按特征高低至少获取一个点。
5.3 断面点的高程信息提取
5.3.1查断面点所在图幅
本文采用的高程数据源为多幅连片的数字高程模型,因此在提取坐标点前首先应查坐标点位所在的图幅。具体流程为:依次遍历所有图幅,通过将IGeoDataset接口中的Extent变量转换为IEnvelope2接口,
获取当前图幅范围,若当前坐标点在四至坐标内,代表在图幅内,否则,不在图幅内。具体代码如下:IGeoDataset geodataset = (IGeoDataset) pRaster;
I E n v e l o p e2e n v e l o p=(I E n v e l o p e2) geodataset.Extent;
if (dX > envelop.XMin && dX < envelop.XMax && dY > envelop.YMin && dY < envelop.YMax) {
return pRaster;
}
5.3.2利用DEM提取高程信息
提取高程信息前,需要调用IRaster2接口中的方法MapToPixel,即Converts a location(x,y)in map space into pixel space,将坐标点(x,y)值转换为像元的行列号坐标。再通过IRaster2中的GetPixelValue方法来获取该像元行列号所对应的像素值,即高程值。具体代码如下:
IRaster2 raster2 = pRaster as IRaster2;
int row = 0;
int col = 0;
raster2.MapToPixel(dX, dY, out col, out row);
object height = raster2.GetPixelValue(0, col, row);
if (height != null)
{
return Convert.ToDouble(height);
}
5.4 断面点的抽稀
断面点高程信息提取后,便可获取断面的大致地形走势。断面点的取舍以合理表达地形变化为原则,在高差变化较大区域应增加点位,在平坦地区则应对断面点进行抽稀。本文前期已经按照实际需求对横断面点进行加密,因此,在这里只需要根据地形走势按照一定规则对加密点进行抽稀。本文在抽稀过程中采用了特征点提取夹角和最小保留高程距离两个规则。  (1)特征点提取夹角:计算前后三个点ABC间
形成的夹角b(若b>180°,则b = 360°- b),当b小于或等于阈值时,则保留B点。断面上的特征点夹角如图4所示。
图4  断面上的特征点夹角
(2)最小保留高程距离:在当前点与上一个保留点平面距离超过设定值时, 需考虑当前点的提取夹角,当夹角b大于阈值时,保留该点,否则,删除该点。断面点抽稀如图5
所示。
图5  断面点的抽稀(黑线为抽稀前,红线为抽稀后)5.5 断面图的自动成图
成果格式要求为.dwg文件,本文采用Teigha库来生成dwg图,而图形数据采用的是图纸比例数据[6]。  (1)添加图层
成图过程中,为了更好地区分和管理不同类别要素, 需要将每一类要素分别绘制在不同的图层中,因此,首先需要添加相应的图层,并设置图层的属性。
3d走视图ObjectId lyrId_22DM_dmd = addLayer(db, “22DM_dmd”, 1, “CONTINUOUS”);
ObjectId lyrId_22DM_dmx = addLayer(db, “22DM_dmx”, 1, “CONTINUOUS”);
……
(2)绘制断面线和三角形标记
Teigha.Geometry.Point2d point2d = new Teigha.Geometry.Point2d(dX, dY);
pLine.AddVertexAt(i, point2d, 0, -1, -1);
AddPoint(db, btr, new Point3d(point2d.X, point2d.Y, 0.0), lyrId_22DM_dmd);
(3)绘制网格线
for (int j = 0; j <= nCountX; j++)
{
Teigha.DatabaseServices.Line line = new Teigha.DatabaseServices.Line();
line.StartPoint = new Teigha.Geometry. Point3d(dOriX + dMM * j, dOriY, 0);
l i n e.E n d P o i n t=n e w T e i g h a.G e o m e t r y. Point3d(dOriX + dMM * j, dOriY + nCountY * dMM, 0);
btr.AppendEntity(line);
}
(4)绘制左右两侧断面标尺
Teigha.DatabaseServices.Line lineLeft = new Teigha.DatabaseServices.Line();
lineLeft.StartPoint = new Teigha.Geometry. Point3d(dOriX - 5.5, dOriY, 0);
lineLeft.EndPoint = new Teigha.Geometry.Poin t3d(dOriX - 5.5,dOriY + (nCountY + 1) * dMM, 0);
lineLeft.LayerId = lyrId_22DM_zbz;
btr.AppendEntity(lineLeft);
(5)添加线条和标注
for (int j = 0; j <= nCountY; j += 2)
{
Teigha.DatabaseServices.Polyline line = new Teigha.DatabaseServices.Polyline();
Teigha.Geometry.Point2d StartPoint = new Teigha.Geometry.Point2d(dOriX + nCountX * dMM + 5.0, dOriY + dMM * j);
Teigha.Geometry.Point2d EndPoint = new Teigha.Geometry.Point2d(dOriX + nCountX * dMM + 5.0, dOriY + dMM * (j + 1));
……
btr.AppendEntity(line);
}
5.6 系统运行效果
本文利用某段河流现有数据对系统的功能进行测试,并根据具体需求对相关参数进行设置,系统的运行
效果如图6所示,生成的横断面图成果如图7所示。
6  结束语
本文设计一种横断面数据自动提取算法,基于ArcGIS Engine实现了河道横断面自动成图系统,并利用试验数据进行测试。从断面图成果可知,系统自动生成的横断面图能较好呈现断面上的地形特征,与人工操作相比,大幅提高了横断面成图效率,使纵横断面数据与地形图数据一致,避免二者之间的矛盾[7],是一种较为理想的方法。未来,将尝试在项目中进一步应用,通过快速掌握河底地形特征,为河道水动力模拟仿真、河道管护、
防汛抗洪等工作提供技术支撑。
图7  断面图成果
图6  河道横断面自动成图系统界面
参考文献
张培存,吕存宣,王志军.断面测量内外业一体化系统研究[J].测绘通报,2004(10):32-34.
闫野,,武文波.基于Arc Engine的矿权管理系统[J].计算机系统应用,2011(4):65,159-162.
张习阚.基于Teigha.NET的CASS数据向GIS数据转换[J].数字通信世界,2020(4):2.
贺巧宁.基于GIS的河床演变断面分析方法体系研究[D].南京:河海大学,2007.
阳德胜.浅析道路纵横断面测量的一种辅助算法[J].公路工程,2008(1):97-100.
武国雄.道路纵横断面测量数据的半自动采集方法[J].城市勘测,2009(3):79-81.
吴长悦,戴超,李广.数字地形图及纵横断面图一体化测量方式探讨[J].矿山测量,2015(1):3-4.
[1]
[2]
[3]
[4]
[5]
[6]
[7]