王海英,刘容
(南宁市勘察测绘地理信息院,广西 南宁 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.