王海英,劉容
(南寧市勘察測繪地理信息院,廣西 南寧 530001)
按下電燈開關、接通一個電話,這些平常的生活細節都和一個視野之外的系統密切相關——遍布城市地下空間的各類管線[1]。城市地下管線是城市基礎設施中的重要組成部分,是現代城市高效率、高質量運作的基本保證[2]。隨著城市建設的不斷發展,地下管線的種類和數量越來越復雜,相應的地下管線數據處理也是一項煩瑣復雜的工作。為了減輕勞動強度,提高工作效率,測繪單位往往投入了不少資金購買各種地下管線數據處理軟件或系統,這些軟件確實能在一定程度上提高作業單位的生產效率。但這些軟件一般都是統一定制,實行統一的功能銷售模式,并非按需定制開發,無法真正解決測繪單位在作業過程中的具體問題和各種新出現的問題,這將在很大程度上影響生產進度和成果質量[3]。
基于這種需求,為了能真正提高生產效率,滿足管線作業全過程需要,測繪單位必須提升自身的管線處理軟件開發實力,進行各項管線數據處理所需的具體功能的設計和開發,形成一系列管線數據處理實用工具,滿足地下管線項目的使用需求。
管線探測外業數據采集以作業草圖方式為主,結合外業測量坐標文件形成管線探測成果表即點成果表和線成果表,點成果表中記錄了管線點(附屬物明顯點或隱蔽探測點)的位置坐標、權屬、現狀、特征、附屬物、井深及井蓋的相關屬性等信息;線成果表(管道、線纜)中記錄了管線線的起終點號、埋深、管徑斷面、材質、孔數、根數、電壓、壓力等等信息。
對于外業探測調查獲取的這些管線點表和線表,如何將這些點、線成果表快速轉換為具有拓撲結構和屬性結構的圖庫一體化的空間數據庫即“管線成圖”;如何保證成圖后的管線數據的拓撲關系正確性、關聯成果一致性及管線屬性的正確性、協調性和完整性以及如何將最終的管線成果圖按用戶的要求輸出不同格式的成果數據等各種需求都需借助管線軟件平臺二次開發環境定制相應的數據導入輸出、信息查詢、數據批處理、合法性檢查、批量糾錯等具體的管線功能才能得以順利實現。
經需求調研與分析,選用EPS 2008為基礎平臺,在該平臺下實現從數據導入——數據編輯處理——數據檢查——成果輸出的全過程,針對不同數據處理階段需求的功能,工具軟件的總體功能框架如圖1所示:

