王海英,劉容
(南寧市勘察測繪地理信息院,廣西 南寧 530001)
按下電燈開關(guān)、接通一個電話,這些平常的生活細(xì)節(jié)都和一個視野之外的系統(tǒng)密切相關(guān)——遍布城市地下空間的各類管線[1]。城市地下管線是城市基礎(chǔ)設(shè)施中的重要組成部分,是現(xiàn)代城市高效率、高質(zhì)量運作的基本保證[2]。隨著城市建設(shè)的不斷發(fā)展,地下管線的種類和數(shù)量越來越復(fù)雜,相應(yīng)的地下管線數(shù)據(jù)處理也是一項煩瑣復(fù)雜的工作。為了減輕勞動強(qiáng)度,提高工作效率,測繪單位往往投入了不少資金購買各種地下管線數(shù)據(jù)處理軟件或系統(tǒng),這些軟件確實能在一定程度上提高作業(yè)單位的生產(chǎn)效率。但這些軟件一般都是統(tǒng)一定制,實行統(tǒng)一的功能銷售模式,并非按需定制開發(fā),無法真正解決測繪單位在作業(yè)過程中的具體問題和各種新出現(xiàn)的問題,這將在很大程度上影響生產(chǎn)進(jìn)度和成果質(zhì)量[3]。
基于這種需求,為了能真正提高生產(chǎn)效率,滿足管線作業(yè)全過程需要,測繪單位必須提升自身的管線處理軟件開發(fā)實力,進(jìn)行各項管線數(shù)據(jù)處理所需的具體功能的設(shè)計和開發(fā),形成一系列管線數(shù)據(jù)處理實用工具,滿足地下管線項目的使用需求。
管線探測外業(yè)數(shù)據(jù)采集以作業(yè)草圖方式為主,結(jié)合外業(yè)測量坐標(biāo)文件形成管線探測成果表即點成果表和線成果表,點成果表中記錄了管線點(附屬物明顯點或隱蔽探測點)的位置坐標(biāo)、權(quán)屬、現(xiàn)狀、特征、附屬物、井深及井蓋的相關(guān)屬性等信息;線成果表(管道、線纜)中記錄了管線線的起終點號、埋深、管徑斷面、材質(zhì)、孔數(shù)、根數(shù)、電壓、壓力等等信息。
對于外業(yè)探測調(diào)查獲取的這些管線點表和線表,如何將這些點、線成果表快速轉(zhuǎn)換為具有拓?fù)浣Y(jié)構(gòu)和屬性結(jié)構(gòu)的圖庫一體化的空間數(shù)據(jù)庫即“管線成圖”;如何保證成圖后的管線數(shù)據(jù)的拓?fù)潢P(guān)系正確性、關(guān)聯(lián)成果一致性及管線屬性的正確性、協(xié)調(diào)性和完整性以及如何將最終的管線成果圖按用戶的要求輸出不同格式的成果數(shù)據(jù)等各種需求都需借助管線軟件平臺二次開發(fā)環(huán)境定制相應(yīng)的數(shù)據(jù)導(dǎo)入輸出、信息查詢、數(shù)據(jù)批處理、合法性檢查、批量糾錯等具體的管線功能才能得以順利實現(xiàn)。
經(jīng)需求調(diào)研與分析,選用EPS 2008為基礎(chǔ)平臺,在該平臺下實現(xiàn)從數(shù)據(jù)導(dǎo)入——數(shù)據(jù)編輯處理——數(shù)據(jù)檢查——成果輸出的全過程,針對不同數(shù)據(jù)處理階段需求的功能,工具軟件的總體功能框架如圖1所示:
圖1 工具軟件功能框架
軟件平臺:Windows 7專業(yè)版操作系統(tǒng),清華山維EPS 2008基礎(chǔ)平臺。
硬件平臺:PC機(jī)(Dell Optiplex 980,Intel(R)Core(TM)i7 CPU 2.80GHz,16.0 GB的內(nèi)存)。
本文提出的管線數(shù)據(jù)處理實用工具開發(fā)所采用的EPS的腳本語言遵守JScript或VBScript語言標(biāo)準(zhǔn),基于EPS平臺及開放的二次開發(fā)環(huán)境,用戶可以通過該腳本語言進(jìn)行相關(guān)二次開發(fā),結(jié)合已有的管線數(shù)據(jù)處理平臺可以實現(xiàn)對矢量數(shù)據(jù)的整理、格式轉(zhuǎn)換、統(tǒng)一賦值等數(shù)據(jù)處理。
SSProcess是系統(tǒng)缺省定義的對象,是與EPS平臺交互的主要入口對象,SSProcess對象的功能包括選擇集操作、圖形編輯操作、數(shù)據(jù)轉(zhuǎn)換和系統(tǒng)設(shè)置等[4]。
對于外業(yè)探查形成管線探測成果表即點成果表和線成果表,點表中的點號可作為唯一的標(biāo)識碼,點表和線表中的特征碼可作為管點類型和管線線類型的參照字段,通過點表和線表中的特征碼對照關(guān)系調(diào)入EPS平臺進(jìn)行管線數(shù)據(jù)成圖,大致分四步實現(xiàn):
首先通過自定義函數(shù)GetExcelFields()獲取Excel文件各個工作表中的數(shù)據(jù)的表頭及表名;再新建數(shù)組,循環(huán)遍歷所有工作表,自定義函數(shù)GetxlsRecord()讀取Excel文件中的所有數(shù)據(jù)并存入到數(shù)組中;最好通過SSProcess對象CreateNewObjd自定義函數(shù)AddPoints()和AddLines()創(chuàng)建管線點、管線線對象并導(dǎo)入各個相應(yīng)的屬性項。
主要代碼如下(以excel成果表舉例說明):
DimarFile(20),nRecordCount,nxCount,aryKJSJ(),field_Array(100),strFields(20),strSheet(50),code(50),SheetName(),nFields_hz(),nFields_py()
Sub OnClick()
aa = SSFunc.ExcelSelectFile(arFile,nFileCount) '讀EXCLE表格
if aa = 0 then exit Sub
GetExcelFields arFile(0),ExcelName,SheetName,nSheetCount,nFields_hz,nFields_py
codes=""
strSheets = ""
SSFunc.ScanString strSheets,",",strSheet,sheetCount
SSFunc.ScanString codes,",",code,codeCount
For i = 0 to 14 'excel '開始調(diào)入數(shù)據(jù)
GetxlsRecord nFileCount,strSheet(i),nFields_hz(i) '讀取excel數(shù)據(jù)
If k<12 Then’
AddPoints code(i),aryKJSJ,nFields_hz(i) '導(dǎo)入管點數(shù)據(jù)
Else
AddLines code(i),aryKJSJ,nFields_hz(i) '導(dǎo)入管線數(shù)據(jù)
End If
k=k+1
Next
erase aryKJSJ
SSProcess.RefreshView
這種數(shù)據(jù)表的調(diào)入方式簡單直觀,對于一些計算機(jī)文化程度不高的外業(yè)作業(yè)人員,他們?nèi)狈φ莆招率挛镄录夹g(shù)的興趣和動力,仍習(xí)慣于將外業(yè)采集成果以Excel電子表格的方式進(jìn)行表達(dá),因此這種簡單方便的Excel成果表調(diào)入方式可以很好解決這個問題。
管線數(shù)據(jù)要素查詢主要是通過對管線點、線要素的某種特性或?qū)傩赃M(jìn)行篩選過濾,再對過濾所得的要素進(jìn)行坐標(biāo)獲取與定位。大致分三步實現(xiàn):
首先通過SSProcess對象的AddInputParameter方法設(shè)置查詢要素的某種特性或?qū)傩詢?nèi)容;再通過SSProcess.ClearSelectCondition和SSProcess.SelectFilter方法獲取查詢對象選擇集,循環(huán)遍歷說有選擇集要素,通過設(shè)置好的特性或?qū)傩詢?nèi)容對選擇集中的各要素進(jìn)行篩選過濾,符合設(shè)置的特性或?qū)傩詢?nèi)容的要素即是需要查詢的要素;最后通過SSProcess.GetSelGeoPoint方法獲取過濾所得的要素的坐標(biāo)信息進(jìn)行定位。
主要代碼如下(以ID號查詢舉例說明):
dim mark_find
SSProcess.ClearInputParameter
SSProcess.AddInputParameter "管線ID","",0,"",""
result =SSProcess.ShowInputParameterDlg ("輸入ID號")
if result =1 then
SSProcess.UpdateScriptDlgParameter 1 '更新對話框上參數(shù)到內(nèi)存
ID = SSProcess.GetInputParameter ("管線ID")
mark_find =1
end if
if mark_find =1 then
SSProcess.ClearSelection
SSProcess.SetSelectCondition "SSObj_ID","==","ID" '過濾
SSProcess.SelectFilter '通過選擇條件的設(shè)置可以設(shè)置任意的過濾條件
geocount = SSProcess.GetSelGeoCount
For i=0 To geocount-1
pid = SSProcess.GetSelGeoValue(i,"SSObj_ID")
SSProcess.GetSelGeoPoint i,x,y
SSProcess.AddCheckRecord "","","",,x,y,,0,pid,""
next
end if
通過這種不受限制的自定義屬性項、屬性內(nèi)容的過濾查詢方式,作業(yè)人員可以輕松地對各種目標(biāo)對象進(jìn)行查詢定位。
管線數(shù)據(jù)成圖后,還需要進(jìn)行各種數(shù)據(jù)整理和編輯處理,主要包括屬性整理和拓?fù)溥壿嬚韮煞矫妗?/p>
屬性類的編輯處理:主要以管線點、線要素的某項屬性項為基礎(chǔ),通過腳本語言函數(shù)和方法將通過設(shè)定的算法公式計算出來的結(jié)果賦值給與這些要素相關(guān)聯(lián)的要素屬性項;通過這些自動化編輯處理方式,對于某些具有共性的管線點、線屬性項,可以根據(jù)與之相關(guān)的要素的某些屬性通過加工處理后進(jìn)行屬性賦值,提高作業(yè)效率。
邏輯類的編輯處理:在管線點、線屬性編輯過程中,往往會造成原本相互密切關(guān)聯(lián)的點線要素丟失邏輯相關(guān)性造成孤立點或孤立線現(xiàn)象的出現(xiàn),為了避免這種現(xiàn)象的出現(xiàn),就需隨時針對編輯過程中所做的點、線處理進(jìn)行點線關(guān)聯(lián)性修復(fù)更新。
主要代碼如下:(以通過管點高程和管線埋深計算管高舉例說明)
SSProcess.ClearSelection
SSProcess.SetSelectCondition "SSObj_Type","=","LINE"
SSProcess.SelectFilter
sl = SSProcess.GetSelGeoCount
dim strs(100)
For i = 0 To sl - 1
geoID = SSProcess.GetSelGeoValue(i,"SSObj_ID")
pz0 = SSProcess.GetSelGeoValue(i,"[起點埋深]")
pz1 = SSProcess.GetSelGeoValue(i,"[終點埋深]")
SSProcess.GetSelGeoPoint i,0,x0,y0,z,ptype,name
SSProcess.GetSelGeoPoint i,PNT-1,x1,y1,z,ptype,name
ids=SSProcess.SearchNearObjIDs(x0,y0,0.00001,0,"",0)
If ids <> "" Then
SSFunc.ScanString ids,",",strs,count
For j = 0 To count - 1
SSProcess.GetObjectPoint strs(j),0,x,y,z,ptype,name
if isnumeric(pntz0)=true then ms = z - pz0
ms = formatnumber(ms,2,-1)
SSProcess.SetObjectAttr geoID,"[起點高程]",ms
next
end if
ids=SSProcess.SearchNearObjIDs(x1,y1,0.00001,0,"",0)
If ids <> "" Then
SSFunc.ScanString ids,",",strs,count
For j = 0 To count - 1
SSProcess.GetObjectPoint strs(j),0,x,y,z,ptype,name
if isnumeric(pntz1)=true then ms = z - pz1
ms = formatnumber(ms,2,-1)
SSProcess.SetObjectAttr geoID,"[終點高程]",ms
next
end if
next
管線數(shù)據(jù)經(jīng)過編輯處理后,在成果輸出之前需對管線數(shù)據(jù)的完整性、規(guī)范性及邏輯關(guān)系和拓?fù)潢P(guān)系方面進(jìn)行嚴(yán)格的質(zhì)量檢查即合法性檢查,這里的合法性檢查大體上包括管線圖形的拓?fù)溥壿嫏z查和要素屬性檢查。檢查的方式主要是根據(jù)需要檢查的內(nèi)容和目的,制定各種合法性參數(shù),將不滿足合法性參數(shù)的管線要素篩選過濾出來并進(jìn)行定位,方便作業(yè)人員進(jìn)行整改修正。
在本項目中,依據(jù)項目技術(shù)設(shè)計要求及管線方面的規(guī)范標(biāo)準(zhǔn),定制了包括邏輯關(guān)系、拓?fù)潢P(guān)系正確性;點號命名規(guī)范性;屬性內(nèi)容完整性及屬性內(nèi)容規(guī)范性四方面在內(nèi)的共計20多項圖形、屬性檢查項。具體的檢查項有:
(1)拓?fù)潢P(guān)系、邏輯關(guān)系類:孤點、孤線檢查;點名重復(fù)檢查;分支特征檢查;變徑檢查;排水無出口檢查;污水流向雨水檢查;0長度線檢查;空間交叉檢查;接邊檢查等。
(2)點號命名規(guī)范類:組號錯用檢查,管線類型碼錯誤檢查等。
(3)必填屬性為空檢查。
(4)屬性內(nèi)容規(guī)范類:排水粗流向細(xì)檢查;排水由低向高檢查;燃?xì)夤軌毫χ挡灰恢聶z查;管線材質(zhì)檢查;隱蔽點兩端屬性不一致檢查;管線長度超限檢查;高程異常檢查等。
(5)線纜類電壓、根數(shù)、孔數(shù)邏輯關(guān)系:總孔數(shù)大于已用孔檢查;根數(shù)為0時,電壓不為空、已用孔不為0檢查等。
上述各檢查項中的合法性參數(shù)應(yīng)依據(jù)項目技術(shù)設(shè)計書和項目所在地的實際管網(wǎng)現(xiàn)狀情況而定。
經(jīng)過上述定制的各種檢查項逐項檢查后,管線成果在拓?fù)?、邏輯方面和屬性?nèi)容方面無限接近0錯誤,得到了專家組的一致好評。
根據(jù)項目的技術(shù)設(shè)計和要求,項目成果要求既能輸出Access 數(shù)據(jù)庫的文字記錄格式,又要能輸出具備屬性存儲的AutoCAD dwg格式及GIS空間數(shù)據(jù)格式。
為了能將滿足客戶對管線成果的不同的表現(xiàn)格式,本項目中采用SSProcess對象的輸出函數(shù)ExportData()函數(shù),在執(zhí)行該函數(shù)前,通過SSProcess.SetDataXParameter函數(shù)進(jìn)行一系列轉(zhuǎn)換參數(shù)的設(shè)置,包括數(shù)據(jù)輸出格式;數(shù)據(jù)輸出范圍;格式版本;地物顏色;地物符號樣式模板;注記樣式模板等。在設(shè)置好所要求的參數(shù)后即可執(zhí)行數(shù)據(jù)輸出。
其主要代碼如下:(以輸出帶屬性的.dwg格式舉例說明)
DataBoundMode = SSProcess.ReadEpsIni ("設(shè)置輸出模式","SCFS" ,"全部輸出" )
SSProcess.AddInputParameter "輸出范圍",DataBoundMode,0,"當(dāng)前圖幅,全部,選擇集輸出,",""
res=SSProcess.ShowInputParameterDlg("設(shè)置輸出模式" )
DataBoundStyle=SSProcess.GetInputParameter("輸出范圍" )
If DataBoundStyle = "當(dāng)前圖幅" Then
DataBoundMode = "2"
ElseIf DataBoundStyle = "全部輸出" Then
DataBoundMode = "0"
ElseIf DataBoundStyle = "選擇集輸出" Then
DataBoundMode = "1"
End If
SSProcess.WriteEpsIni "設(shè)置輸出模式","SCFS" ,DataBoundStyle
fileName= SSProcess.SelectFileName(0,"指定輸出文件名",0,"AutoCAD Files (*.dwg)|*.dwg")
SSProcess.SetDataXParameter "DataType","1"
SSProcess.SetDataXParameter "Version","2004"
SSProcess.SetDataXParameter "SymbolScriptTBName","SymbolScriptTB_CAD"
SSProcess.SetDataXParameter "FeatureCodeTBName","FeatureCodeTB_CAD"
SSProcess.SetDataXParameter "NoteTemplateTBName","NoteTemplateTB_CAD"
SSProcess.SetDataXParameter "DataBoundMode",DataBoundMode
SSProcess.SetDataXParameter "ExportPathName",filename
SSProcess.SetDataXParameter "ThicknessExportMode","3"
SSProcess.SetDataXParameter "ExportLayerCount","0"
SSProcess.SetDataXParameter "ExplodeObjMakeGroup","1"
SSProcess.SetDataXParameter "ColorUseStatus","2" '//按地物設(shè)定顏色輸出
SSProcess.SetDataXParameter "LayerUseStatus","0" '//按編碼表設(shè)定層名輸出
SSProcess.SetDataXParameter "SymbolExplodeMode","0"'//符號打散方式
SSProcess.SetDataXParameter "LineExportMode","2" '//輸出AutoCAD數(shù)據(jù)時,多義線輸出
AcadDwtFileName = SSProcess.GetSysPathName (0) & "AcadLinNngx.dwt"
SSProcess.SetDataXParameter "AcadDwtFileName",AcadDwtFileName
SSProcess.ExportData
msgbox "輸出完成!"
SSProcess.SetDataXParameter函數(shù)易學(xué)易用、靈活多變,通過的輸出格式參數(shù)的設(shè)置可以定義輸出各種格式的GIS空間數(shù)據(jù)。如:ArcGIS SDE、DWG、DXF、E00、Coverage、Shp、ArcGIS Mdb等。
筆者所在單位基于本設(shè)計框架和開發(fā)思路,進(jìn)行了管線數(shù)據(jù)處理實用工具軟件開發(fā),也在南寧市地下管線全面普查項目的實際生產(chǎn)過程中得到廣泛應(yīng)用。尤其是在廣西地區(qū)各城市地下管線普查建庫、第一次全區(qū)性地下空間管線數(shù)據(jù)普查項目中得到很好的應(yīng)用,本套管線數(shù)據(jù)處理軟件切實地提高了管線作業(yè)工作效率,確保了管線普查成果的質(zhì)量和任務(wù)進(jìn)度,并作為交流軟件,在區(qū)內(nèi)其他單位和地下管線普查和信息化建設(shè)技術(shù)群中進(jìn)行了共享,反響良好。
[1] 周京春,侯至群,尚劍紅. 昆明市地下管線信息化建設(shè)歷程及思考[J]. 測繪通報,2013(S):P44~48.
[2] 徐嬋. 面向矢量數(shù)據(jù)綜合處理的實用工具設(shè)計與開發(fā)[J]. 測繪與空間地理信息,2015(8):104~107.
[3] 徐中華,劉萬華,余成江. 清華山維一體化軟件EPS腳本語言的應(yīng)用[J]. 城市勘測,2007(6):P88~90.
[4] 王利華. 地下管線數(shù)據(jù)采集及建庫研究[D]. 昆明:昆明理工大學(xué),2015.