錢承軍,戴相喜
〔1.一汽(南京)科技開發(fā)有限公司,江蘇 南京 211100;2.南京市測繪勘察研究院股份有限公司,江蘇 南京 210019〕
地下管線是保障城市運行的重要基礎(chǔ)設(shè)施,是城市的“生命線”。隨著城鎮(zhèn)化的快速推進,城市地下管線的數(shù)量和規(guī)模越來越大,結(jié)構(gòu)層次也越來越復(fù)雜。國內(nèi)很多城市都陸續(xù)開展了地下管線普查工作,全面查清城市范圍內(nèi)的地下管線現(xiàn)狀,獲取了準(zhǔn)確的管線數(shù)據(jù)[1-4]。
戴相喜等[5-6]設(shè)計了一套可定制的管線質(zhì)檢模板;嚴(yán)玉瑤等[7-11]基于ArcGIS平臺設(shè)計了質(zhì)檢規(guī)則庫;付海龍[12]等基于OSG開源平臺構(gòu)建了三維管線動態(tài)建模與瀏覽平臺,與AutoCAD二維管線數(shù)據(jù)結(jié)合進行質(zhì)檢。
一般基于AutoCAD開發(fā)的管線檢查程序,是將管線數(shù)據(jù)規(guī)范要求的檢查項、檢查條件寫進程序內(nèi)部,用戶無法更改。針對不同地區(qū)不同的管線數(shù)據(jù)規(guī)范,需要調(diào)整管線檢查程序內(nèi)部代碼,才能符合當(dāng)?shù)氐墓芫€數(shù)據(jù)檢查標(biāo)準(zhǔn),工作量非常巨大,而且只適應(yīng)程序?qū)?yīng)的規(guī)范要求。
本文基于AutoCAD平臺設(shè)計了一套可配置的并行處理管線數(shù)據(jù)檢查程序,將管線內(nèi)業(yè)數(shù)據(jù)按照檢查類型分為圖形檢查、邏輯性檢查和屬性檢查[13-14]。用戶可以根據(jù)作業(yè)地區(qū)的管線數(shù)據(jù)標(biāo)準(zhǔn),自行配置對應(yīng)的檢查模板,可對不同分組或同組的管線同時進行檢查,由此可以快速確認(rèn)管線數(shù)據(jù)的正確性,保證管線數(shù)據(jù)采集、入庫、更新與共享的精準(zhǔn)和迅速。
根據(jù)不同地區(qū)的管線數(shù)據(jù)標(biāo)準(zhǔn),可以制定對應(yīng)的管線數(shù)據(jù)檢查模板。程序通過讀取管線數(shù)據(jù)檢查模板,查找出檢查類型、檢查參數(shù)和檢查條件。然后,需要設(shè)計一個圖形實體屬性信息類(圖1),保存管線圖形中所有對象的基本信息,如ObjectID、Code、點列、實體句柄、圖層、shapetype和geotype等。當(dāng)檢查開始時,根據(jù)檢查項的要求,讀取管線圖形中所有包含的對象,獲取每個對象的基本信息,存入圖形實體屬性信息類中。再根據(jù)檢查條件,從實體屬性信息類集合中,篩選出滿足條件的基本對象即可。每次根據(jù)檢查條件,直接調(diào)用該集合即可,不必重新遍歷管線圖中所有的對象。最后,程序采用并行處理的方法,對多個檢查條件進行分組,同時檢查,可以有效地減少人工檢查工作量,大大提高質(zhì)檢效率。
圖1 圖形實體屬性類設(shè)計
根據(jù)不同地區(qū)管線數(shù)據(jù)標(biāo)準(zhǔn),配置不同的模板參數(shù),如檢查規(guī)則、檢查結(jié)果及軟件相關(guān)系統(tǒng)參數(shù),采用SQLite輕型的數(shù)據(jù)庫對這些參數(shù)進行存儲。該數(shù)據(jù)庫是遵守ACID的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),處理速度比Mysql、PostgreSQL開源數(shù)據(jù)庫快得多,且與操作系統(tǒng)位數(shù)無關(guān),安裝輕便,使用便捷。另外,SQLite數(shù)據(jù)庫只存儲檢查規(guī)則和結(jié)果,并不存儲數(shù)據(jù)量龐大的城市管線數(shù)據(jù),因此占用的系統(tǒng)資源非常低,可顯著提升管線數(shù)據(jù)的讀取、檢查與存儲效率。
目前較常見的檢查程序是通過AutoCAD自帶的對象過濾功能,挑選出待檢查的圖形集合,獲取其ObjectID集合,然后根據(jù)需要檢查的管線對象屬性,循環(huán)遍歷ObjectID對象獲取其屬性,再進行質(zhì)量檢查。該過濾過程是對整個圖形對象的遍歷搜索,速度非常慢。并且,獲取到對象的ObjectID集合之后,還要根據(jù)ObjectID反向獲取對象,再讀取對象屬性,這就形成了圖形對象的二次讀取,造成了時間上的冗余。
基于上述考慮,設(shè)計了圖形實體屬性信息類,該類涵蓋了圖形質(zhì)量檢查所需的大部分信息,僅需1次讀取,就能完成所有檢查。首先根據(jù)導(dǎo)入的AutoCAD管線圖紙,遍歷圖紙中的各個對象,將各對象的基本信息存儲到實體屬性信息類中。而實體屬性信息類存儲在內(nèi)存里,在進行圖形質(zhì)量檢查時,程序可以直接從內(nèi)存中獲取所需對象各種屬性信息,省去了2次獲取對象的過程。如果一些特殊屬性檢查,實體屬性信息類中并不包含該屬性,一方面可根據(jù)類中保存的對象ObjectID,獲取對象,讀出相關(guān)屬性數(shù)據(jù),另一方面,可將該檢查所需屬性信息設(shè)計到實體屬性信息類中,作為該類的成員,從而加快檢查速度。
檢查項的讀取可通過設(shè)計“檢查項選擇”表(圖2)實現(xiàn),表中可設(shè)置組別、組內(nèi)排序、檢查項名稱、應(yīng)用圖層、幾何類型、參數(shù)和程序類名等。檢查程序根據(jù)組別和檢查項名稱裝載檢查列表,其中,“參數(shù)”列可根據(jù)設(shè)定的“檢查項名稱”設(shè)定適合的檢查參數(shù),“是否使用”列根據(jù)質(zhì)量檢查參照的規(guī)范要求確定是否啟用當(dāng)前檢查項。
圖2 檢查項選擇表結(jié)構(gòu)
“檢查項選擇”表可以供用戶根據(jù)不同地區(qū)規(guī)范要求自行設(shè)計,選擇是否使用已有的檢查項,確定檢查時的應(yīng)用圖層種類及數(shù)據(jù)幾何類型等,也可增加新的檢查項,制定與之匹配的檢查參數(shù)。
應(yīng)用圖層可設(shè)置屬性檢查適用的檢查圖層范圍,即對何種管線進行該項檢查。其中“ALLGX”“ALLSS”是2個綜合性圖層集合約定,分別表示圖上所有類型管線圖層和所有設(shè)施圖層,例如,“ALLGX”適用于對所有類型管線都適用的檢查,如變徑點檢查、重復(fù)實體檢查和高程異常檢查等。其余的應(yīng)用圖層類別按照管線種類縮寫進行設(shè)計,如“PS”表示排水圖層,“JS”表示給水圖層等。所有圖層名稱(表1)可任意組合在一起,表示對組合中所有管線種類都適用的檢查,如對硬管空間分析檢查時,可將“RQ”“RL”“JS”“GY”“XX”類型組合起來檢查。經(jīng)過組合后,可以有效提取對應(yīng)管線種類的對象,同時進行特定屬性檢查,做到針對特定檢查,應(yīng)檢盡檢。
表1 圖層名稱縮寫與說明對照表
“幾何類型”設(shè)置為POINT、LINE、AREA、井室點、井室線、井室面、管溝邊線、管廊點、管廊面和注記圖層等。根據(jù)應(yīng)用圖層的設(shè)定,對滿足圖層種類的管線對象進行幾何類型篩選,如要檢查管線的埋設(shè)類型,則應(yīng)用圖層名稱可設(shè)置為ALLGX,幾何類型設(shè)置為LINE,即可檢查所有圖層中線形管線對象的埋設(shè)類型字段。
條件檢查分為條件必填屬性檢查和條件異常屬性檢查。條件必填屬性檢查對規(guī)范規(guī)定的必填字段值進行是否為空檢查,必填檢查字段不能為空;條件異常屬性檢查按照規(guī)范規(guī)定,檢查字段值是否在預(yù)設(shè)范圍內(nèi),如字段值是否在枚舉值之中、字段是否為數(shù)字、是否為空、是否大于某一特定值等,若字段值不在,則判定待檢查的字段值為異常字段值。
待檢查的字段如果按照“字段名”的格式填寫,沒有說明屬性表名稱,則默認(rèn)讀取管線對象主表中的字段名對應(yīng)的字段值。待檢查字段如果按照“表名.字段名”的格式填寫,表示對管線對象擴展屬性表的檢查(圖3),其中表名為對象擴展屬性表的名稱。 該檢查字段設(shè)計實現(xiàn)了管線實體任一屬性表屬性字段的檢查以及屬性表之間關(guān)聯(lián)字段的聯(lián)合檢查,增強了檢查的全面性和靈活性。
圖3 條件檢查中檢查擴展屬性表中字段值舉例
如南京排水標(biāo)準(zhǔn)中規(guī)定所有管線及設(shè)施養(yǎng)護表的設(shè)施類型字段值不應(yīng)為空,應(yīng)填對應(yīng)枚舉值,則檢查受限字段名1可設(shè)置為ps_managment.feature_type,表示待檢查的擴展屬性表名為養(yǎng)護表(ps_managment),表中的字段名為設(shè)施類型(feature_type)。若管線對象擴展屬性表沒有養(yǎng)護表(ps_management),則程序會直接在主表中查找設(shè)施類型(feature_type)字段。
為適應(yīng)多場合檢查,提供更加靈活多變的字段比較方法,根據(jù)常用檢查方法,設(shè)計了6種字段比較類型,分別為枚舉值集合、值域比較、值域區(qū)間、值域排除、其他字段值比較和正則表達式匹配,具體標(biāo)識符和例子如表2所示。
表2 字段比較類型及其標(biāo)識符說明
表2中,唯一值、多個枚舉值或空值用{}表示,如燃?xì)夤芫€壓力值應(yīng)為“低壓,中壓,高壓”中的一種值,則檢查字段名為壓力(yl),受限值應(yīng)為{低壓,中壓,高壓};值域比較用常規(guī)的比較符合表示(>、>=、<、<=),等于符號可用枚舉值集合替代,不等于符號可用值域排除Not In {}符號表示;值域開閉區(qū)間可用[]和()表示;與其他字段值關(guān)聯(lián)比較可通過關(guān)鍵字Field:表示,可讀取對應(yīng)字段值;字段比較類型支持正則表達式匹配,更加具有兼容性與開放性。
首先,設(shè)計檢查程序1次性讀取“條件屬性檢查”表中所有檢查條件,并按照應(yīng)用圖層和幾何類型進行分組。在檢查時,按照組別,過濾滿足圖層和幾何類型要求的管線實體集合,讀取集合對象的所有屬性信息。然后,對管線實體集合,按照讀取的檢查條件,逐條件項進行檢查。如此設(shè)計,實現(xiàn)了1次讀取設(shè)定圖層和設(shè)定幾何類型的實體后,將所有條件屬性檢查全部檢查完畢,保證1次性過濾管線實體、1次性讀取檢查條件,同類管線實體同時進行檢查,避免了管線實體的多次讀取,加快了檢查速度,具體流程如圖4所示。
圖4 條件必填與異常屬性檢查流程圖
本程序基于AutoCAD 2013 64位平臺,使用其提供的.NET API接口,采用C#語言基于.NET FRAMEWORK4.0框架實現(xiàn)。利用微軟.NET框架的一種自然查詢的SQL語法——語言集成查詢LINQ(Language Integrated Query)技術(shù),使用其AsParallel方法,可實現(xiàn)并行化查詢。如當(dāng)進行某一條件的檢查時,對讀取到的符合檢查條件的多個實體的圖形基本信息類進行并行同時檢查,避免了因檢查對象過多而造成的擁塞和排隊現(xiàn)象。另外,設(shè)置進度條為DOTNETARX類庫的ProgressManager,可以明顯改善進度條展示效果,無絲毫卡頓現(xiàn)象,高效地增加了檢查速度和效率。
根據(jù)《南京市管線探測技術(shù)規(guī)程》[15-16]設(shè)計南京市專業(yè)管線檢查模板,設(shè)計了空間檢查、邏輯性檢查和屬性檢查3類,每種檢查類型根據(jù)實際生產(chǎn)需求,設(shè)計了不同的檢查項,具體分類如表3所示。
表3 檢查項及其測試所用時間
以南京市某區(qū)一幅管線標(biāo)準(zhǔn)庫成圖數(shù)據(jù)為例,圖上共有30 168個實體對象,分別使用戴相喜等[6]的方法和本文方法對該圖中實體對象進行條件必填屬性檢查和條件異常屬性檢查,檢查情況如表4所示。由對比結(jié)果可以明顯看出,本程序的并行處理算法可以超快速完成管線數(shù)據(jù)的檢查,執(zhí)行效率成指數(shù)級提高,但因讀取的所有實體對象屬性信息均保存在系統(tǒng)內(nèi)存中,所以運行內(nèi)存較戴相喜等[6]的方法多。
再對該數(shù)據(jù)圖按表3所示三大類檢查進行檢查,全部檢查共計耗時4′55.9″(表4),檢查表中設(shè)置的條件越多,檢查項越多,執(zhí)行檢查耗時會越長。
表4 條件屬性檢查用時和內(nèi)存占用比較
本文設(shè)計并實現(xiàn)了一種基于Sqlite輕量化數(shù)據(jù)庫的可配置的管線檢查程序,展示了一套實現(xiàn)字段比較的標(biāo)識符比較方法。同時,程序基于微軟.NET框架的LINQ并行處理技術(shù),實現(xiàn)了1次讀取檢查條件和全圖管線實體的基本信息,同一時刻多實體同時同步檢查,極大降低了管線數(shù)據(jù)檢查的時間冗余度,提高了管線數(shù)據(jù)質(zhì)量的檢查效率。該檢查程序已成功運用于南京專業(yè)管線項目、南京綜合管線項目、上海綜合管線項目以及江西供水項目中。經(jīng)實際項目驗證,該方法運行時間短,檢查效果好,模板配置簡便。因程序需要讀取所有管線對象的信息存放在內(nèi)存中,因此,當(dāng)檢查包含大批量管線對象的數(shù)據(jù)時,會造成內(nèi)存空間不夠用的情況,后期維護及增強程序時,可考慮對管線圖進行分塊、分區(qū)域檢查,以降低內(nèi)存,保證質(zhì)量檢查過程高效進行。