圖1 工具軟件功能框架
軟件平臺:Windows 7專業版操作系統,清華山維EPS 2008基礎平臺。
硬件平臺:PC機(Dell Optiplex 980,Intel(R)Core(TM)i7 CPU 2.80GHz,16.0 GB的內存)。
本文提出的管線數據處理實用工具開發所采用的EPS的腳本語言遵守JScript或VBScript語言標準,基于EPS平臺及開放的二次開發環境,用戶可以通過該腳本語言進行相關二次開發,結合已有的管線數據處理平臺可以實現對矢量數據的整理、格式轉換、統一賦值等數據處理。
SSProcess是系統缺省定義的對象,是與EPS平臺交互的主要入口對象,SSProcess對象的功能包括選擇集操作、圖形編輯操作、數據轉換和系統設置等[4]。
對于外業探查形成管線探測成果表即點成果表和線成果表,點表中的點號可作為唯一的標識碼,點表和線表中的特征碼可作為管點類型和管線線類型的參照字段,通過點表和線表中的特征碼對照關系調入EPS平臺進行管線數據成圖,大致分四步實現:
首先通過自定義函數GetExcelFields()獲取Excel文件各個工作表中的數據的表頭及表名;再新建數組,循環遍歷所有工作表,自定義函數GetxlsRecord()讀取Excel文件中的所有數據并存入到數組中;最好通過SSProcess對象CreateNewObjd自定義函數AddPoints()和AddLines()創建管線點、管線線對象并導入各個相應的屬性項。
主要代碼如下(以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 '開始調入數據
GetxlsRecord nFileCount,strSheet(i),nFields_hz(i) '讀取excel數據
If k<12 Then’
AddPoints code(i),aryKJSJ,nFields_hz(i) '導入管點數據
Else
AddLines code(i),aryKJSJ,nFields_hz(i) '導入管線數據
End If
k=k+1
Next
erase aryKJSJ
SSProcess.RefreshView
這種數據表的調入方式簡單直觀,對于一些計算機文化程度不高的外業作業人員,他們缺乏掌握新事物新技術的興趣和動力,仍習慣于將外業采集成果以Excel電子表格的方式進行表達,因此這種簡單方便的Excel成果表調入方式可以很好解決這個問題。
管線數據要素查詢主要是通過對管線點、線要素的某種特性或屬性進行篩選過濾,再對過濾所得的要素進行坐標獲取與定位。大致分三步實現:
首先通過SSProcess對象的AddInputParameter方法設置查詢要素的某種特性或屬性內容;再通過SSProcess.ClearSelectCondition和SSProcess.SelectFilter方法獲取查詢對象選擇集,循環遍歷說有選擇集要素,通過設置好的特性或屬性內容對選擇集中的各要素進行篩選過濾,符合設置的特性或屬性內容的要素即是需要查詢的要素;最后通過SSProcess.GetSelGeoPoint方法獲取過濾所得的要素的坐標信息進行定位。
主要代碼如下(以ID號查詢舉例說明):
dim mark_find
SSProcess.ClearInputParameter
SSProcess.AddInputParameter "管線ID","",0,"",""
result =SSProcess.ShowInputParameterDlg ("輸入ID號")
if result =1 then
SSProcess.UpdateScriptDlgParameter 1 '更新對話框上參數到內存
ID = SSProcess.GetInputParameter ("管線ID")
mark_find =1
end if
if mark_find =1 then
SSProcess.ClearSelection
SSProcess.SetSelectCondition "SSObj_ID","==","ID" '過濾
SSProcess.SelectFilter '通過選擇條件的設置可以設置任意的過濾條件
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
通過這種不受限制的自定義屬性項、屬性內容的過濾查詢方式,作業人員可以輕松地對各種目標對象進行查詢定位。
管線數據成圖后,還需要進行各種數據整理和編輯處理,主要包括屬性整理和拓撲邏輯整理兩方面。
屬性類的編輯處理:主要以管線點、線要素的某項屬性項為基礎,通過腳本語言函數和方法將通過設定的算法公式計算出來的結果賦值給與這些要素相關聯的要素屬性項;通過這些自動化編輯處理方式,對于某些具有共性的管線點、線屬性項,可以根據與之相關的要素的某些屬性通過加工處理后進行屬性賦值,提高作業效率。
邏輯類的編輯處理:在管線點、線屬性編輯過程中,往往會造成原本相互密切關聯的點線要素丟失邏輯相關性造成孤立點或孤立線現象的出現,為了避免這種現象的出現,就需隨時針對編輯過程中所做的點、線處理進行點線關聯性修復更新。
主要代碼如下:(以通過管點高程和管線埋深計算管高舉例說明)
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
管線數據經過編輯處理后,在成果輸出之前需對管線數據的完整性、規范性及邏輯關系和拓撲關系方面進行嚴格的質量檢查即合法性檢查,這里的合法性檢查大體上包括管線圖形的拓撲邏輯檢查和要素屬性檢查。檢查的方式主要是根據需要檢查的內容和目的,制定各種合法性參數,將不滿足合法性參數的管線要素篩選過濾出來并進行定位,方便作業人員進行整改修正。
在本項目中,依據項目技術設計要求及管線方面的規范標準,定制了包括邏輯關系、拓撲關系正確性;點號命名規范性;屬性內容完整性及屬性內容規范性四方面在內的共計20多項圖形、屬性檢查項。具體的檢查項有:
(1)拓撲關系、邏輯關系類:孤點、孤線檢查;點名重復檢查;分支特征檢查;變徑檢查;排水無出口檢查;污水流向雨水檢查;0長度線檢查;空間交叉檢查;接邊檢查等。
(2)點號命名規范類:組號錯用檢查,管線類型碼錯誤檢查等。
(3)必填屬性為空檢查。
(4)屬性內容規范類:排水粗流向細檢查;排水由低向高檢查;燃氣管壓力值不一致檢查;管線材質檢查;隱蔽點兩端屬性不一致檢查;管線長度超限檢查;高程異常檢查等。
(5)線纜類電壓、根數、孔數邏輯關系:總孔數大于已用孔檢查;根數為0時,電壓不為空、已用孔不為0檢查等。
上述各檢查項中的合法性參數應依據項目技術設計書和項目所在地的實際管網現狀情況而定。
經過上述定制的各種檢查項逐項檢查后,管線成果在拓撲、邏輯方面和屬性內容方面無限接近0錯誤,得到了專家組的一致好評。
根據項目的技術設計和要求,項目成果要求既能輸出Access 數據庫的文字記錄格式,又要能輸出具備屬性存儲的AutoCAD dwg格式及GIS空間數據格式。
為了能將滿足客戶對管線成果的不同的表現格式,本項目中采用SSProcess對象的輸出函數ExportData()函數,在執行該函數前,通過SSProcess.SetDataXParameter函數進行一系列轉換參數的設置,包括數據輸出格式;數據輸出范圍;格式版本;地物顏色;地物符號樣式模板;注記樣式模板等。在設置好所要求的參數后即可執行數據輸出。
其主要代碼如下:(以輸出帶屬性的.dwg格式舉例說明)
DataBoundMode = SSProcess.ReadEpsIni ("設置輸出模式","SCFS" ,"全部輸出" )
SSProcess.AddInputParameter "輸出范圍",DataBoundMode,0,"當前圖幅,全部,選擇集輸出,",""
res=SSProcess.ShowInputParameterDlg("設置輸出模式" )
DataBoundStyle=SSProcess.GetInputParameter("輸出范圍" )
If DataBoundStyle = "當前圖幅" Then
DataBoundMode = "2"
ElseIf DataBoundStyle = "全部輸出" Then
DataBoundMode = "0"
ElseIf DataBoundStyle = "選擇集輸出" Then
DataBoundMode = "1"
End If
SSProcess.WriteEpsIni "設置輸出模式","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" '//按地物設定顏色輸出
SSProcess.SetDataXParameter "LayerUseStatus","0" '//按編碼表設定層名輸出
SSProcess.SetDataXParameter "SymbolExplodeMode","0"'//符號打散方式
SSProcess.SetDataXParameter "LineExportMode","2" '//輸出AutoCAD數據時,多義線輸出
AcadDwtFileName = SSProcess.GetSysPathName (0) & "AcadLinNngx.dwt"
SSProcess.SetDataXParameter "AcadDwtFileName",AcadDwtFileName
SSProcess.ExportData
msgbox "輸出完成!"
SSProcess.SetDataXParameter函數易學易用、靈活多變,通過的輸出格式參數的設置可以定義輸出各種格式的GIS空間數據。如:ArcGIS SDE、DWG、DXF、E00、Coverage、Shp、ArcGIS Mdb等。
筆者所在單位基于本設計框架和開發思路,進行了管線數據處理實用工具軟件開發,也在南寧市地下管線全面普查項目的實際生產過程中得到廣泛應用。尤其是在廣西地區各城市地下管線普查建庫、第一次全區性地下空間管線數據普查項目中得到很好的應用,本套管線數據處理軟件切實地提高了管線作業工作效率,確保了管線普查成果的質量和任務進度,并作為交流軟件,在區內其他單位和地下管線普查和信息化建設技術群中進行了共享,反響良好。
[1] 周京春,侯至群,尚劍紅. 昆明市地下管線信息化建設歷程及思考[J]. 測繪通報,2013(S):P44~48.
[2] 徐嬋. 面向矢量數據綜合處理的實用工具設計與開發[J]. 測繪與空間地理信息,2015(8):104~107.
[3] 徐中華,劉萬華,余成江. 清華山維一體化軟件EPS腳本語言的應用[J]. 城市勘測,2007(6):P88~90.
[4] 王利華. 地下管線數據采集及建庫研究[D]. 昆明:昆明理工大學,2015.