黃北生,盛盈盈
(江蘇省地質(zhì)測(cè)繪院,江蘇 南京 211102)
AutoCAD是由美國(guó)Autodesk公司開發(fā)的一種通用計(jì)算機(jī)輔助設(shè)計(jì)軟件,功能強(qiáng)大且可定制性高,深受廣大測(cè)繪技術(shù)人員的喜愛,在測(cè)繪行業(yè)中有著廣泛的應(yīng)用。AutoCAD默認(rèn)的DWG數(shù)據(jù)格式已成為存儲(chǔ)地形圖成果數(shù)據(jù)的標(biāo)準(zhǔn)。AutoCAD通用性強(qiáng),沒(méi)有針對(duì)測(cè)繪行業(yè)進(jìn)行專業(yè)定制,致使眾多測(cè)繪單位根據(jù)內(nèi)部生產(chǎn)流程與數(shù)據(jù)組織方式開發(fā)了基于AutoCAD的專用繪圖軟件,以提高測(cè)繪生產(chǎn)的效率與質(zhì)量。
高程點(diǎn)和等高線是地形圖數(shù)據(jù)的重要組成部分,保證高程點(diǎn)與等高線之間關(guān)系的正確性是地形圖質(zhì)量控制的一項(xiàng)重要工作。正常情況下,如果一個(gè)高程點(diǎn)位于兩根等高線之間,那么此高程點(diǎn)的高程值應(yīng)介于兩根等高線的高程值之間。如果某個(gè)高程點(diǎn)的高程值不滿足上述條件,則將高程點(diǎn)與等高線產(chǎn)生的矛盾稱為高曲矛盾。在沒(méi)有高曲矛盾檢查軟件時(shí),人工目視檢查是檢查高曲矛盾的主要方法,這種方法檢查效率低,而且容易導(dǎo)致漏查、錯(cuò)查,因此需要設(shè)計(jì)一種通過(guò)軟件實(shí)現(xiàn)高曲矛盾自動(dòng)檢查的工具,以提高檢查準(zhǔn)確率及地形圖生產(chǎn)的效率。
文獻(xiàn)資料檢索結(jié)果表明,高曲矛盾自動(dòng)化檢查雖受到了一定關(guān)注,但相關(guān)研究尚處于起步階段,胡現(xiàn)輝等[1]編制的高曲矛盾檢查工具能夠提高生產(chǎn)效率與產(chǎn)品質(zhì)量,但難以判斷地形圖邊緣區(qū)域及復(fù)雜區(qū)域的高曲矛盾問(wèn)題。武安狀等[2]基于放射線法開發(fā)了檢查高曲矛盾的工具,能夠極大減少檢查工作量,但需聯(lián)動(dòng)ObjectARX、AutoCAD以及Visual Studio進(jìn)行開發(fā),不便于二次實(shí)現(xiàn)。段文化等[3]基于FME平臺(tái)分別實(shí)現(xiàn)了構(gòu)TIN法與放射線法的高曲矛盾檢查,且對(duì)比發(fā)現(xiàn)兩種檢查方法具有較高的正確率,但算法程序需按經(jīng)驗(yàn)預(yù)設(shè)合理參數(shù),參數(shù)不合理會(huì)致使檢查結(jié)果出現(xiàn)差異。綜上,為降低開發(fā)難度以及提高高曲矛盾工具的適用性,本文基于構(gòu)建TIN法,通過(guò)成熟的ArcEngine軟件提供的二次開發(fā)接口編制高曲矛盾的自動(dòng)化檢查程序,在降低開發(fā)難度的同時(shí),能極大提高質(zhì)檢工作者的檢查效率。
在AutoCAD中,高程點(diǎn)一般使用屬性塊(Attribute Block)表示,等高線一般使用多段線(Polyline)表示。高曲矛盾檢查是默認(rèn)在等高線高程值無(wú)錯(cuò)的前提下進(jìn)行的,若查詢存在高曲矛盾現(xiàn)象,則統(tǒng)一認(rèn)為是高程點(diǎn)的高程值存在問(wèn)題。進(jìn)行高曲矛盾檢查時(shí),首先從AutoCAD中將高程點(diǎn)及等高線分別提取到相應(yīng)的高程數(shù)據(jù)文件中,然后調(diào)用ArcEngine提供的API讀取高程數(shù)據(jù)文件并對(duì)提取的高程點(diǎn)及等高線進(jìn)行構(gòu)TIN處理。構(gòu)建TIN后,根據(jù)原高程點(diǎn)的平面坐標(biāo),查詢此位置構(gòu)TIN后的高程值,再將原高程值與TIN中的高程值進(jìn)行對(duì)比,以確定原高程值是否合理[3]。
確定原高程值是否合理,首先需要計(jì)算此點(diǎn)所在的高程區(qū)位值:
(1)
式中,Index為高程值所在的區(qū)位值;E′為通過(guò)位置與TIN計(jì)算出的高程值,單位為m;C為當(dāng)前地形圖設(shè)置的基本等高距,單位為m;Floor為返回小于或等于指定數(shù)值的最大整數(shù)。
計(jì)算高程區(qū)位值后,再進(jìn)行高程區(qū)間計(jì)算:
(2)
式中,Emin、Emax分別表示高程區(qū)間的最小值與最大值,單位為m。
得到某點(diǎn)的高程區(qū)間值后,如果點(diǎn)的實(shí)際高程值位于最小值與最大值之間,則認(rèn)為此高程值是合理的,即沒(méi)有高曲矛盾,反之則存在高曲矛盾。
高曲矛盾檢查的基本流程是將提取的高程信息進(jìn)行構(gòu)TIN處理,然后進(jìn)行高程值比較,以此得出是否存在高曲矛盾。高曲矛盾檢查工具主要功能為提取高程信息、構(gòu)TIN檢查、日志查看。
高程信息由3個(gè)數(shù)據(jù)組成,分別為高程點(diǎn)的點(diǎn)位平面坐標(biāo)和高程值、等高線的節(jié)點(diǎn)平面坐標(biāo)和高程值、檢查范圍的節(jié)點(diǎn)平面坐標(biāo)。其中,檢查范圍為可選數(shù)據(jù),若沒(méi)有設(shè)置檢查范圍,可通過(guò)高程點(diǎn)與等高線的平面范圍進(jìn)行凸包分析,從而得到檢查范圍。為提高檢查的可靠性,應(yīng)提前繪制檢查范圍線。
高程點(diǎn)在AutoCAD中是以屬性塊的方式表示,即帶屬性的塊參照(Block Reference),提取高程點(diǎn)的高程信息時(shí),首先通過(guò)Block Reference. Position屬性獲取點(diǎn)的平面坐標(biāo),然后從Block Reference. Attribute Collection屬性中讀取高程值。遍歷當(dāng)前圖中參與檢查的高程點(diǎn),將讀取到的每個(gè)高程信息以文件的方式進(jìn)行保存[4]。
等高線在AutoCAD中是以多段線的方式表示,高程值保存于標(biāo)高(Elevation)中。提取等高線的高程信息時(shí),需通過(guò)Polyline.GetPoint2dat方法依次讀取每個(gè)節(jié)點(diǎn)的平面坐標(biāo),然后再?gòu)腜olyline.Elevation屬性中讀取高程值。遍歷當(dāng)前圖中參與檢查的等高線,將讀取到的每個(gè)高程信息以文件的方式進(jìn)行保存。
檢查范圍在AutoCAD中也是以多段的方式表示,但不保存高程值。讀取檢查范圍的方式與讀取等高線的方式相同,限于篇幅,不再贅述。
高程信息提取后,可以調(diào)用ArcEngine提供的相關(guān)功能進(jìn)行構(gòu)TIN檢查。在ArcEngine中,構(gòu)建TIN文件使用的核心方法為三維分析工具集中的CreateTin_3d方法[5],運(yùn)行此方法需提供以下幾個(gè)參數(shù):輸出TIN的路徑、空間參考、參與構(gòu)TIN的要素及構(gòu)TIN算法。本文中使用的構(gòu)TIN算法為約束型Delaunay方法。參與TIN的參數(shù)準(zhǔn)備完成后,使用地理處理工具GeoProcessor執(zhí)行此方法即可,調(diào)用方式如圖1所示[6]。
構(gòu)TIN完成后,需對(duì)TIN數(shù)據(jù)進(jìn)行加載檢查,進(jìn)行加載前應(yīng)創(chuàng)建一個(gè)TIN對(duì)象,再使用ITinAdvanced接口的Init方法加載TIN數(shù)據(jù),實(shí)現(xiàn)方式如圖2所示[7]。
完成上述部分便可對(duì)每個(gè)高程點(diǎn)進(jìn)行檢查。計(jì)算高程點(diǎn)高程時(shí),使用ITinSurface接口的GetElevation方法。如果檢查出某個(gè)高程點(diǎn)存在高曲矛盾時(shí),將此高程點(diǎn)的平面坐標(biāo)、實(shí)際高程值、高程值區(qū)間寫入日志文件,主要代碼如圖3所示。
高程點(diǎn)與等高線存在高曲矛盾時(shí),檢查日志中已經(jīng)記錄了此高程點(diǎn)的平面坐標(biāo)及高程信息。要想查看檢查結(jié)果是否合理并對(duì)高程點(diǎn)的高程值進(jìn)行修正,必須通過(guò)點(diǎn)的平面坐標(biāo)進(jìn)行定位。在AutoCAD中將某個(gè)指定位置平移到可見視圖范圍內(nèi)這一操作,實(shí)質(zhì)是設(shè)置新的視圖。進(jìn)行視圖更新時(shí),首先應(yīng)創(chuàng)建一個(gè)ViewTableRecord并設(shè)置中心點(diǎn)(CenterPoint),該點(diǎn)為日志中讀取的值,然后使用AutoCAD中Editor類的SetCurrentView方法設(shè)置當(dāng)前視圖,主要代碼如圖4所示。
高曲矛盾檢查工具基于AutoCAD2010為開發(fā)框架,在Visual Studio 2013開發(fā)環(huán)境中,使用VisualBasic.NET作為開發(fā)語(yǔ)言,實(shí)現(xiàn)了以上全部功能[8]。
在Visual Studio 2013中創(chuàng)建一個(gè)新的類庫(kù)項(xiàng)目,依次引用acmgd.dll、acdbmgd.dll及ArcEngine的相關(guān)DLL后,修改acmgd.dll、acdbmgd.dll這兩個(gè)文件的本地的屬性為“否”。然后添加新的類文件并創(chuàng)建AutoCAD命令,主要內(nèi)容如圖5所示。
CommandMethodAttribute類是AutoCAD二次開發(fā)環(huán)境提供的將方法暴露為AutoCAD命令的標(biāo)識(shí)。
進(jìn)行高曲矛盾檢查時(shí),要經(jīng)過(guò)高程信息提取、構(gòu)TIN及檢查、日志查看這3個(gè)步驟。每個(gè)步驟作為一個(gè)獨(dú)立的模塊進(jìn)行開發(fā),最后通過(guò)命令接口函數(shù)ElevationCheck統(tǒng)一調(diào)用。
高程信息提取模塊的主要功能就是將參與檢查的高程點(diǎn)與等高線提取出來(lái),供ArcEngine構(gòu)TIN及檢查。為保證后續(xù)模塊能夠正常讀取提取出的高程信息,需要對(duì)高程信息定制其數(shù)據(jù)結(jié)構(gòu),結(jié)構(gòu)的主要內(nèi)容如圖6所示。
構(gòu)TIN及檢查模塊是基于ArcEngine進(jìn)行開發(fā)的,由于ArcEngine只有32位模式,在進(jìn)行此模塊開發(fā)時(shí),如果AutoCAD為32位,則直接可以引用相關(guān)DLL進(jìn)行開發(fā),如果AutoCAD為64位時(shí),則需借助于進(jìn)程間通訊的相關(guān)技術(shù)。檢查完成后,需將檢查日志輸出。為方便日志查看,模塊讀取日志信息及XML序列化保存,需定義一個(gè)日志數(shù)據(jù)結(jié)構(gòu),主要內(nèi)容如圖7所示。
日志查看模塊的主要功能就是讀取日志信息并進(jìn)行定位,以便于用戶進(jìn)行交互修改。讀取日志信息可以通過(guò)XML反序列化方式獲取,然后再通過(guò)AutoCAD中的Editor類設(shè)置當(dāng)前視圖方法進(jìn)行圖形定位。
各模塊的代碼編寫完成后,即可對(duì)整個(gè)項(xiàng)目進(jìn)行編譯。項(xiàng)目編譯后,會(huì)產(chǎn)生一個(gè)新的DLL文件,使用AutoCAD提供的netload命令可將此DLL文件加載到AutoCAD中,運(yùn)行ElevationCheck ,選擇參與檢查的對(duì)象后進(jìn)行高曲矛盾檢查,檢查日志會(huì)自動(dòng)加載到當(dāng)前圖面中。
圖8為某地形圖測(cè)量項(xiàng)目?jī)?nèi)業(yè)繪圖成果,測(cè)區(qū)范圍內(nèi)山地與丘陵較多,等高線與高程點(diǎn)較為密集,通過(guò)人工目視檢查高曲矛盾時(shí),效率較低,一幅地形圖需近一天時(shí)間才可檢查完畢,且易出現(xiàn)錯(cuò)查、漏查的現(xiàn)象,此類項(xiàng)目的高曲矛盾檢查給質(zhì)檢帶來(lái)很大困擾。
為解決此問(wèn)題,筆者利用本文所述算法基于Visual Studio軟件開發(fā)了高曲矛盾檢查工具。將圖8所示的地形圖利用自編高曲矛盾軟件進(jìn)行檢查,通過(guò)ElevationCheck命令進(jìn)行高曲矛盾檢查時(shí),約3 min的時(shí)間將檢查結(jié)果返回,檢查結(jié)果為圖9所示的日志查看工具。通過(guò)日志查看工具可以快速對(duì)有問(wèn)題的高程點(diǎn)進(jìn)行定位,此工具極大節(jié)約了質(zhì)量檢查人員的檢查時(shí)間,同時(shí)也提升了檢查的質(zhì)量。
本文通過(guò)對(duì)高曲矛盾檢查原理的分析,介紹了高曲矛盾檢查過(guò)程中每個(gè)步驟的實(shí)現(xiàn)方法,并以AutoCAD為開發(fā)框架,定制專用的高曲矛盾工具,降低了質(zhì)量檢查人員工作強(qiáng)度,同時(shí)也提升了產(chǎn)品的質(zhì)量。在對(duì)地形數(shù)據(jù)進(jìn)行構(gòu)TIN處理時(shí),直接調(diào)用ArcEngine中二次開發(fā)的開發(fā)接口,不但降低了高曲矛盾開發(fā)的難度,同時(shí)加快了整個(gè)工具開發(fā)的進(jìn)程。文中關(guān)于AutoCAD開發(fā)的設(shè)計(jì)思路及實(shí)現(xiàn)方法對(duì)開發(fā)其它基于AutoCAD的應(yīng)用也有一定的借鑒意義。