方寿军
摘 要:天然河道水位-流量关系曲线计算方法和计算过程都比较简单,主要是采用曼宁公式进行计算,其关键工作是量取不同水位下的面积和湿周,通过面积和湿周计算出天然河槽的水力半径。传统计算过程中需要每个水位量取一次过水面积和对应的湿周,人工量取过程比较繁琐,工作量和计算密度有很大关系,人工量取过程都是重复的机械式操作,利用当下比较流行的Python语言结合pyautocad库,将这个繁琐过程交给计算机来处理,实现水位-流量关系曲线的自动计算。
关键词:水位;流量;水力半径;Python
引言:天然河道水位流量关系曲线计算比较简单,主要就是量取不同水位下的面积和湿周,但是过程比较繁琐,工作量和計算密度有很大关系,传统计算过程中需要每个水位量取一次过水面积和湿周[1],利用计算机编程可以将这个繁琐过程交给计算机来处理,本文采用当下较流行的Python语言来实现这个过程,和C#语言做比较,更简单、更高效、更实用。
Python是由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990 年代初设计。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言 2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,20年来首次将其置于Java、C和JavaScript之上,Python广泛开源的第三方库是其开发效率高的主要原因[2]。
此次天然河道水位流量关系曲线计算的开发语言选择也是由于Python语言的热度以及其开发的高效性。采用Python对CAD进行二次开发,可用的库不多,主要有pyautocad、pywin32、ezdxf、dxfgrabber、dxfwrite以及gdal,其中pyautocad通用性、易用性较好一些,pyautocad库由俄罗斯工程师Roman Haritonov开发,用于简化使用 Python 语言书写 AutoCAD ActiveX Automation 脚本,但是,这个库从2015年至今没有更新过。
天然河道水位流量关系曲线计算采用的是重绘法进行计算,主要思路是先读取已知的河槽断面,然后根据河槽判断最高点和最低点以及倒数第二高点,从最低点开始计算,直到计算至倒数第二高点,这样保证河槽有效断面上都能循环到,然后判断河槽宽度,按照河槽宽度来确定重绘河槽的范围[3]。
获取已知河槽的坐标信息采用pyautocad库也很简单,拾取河槽线,这个线可以是多段线(Polyline),也可以是三维多段线(AcDb3dPolyline),通过线的属性ObjectName获取其类型进行判别和过滤,然后通过Coordinates属性获取其顶点集合,Polyline和AcDb3dPolyline不同之处在于前者的每一个点只有两个元素(X坐标和Y坐标),而后者每一个点只有三个元素(X坐标、Y坐标和Z坐标)。
值得一提是采用C#、VB等语言编程时,线段没有ObjectName属性,其类型的判别需要用DxfCode编码组的逻辑运算来实现选择集过滤,线段没有Coordinates属性,用C#语言编写时,多段线(Polyline)可通过GetPoint3dAt()方法获取点坐标集合,但是三维多段线(AcDb3dPolyline)就没有GetPoint3dAt()方法,需要先得到三维多段线的Position点集合,然后把集合放进一个新的列表里面,下文提到的直线或线段的IntersectWith方法在C#、VB等语言里面也是没有的[4]。所以pyautocad库能把多段线、三维多段线(直线也可以)的顶点属性统一,从顶层引用,确实简化了很多代码工作量,逻辑上更符合我们的惯性思维。
单河槽河道判断很简单,从左岸到右岸,顺序重绘就行,但是多河槽河道需要判断哪些河槽是有效河道断面,需要判断河槽断面的上凸或下凹,只有下凹并且左右两岸都能跟水平面闭合才是有效河槽断面,河槽有效断面的判断是重点,首先根据pyautocad提供的方法IntersectWith求取两条线的交点,获得计算水平面和河槽交点(得到的交点是一个点集合,每个点有三个元素,后续使用需要按顺序取用),根据交点数量初步判断河槽是单河槽还是多河槽,不大于三个交点就是单河槽。
多河槽的另外一个难点是判断有效河槽范围,按点依次判断当前点的X坐标是否在第i个和第i+1个点中间,如果在,那么这一段必定是一个河槽,但是不一定是有效河槽,然后再判断当前点是否低于当前计算高程,低于的话当前点一定处于下凹的河槽断面上,这个点就是有效河槽的点,否则就是上凸的无效河槽或河滩。通过循环,得到所有的有效河槽原河槽坐标,加上之前求得的前后两个交点进行重绘,得到有效河槽新断面,利用线段的length属性,得到河槽的湿周,然后利用线段的Closed()方法将重绘得到的线段闭合,闭合后的线段就有了准确的面积属性,通过线段的area属性得到河槽的过水面积,这两个机械性的重复工作完成后,其他就简单了,采用曼宁公式进行河道流量计算,将计算结果写入excel文件即可(写入Excel这里用openpyxl库,Excel可用的库很多,根据实际选用)[5]。
Python在程序编写方面确实有着独特优势,效率高是公认的,但是其在运行速度上的弊端也是很明显的,因为Python属于解释型语言,另外,GIL锁(全局解释器锁,全称GlobalInterpreterLock) 限制并发,对多处理器支持不好[6]。当python的默认解释器要执行字节码时,都需要先申请这个锁。如果试图通过多线程扩展应用程序,将总是被这个全局解释器锁限制。所以其在运行速度上和其他语言对比起来要慢得多,特别是循环次数较多时候更突出,也有很多提高Python运行速度的方法,例如使用多进程、使用Cpython、数据处理时尽量使用csv替代xlsx、使用Numba编译、使用哈希表的数据结构、矢量化取代循环等等,但是小型项目对运行速度要求不高时候其实也没必要花那么多心思去提高运行速度,大型项目或者对运行速度要求较高时可以选择其他语言。另一方面,Python代码不能加密,对于想要实现代码加密的也只能选择其他语言。
通过采用不同编程语言对天然河道水位-流量关系曲线的自动化计算实现过程的对比,Python在小型项目中运用具有开发效率高,开发周期短的特性[7],对工程设计人员实现自动化辅助设计有着较大帮助。
参考文献:
[1]王衡,刘启和.水位流量关系曲线表批量计算[J].东北水利水电,2007,25(9).
[2]张楠.Python语言及其应用领域研究[J].科技创新导报,2019,16(17).
[3]胡艳娇,黄琦,田长涛.水位流量关系曲线绘制方法实例分析[J].科技创新与应用,2019(21).
[4]王月明,宫帅良,吕晓琪,等.基于AutoCAD二次开发实现测绘横断面处理的方法.
[5]曾晨,沈宫新.基于Python的线性回归性能分析[J].大众科技,2019,21(11).
[6]王学庆.基于Python的计算机软件应用技术研究[J].2022(4).
[7]孙运平,高玉春.AutoCAD二次开发及应用研究[J].商场现代化,2012(10):2.
猜你喜欢水位流量过去的一年开启了“流量”明星的凛冬时代?汉语世界(The World of Chinese)(2019年1期)2019-03-18流量大变局互联网经济(2018年5期)2018-05-14三大运营商联手阿里巴巴酝酿推出“流量钱包”中国信息化周报(2014年48期)2014-12-23七年级数学期中测试题(B)中学生数理化·七年级数学人教版(2008年10期)2008-01-21