基于向量的河流岸别判定方法
2015-12-30武玉峰
武玉峰
(辽宁省水利水电科学研究院,辽宁 沈阳 110003)
基于向量的河流岸别判定方法
武玉峰
(辽宁省水利水电科学研究院,辽宁 沈阳 110003)
岸别是河流普查中的一项重要内容,在河流普查中,往往有上千条河,如果采用传统方法去判别不仅费时费力而且很容易出错。基于这种需求,在已知河流流向的情况下,利用干流和支流的向量积并通过 ArcPy编程来进行河流岸别的判断。该方法在辽宁省河流普查中得到了应用,并取得了很好的效果。
河网;岸别;向量;有向图;拓扑检查;Arcpy
1 引言
河流湖泊情况是国家基本国情资料,属于重要的基本国情信息。在第一次全国水利普查中对全国河湖基本情况进行了一次大范围的普查,如果依靠传统手段,这几乎是不可能完成的任务,但是随着信息技术和空间技术的飞速发展,在此次普查中应用了很多遥感、地理信息等高新技术,使得这次普查任务能够顺利完成。
辽宁省在此次普查中,摸清了流域面积为50km2以上河流的基本情况,填补了辽宁省基本国情信息体系中河湖信息的空白,对于经济社会发展具有十分重要的意义。在此基础上辽宁省又进行了10km2以上河流的普查。
岸别是河流普查中的一项重要内容,普查中对岸别的定义为:本级河流位于上级河流的左岸或右岸。传统的河流岸别判定方法是采用人工判定,即面向水流的方向,左手边的岸为左岸,右手边的岸为右岸。这种方法对数量较少的河网是可行的,但是在河流普查中,往往有上千条河,如果仍然采用这种传统方法去判别不仅费时费力而且很容易出错。基于这种需求,在已知河流流向的情况下,利用干流和支流的向量积并通过ArcPy编程来进行河流岸别的判断。
2 研究应用的区域
辽宁省流域水系划分为三大流域七大水系。三大流域分别为辽河流域、黑龙江流域和海河流域。经过第一次全国水利普查,全省流域面积大于等于50km2以上的河流共 854条。按河流类型分为三类,山地河流787条,平原河流57条,混合河流1条。按流域面积划分为三类,大型河流16条(流域面积大于5000km2),中型河流32条(流域面积为1000~5000km2),小型河流74条(流域面积 100~1000km2)。在第一次全国水利普查成果的基础上,辽宁省对流域面积为10~50km2河流做了进一步普查。
3 基本原理
在数学中,向量是一个具有大小和方向的几何对象,通常它可以形象的用一条带箭头的线段来表示,箭头所指的方向即为向量的方向,箭头一端的点是向量的终点,另一端是向量的起点,线段的长度表示向量的大小。在一个向量空间中定义了很多运算,其中,向量积又称为叉积、矢量积,是本文中用到的运算。向量积定义:的向量积为的方向既垂直于又垂直于指向符合右手规则。当位于的不同侧时,向量积的方向相反,如下图所示。
对于二维向量,向量积的坐标表达式为:
其中标量ax×by-ay×bx即代表了向量积的方向。我们用代表干流的方向,用代表支流的方向。的方向即可表示支流位于干流的哪一侧。
图1 二维向量的向量积图
4 具体实现
从 DEM中提取到河网矢量数据后,经过拓扑检查无数据错误,对原始河网进行简化,将简化后的河网抽象为有向图这种逻辑结构,并以链表的形式将抽象后的图存储在内存中,最后通过广度优先搜索算法从代表 0级河流的节点开始遍历内存中的河网,在遍历过程中就可计算出每条河的岸别。
4.1 河网矢量数据的提取
DEM(Digital Elevation Model数字高程模型),包含了丰富的高程信息,从DEM中提取河网的方法已有相当多的国内外文献和资料,也有很多的软件工具可以使用,例如A rcGis的Hydrology Model(水文分析模块)、ArcSWAT、River Tools等,无论使用什么工具和方法最终都可从 DEM中提取的河网的矢量数据,详细过程本文在这里不再赘述。
4.2 数据拓扑检查
因为河网是从 DEM中自动提取的,由于计算误差,数据误差以及阈值设置等因素的影响,不可避免的会有一些错误,同时为了与已有的 50km2以上河流数据无缝对接,以及保证后面计算结果的正确,必须利用 arcgis的拓扑工具对这些错误进行检查和修复,为此必须将河网矢量数据以数据集的形式存储在Arcgis的Geodatabase中,这样才可以使用arcgis的拓扑工具。
拓扑工具主要检查违反以下规则的数据错误。
(1)不能与其它要素相交:线不能与另一个图层中的其它线相交或叠置。第一个图层中任何与第二个图层中的线叠置或相交的线都是错误的,如图2.a所示。
(2)不能重叠:一个图层中的线不能与同一图层中的线重叠。任何重叠的线都是错误的,如图2.b所示。
(3)不能相交:同一图层中的线相互之间不能相交或叠置。任何与要素叠置的线或任何相交点都是错误的,如图 2.c。
(4)不能自相交:一个图层中的线要素不能自相交。任何存在自相交的点都是错误的,如图2.d。
(5)不能自重叠:一个图层中的线要素不能自叠置,任何存在要素自叠置的线都是错误的,如图2.e。
(6)一个图层中的线要素不能具有一个以上的构成部分。任何具有超过一个构成部分的线要素都是错误的,如图 2.f。
图2 检查河网数据的拓扑规则图
规则(1)用于检查 10~50km2河流与50km2以上河流的无缝衔接。规则(2)、(3)、(4)、(5)、(6)则保证了10~50km2河流自身的拓扑正确性。
4.3 数据简化
从DEM中提取出的干流和支流都是极不规则的曲线,两条曲线交汇于一点,如果要直接在交汇点处找出能够代表干流和支流方向的向量是很困难的,所以首先需要把河流的矢量数据进行简化,简化过程中还要保持干流和支流之间的拓扑关系。
这一操作可以通过arcgis toolbox的简化线工具来完成,简化采用POINT REMOVE算法,最大允许偏移量为 1000m,并勾选“解决拓扑错误”选项,图 3即是简化前后的抚顺市刘家河水系。
4.4 构建河网
通过以上步骤,我们已获取到可以进行实际计算的数据。任何利用计算机进行的计算,首先必须要将数据载入内存,为此必须构建一个合理的数据结构来存储整个河网,而且这种数据结构不仅要存储河网的基本信息还必须反映河网的拓扑关系。笔者经过多番研究最终采用了“有向图”这一数据结构,对河网进行了抽象。有向图是图论中的一个重要概念,它的定义如下。
图3 简化前后的水系图
所谓有向图D是一个有序对(V(D),A(D)),其中V(D)是一个非空有限集,V(D)中的元素称为顶点,A(D)是由V(D)中的元素组成的一些有序对构成,并且要求:①构成有序对的两个元素不同,②任何两个有序对不同。显然A(D)是一个有限集。A(D)中的元素称为弧。图 4所示即为一个典型的有向图。
图4 有向图
基于有向图的概念,我们将河网的每条河作为有向图中的一个顶点,河与河之间的上下级关系用弧来表示,即由下级河流指向上级河流,表示下级河流汇入上级河流。将图3中的抚顺刘家河水系抽象为有向图如图5所示。
图5 用有向图表示的河网图
构建河网时,从0级入海河流开始,利用空间关系找出汇入0级河流的一级河流,并与0级河流建立关系,然后从找到的一级河流开始,利用空间关系找出汇入一级河流的二级河流并建立关系,依次类推即可遍历河网中所有的河流,从而建立虚拟河网。
需要注意的是平原区的河流,例如引水灌渠等,跨流域引水工程等破坏整个河网的拓扑有序性,因为这些河流数量较少,可以先从数据中排除这些河流再进行计算。
4.5 递归遍历河网并计算岸别
因为在简化时保留了干支流间的拓扑关系,所以简化后的水系也保留了干支流的左右岸关系。从右侧的简化图我们可以很容易的找到代表干支流方向的向量,即在交汇点处的干流线段和支流线段。如下图 6所示。
图6 参与计算的向量图
简化后的水系都为折线,而且干支流都在折线的节点处相交,现在我们只需从简化后的干流的起点出发,遍历每一个节点,如果有支流在此节点汇入,就取出在此节点相交的两条线段,并分别读取干流线段终点坐标(ax1,ay1),干流线段起点坐标(ax2,ay2)、支流线段终点坐标(bx1, by1),支流线段起点坐标(bx2,by2),然后分别计算得干流线段的向量和支流线段的向量:
利用公式(1)计算向量积得:
若n>0则支流位于干流的右岸,若n<0则支流位于干流的左岸。
以上算法全部用Arcpy实现,ArcPy是ESRI从ArcGIS 10开始在所有产品中集成的基于Python的站点包,完全代替了之前的ArcGIS VB Scriptmodule。站点包是 Python术语,表示将附加函数添加到Python的库。ArcPy为用户提供了使用Python语言操作所有地理处理工具(包括扩展模块)的机会,并提供了多种有用的函数和类,以用于访问和处理GIS数据。限于篇幅只列出关键代码片段如下:
……………………………………………
a1=trunk.lastPoint.X-trunk.firstPoint.X
b1=trunk.lastPoint.Y-trunk.firstPoint.Y
a2=endPoint.X-startPoint.X
b2=endPoint.Y-startPoint.Y
#计算方向
n=a1*b2-a2*b1
if n>0:
direct=u“右岸”
else:
direct=u“左岸”
……………………………………………………
在实际编码过程中,河流岸别是在构建河网的过程中进行计算的,而不是在河网构建完成后,再对河网进行遍历,因为构建河网的过程实际上就是一个广度优先的遍历过程。
5 结论
本文所述的河流岸别的判定是在计算机内存中构建的抽象河网的基础上进行的,实际上基于这个抽象河网还可对河流级别、流域面积、弯曲系数、不均匀系数、形状系数、平均宽度等流域特征参数进行计算。本算法大大提高了河网岸别判定的工作效率,以本次应用研究区域为例,辽宁省10km2以上的河流约有3536条,利用本算法在普通PC上1分钟内即可完成所有河流岸别的判定,并且准确率达到100%,而且与已有的50 km2以上河流普查成果完全一致,如果采用人工判定,则至少需要一个工作日的时间,而且还不能保证数据的准确性。
[1]顾群.泰州市城市水系规划河网数值计算研究[J].水利规划与设计,2014(09).
[2]严锋,郭玉法,刘波,陈斌.GIS技术在地下水资源研究中的应用现状及前景[J].水利技术监督,2005(05).
[3]辽宁省水利厅.辽宁省水利基础信息集[M].北京:中国水利水电出版社,2013.
[4]徐俊明.图论[M].中国科学技术大学出版社,1998.
[5]严蔚敏.数据结构[M].清华大学出版社,2007.
[6]朱嘉伟.渠江水系河网探究[J].水利规划与设计,2011(02).
[7]国务院第一次全国水利普查领导小组办公室.河湖基本情况普[M].北京:中国水利水电出版社,2010.
[8]陈俊明,林广发,杨志海,陈瀚阅.数字河网提取的影响参数优化分析[J].地球信息科学学报,2011,13(01)
[9]董婷婷.基于DEM的清河流域大中小型河流特征值自动提取[J].水利规划与设计,2014(10).
TV21
:A
:1008-1305(2015)05-0049-04
10.3969/j.issn.1008-1305.2015.05.018
武玉峰(1979年—)男,硕士,工程师。