可配置的管线并行检查程序设计与实现
2022-03-13钱承军戴相喜
钱承军,戴相喜
〔1.一汽(南京)科技开发有限公司,江苏 南京 211100;2.南京市测绘勘察研究院股份有限公司,江苏 南京 210019〕
0 引 言
地下管线是保障城市运行的重要基础设施,是城市的“生命线”。随着城镇化的快速推进,城市地下管线的数量和规模越来越大,结构层次也越来越复杂。国内很多城市都陆续开展了地下管线普查工作,全面查清城市范围内的地下管线现状,获取了准确的管线数据[1-4]。
戴相喜等[5-6]设计了一套可定制的管线质检模板;严玉瑶等[7-11]基于ArcGIS平台设计了质检规则库;付海龙[12]等基于OSG开源平台构建了三维管线动态建模与浏览平台,与AutoCAD二维管线数据结合进行质检。
一般基于AutoCAD开发的管线检查程序,是将管线数据规范要求的检查项、检查条件写进程序内部,用户无法更改。针对不同地区不同的管线数据规范,需要调整管线检查程序内部代码,才能符合当地的管线数据检查标准,工作量非常巨大,而且只适应程序对应的规范要求。
本文基于AutoCAD平台设计了一套可配置的并行处理管线数据检查程序,将管线内业数据按照检查类型分为图形检查、逻辑性检查和属性检查[13-14]。用户可以根据作业地区的管线数据标准,自行配置对应的检查模板,可对不同分组或同组的管线同时进行检查,由此可以快速确认管线数据的正确性,保证管线数据采集、入库、更新与共享的精准和迅速。
1 功能设计
根据不同地区的管线数据标准,可以制定对应的管线数据检查模板。程序通过读取管线数据检查模板,查找出检查类型、检查参数和检查条件。然后,需要设计一个图形实体属性信息类(图1),保存管线图形中所有对象的基本信息,如ObjectID、Code、点列、实体句柄、图层、shapetype和geotype等。当检查开始时,根据检查项的要求,读取管线图形中所有包含的对象,获取每个对象的基本信息,存入图形实体属性信息类中。再根据检查条件,从实体属性信息类集合中,筛选出满足条件的基本对象即可。每次根据检查条件,直接调用该集合即可,不必重新遍历管线图中所有的对象。最后,程序采用并行处理的方法,对多个检查条件进行分组,同时检查,可以有效地减少人工检查工作量,大大提高质检效率。
图1 图形实体属性类设计
1.1 模板和结果存储格式
根据不同地区管线数据标准,配置不同的模板参数,如检查规则、检查结果及软件相关系统参数,采用SQLite轻型的数据库对这些参数进行存储。该数据库是遵守ACID的关系型数据库管理系统,处理速度比Mysql、PostgreSQL开源数据库快得多,且与操作系统位数无关,安装轻便,使用便捷。另外,SQLite数据库只存储检查规则和结果,并不存储数据量庞大的城市管线数据,因此占用的系统资源非常低,可显著提升管线数据的读取、检查与存储效率。
1.2 图形基本信息类设计
目前较常见的检查程序是通过AutoCAD自带的对象过滤功能,挑选出待检查的图形集合,获取其ObjectID集合,然后根据需要检查的管线对象属性,循环遍历ObjectID对象获取其属性,再进行质量检查。该过滤过程是对整个图形对象的遍历搜索,速度非常慢。并且,获取到对象的ObjectID集合之后,还要根据ObjectID反向获取对象,再读取对象属性,这就形成了图形对象的二次读取,造成了时间上的冗余。
基于上述考虑,设计了图形实体属性信息类,该类涵盖了图形质量检查所需的大部分信息,仅需1次读取,就能完成所有检查。首先根据导入的AutoCAD管线图纸,遍历图纸中的各个对象,将各对象的基本信息存储到实体属性信息类中。而实体属性信息类存储在内存里,在进行图形质量检查时,程序可以直接从内存中获取所需对象各种属性信息,省去了2次获取对象的过程。如果一些特殊属性检查,实体属性信息类中并不包含该属性,一方面可根据类中保存的对象ObjectID,获取对象,读出相关属性数据,另一方面,可将该检查所需属性信息设计到实体属性信息类中,作为该类的成员,从而加快检查速度。
1.3 检查项设计
检查项的读取可通过设计“检查项选择”表(图2)实现,表中可设置组别、组内排序、检查项名称、应用图层、几何类型、参数和程序类名等。检查程序根据组别和检查项名称装载检查列表,其中,“参数”列可根据设定的“检查项名称”设定适合的检查参数,“是否使用”列根据质量检查参照的规范要求确定是否启用当前检查项。
图2 检查项选择表结构
“检查项选择”表可以供用户根据不同地区规范要求自行设计,选择是否使用已有的检查项,确定检查时的应用图层种类及数据几何类型等,也可增加新的检查项,制定与之匹配的检查参数。
1.4 应用图层设计
应用图层可设置属性检查适用的检查图层范围,即对何种管线进行该项检查。其中“ALLGX”“ALLSS”是2个综合性图层集合约定,分别表示图上所有类型管线图层和所有设施图层,例如,“ALLGX”适用于对所有类型管线都适用的检查,如变径点检查、重复实体检查和高程异常检查等。其余的应用图层类别按照管线种类缩写进行设计,如“PS”表示排水图层,“JS”表示给水图层等。所有图层名称(表1)可任意组合在一起,表示对组合中所有管线种类都适用的检查,如对硬管空间分析检查时,可将“RQ”“RL”“JS”“GY”“XX”类型组合起来检查。经过组合后,可以有效提取对应管线种类的对象,同时进行特定属性检查,做到针对特定检查,应检尽检。
表1 图层名称缩写与说明对照表
1.5 几何类型设计
“几何类型”设置为POINT、LINE、AREA、井室点、井室线、井室面、管沟边线、管廊点、管廊面和注记图层等。根据应用图层的设定,对满足图层种类的管线对象进行几何类型筛选,如要检查管线的埋设类型,则应用图层名称可设置为ALLGX,几何类型设置为LINE,即可检查所有图层中线形管线对象的埋设类型字段。
1.6 条件检查设计
条件检查分为条件必填属性检查和条件异常属性检查。条件必填属性检查对规范规定的必填字段值进行是否为空检查,必填检查字段不能为空;条件异常属性检查按照规范规定,检查字段值是否在预设范围内,如字段值是否在枚举值之中、字段是否为数字、是否为空、是否大于某一特定值等,若字段值不在,则判定待检查的字段值为异常字段值。
待检查的字段如果按照“字段名”的格式填写,没有说明属性表名称,则默认读取管线对象主表中的字段名对应的字段值。待检查字段如果按照“表名.字段名”的格式填写,表示对管线对象扩展属性表的检查(图3),其中表名为对象扩展属性表的名称。 该检查字段设计实现了管线实体任一属性表属性字段的检查以及属性表之间关联字段的联合检查,增强了检查的全面性和灵活性。
图3 条件检查中检查扩展属性表中字段值举例
如南京排水标准中规定所有管线及设施养护表的设施类型字段值不应为空,应填对应枚举值,则检查受限字段名1可设置为ps_managment.feature_type,表示待检查的扩展属性表名为养护表(ps_managment),表中的字段名为设施类型(feature_type)。若管线对象扩展属性表没有养护表(ps_management),则程序会直接在主表中查找设施类型(feature_type)字段。
为适应多场合检查,提供更加灵活多变的字段比较方法,根据常用检查方法,设计了6种字段比较类型,分别为枚举值集合、值域比较、值域区间、值域排除、其他字段值比较和正则表达式匹配,具体标识符和例子如表2所示。
表2 字段比较类型及其标识符说明
表2中,唯一值、多个枚举值或空值用{}表示,如燃气管线压力值应为“低压,中压,高压”中的一种值,则检查字段名为压力(yl),受限值应为{低压,中压,高压};值域比较用常规的比较符合表示(>、>=、<、<=),等于符号可用枚举值集合替代,不等于符号可用值域排除Not In {}符号表示;值域开闭区间可用[]和()表示;与其他字段值关联比较可通过关键字Field:表示,可读取对应字段值;字段比较类型支持正则表达式匹配,更加具有兼容性与开放性。
首先,设计检查程序1次性读取“条件属性检查”表中所有检查条件,并按照应用图层和几何类型进行分组。在检查时,按照组别,过滤满足图层和几何类型要求的管线实体集合,读取集合对象的所有属性信息。然后,对管线实体集合,按照读取的检查条件,逐条件项进行检查。如此设计,实现了1次读取设定图层和设定几何类型的实体后,将所有条件属性检查全部检查完毕,保证1次性过滤管线实体、1次性读取检查条件,同类管线实体同时进行检查,避免了管线实体的多次读取,加快了检查速度,具体流程如图4所示。
图4 条件必填与异常属性检查流程图
2 程序实现
本程序基于AutoCAD 2013 64位平台,使用其提供的.NET API接口,采用C#语言基于.NET FRAMEWORK4.0框架实现。利用微软.NET框架的一种自然查询的SQL语法——语言集成查询LINQ(Language Integrated Query)技术,使用其AsParallel方法,可实现并行化查询。如当进行某一条件的检查时,对读取到的符合检查条件的多个实体的图形基本信息类进行并行同时检查,避免了因检查对象过多而造成的拥塞和排队现象。另外,设置进度条为DOTNETARX类库的ProgressManager,可以明显改善进度条展示效果,无丝毫卡顿现象,高效地增加了检查速度和效率。
根据《南京市管线探测技术规程》[15-16]设计南京市专业管线检查模板,设计了空间检查、逻辑性检查和属性检查3类,每种检查类型根据实际生产需求,设计了不同的检查项,具体分类如表3所示。
表3 检查项及其测试所用时间
3 程序测试
以南京市某区一幅管线标准库成图数据为例,图上共有30 168个实体对象,分别使用戴相喜等[6]的方法和本文方法对该图中实体对象进行条件必填属性检查和条件异常属性检查,检查情况如表4所示。由对比结果可以明显看出,本程序的并行处理算法可以超快速完成管线数据的检查,执行效率成指数级提高,但因读取的所有实体对象属性信息均保存在系统内存中,所以运行内存较戴相喜等[6]的方法多。
再对该数据图按表3所示三大类检查进行检查,全部检查共计耗时4′55.9″(表4),检查表中设置的条件越多,检查项越多,执行检查耗时会越长。
表4 条件属性检查用时和内存占用比较
4 结 语
本文设计并实现了一种基于Sqlite轻量化数据库的可配置的管线检查程序,展示了一套实现字段比较的标识符比较方法。同时,程序基于微软.NET框架的LINQ并行处理技术,实现了1次读取检查条件和全图管线实体的基本信息,同一时刻多实体同时同步检查,极大降低了管线数据检查的时间冗余度,提高了管线数据质量的检查效率。该检查程序已成功运用于南京专业管线项目、南京综合管线项目、上海综合管线项目以及江西供水项目中。经实际项目验证,该方法运行时间短,检查效果好,模板配置简便。因程序需要读取所有管线对象的信息存放在内存中,因此,当检查包含大批量管线对象的数据时,会造成内存空间不够用的情况,后期维护及增强程序时,可考虑对管线图进行分块、分区域检查,以降低内存,保证质量检查过程高效进行。