王鵬
(蘭州市勘察測繪研究院,蘭州730030)
我國測繪正朝著信息化測繪方向發展,城市測繪將從以傳統地形圖生產為主轉向以地理信息綜合服務為主。EPS軟件是由清華山維公司開發的、具有自主知識產權的面向測繪地理信息生產的軟件系統。該軟件從地理信息系統應用的角度構建數據模型,綜合CAD技術與GIS技術,以數據庫為核心,將圖形和屬性關聯為一體[1],從根本上實現了DLG制圖入庫一體化生產,做到了GIS應用與制圖的便捷統一。同時,EPS平臺支持基于腳本語言的二次開發,用于用戶定制開發平臺不支持的功能以及處理重復性工作。EPS軟件對提高DLG制圖入庫的生產效率,保證成果質量起到很好的促進作用。
對各測繪單位而言,DLG制圖數據與入庫數據的側重點不同,制圖數據強調地理要素的符號化表達,需要根據規范正確、合理、清晰易讀地展示地理信息,不關注屬性信息;而入庫數據不僅要求具有一般地形圖的幾何要素內容,還要求要素具有豐富的屬性信息以及要素間的拓撲關系正確。如何同時滿足DLG制圖、入庫的要求并正確、快速、自動化地提取屬性,是本文進行二次開發的主要出發點。
EPS軟件提供了2種二次開發技術,分別是基于基礎庫二次開發和腳本類二次開發,前者主要使用C++作為開發語言,后者主要以VB Script和Java Script作為開發語言,但常用VB Script[2]。EPS VB Script語言是EPS為支持數據處理和功能擴展而面向用戶提供的一門腳本語言,其在EPS腳本編輯器中運行,為解釋性執行[3]。與AutoCAD的ActiveX技術類似,用戶能夠以VB Script或Java Script語言標準為基礎,在EPS平臺內部以編程的方式來訪問EPS提供的對象和函數[4],可根據系統集成的命令語言規則、函數等方便地實現諸如坐標轉換、數據入庫、圖形處理、數據檢查等諸多應用。
EPS沒有多層次的對象模型體系,這一點與AutoCAD的ActiveX技術不同,它僅提供了SSProcess這個系統缺省定義的對象。SSProcess是與EPS平臺交互的主要入口對象,使用系統提供的類方法時需要加上此類名[5]。利用SSProcess可調用EPS平臺暴露給用戶的所有功能函數,包括圖形編輯、數據整理、選擇集操作、數據檢查、數據轉換、坐標轉換等。EPS提供的是面向過程的腳本技術,與AutoCAD的ActiveX開發技術相比,其更加簡潔高效,適用于缺乏面向對象編程知識的廣大測繪工作者,使得他們能將更多的精力集中于業務功能實現上。此外,EPS VB Script提供了外部函數調用功能,能夠實現函數級別的代碼重用,利于構建具有良好邏輯層次的應用模塊。
DLG制圖入庫一體化生產,要解決以下5個關鍵問題:(1)其他格式數據的無損導入;(2)滿足制圖數據符合圖式規定的同時,也需滿足入庫數據符合項目要求;(3)圖形注記與入庫屬性值的聯動生產;(4)根據項目需求建立一套完備的檢查方案;(5)無損導出為項目要求的圖形數據和入庫數據。借助EPS模板定制和VB Script開發技術,可較完美地解決上述問題。
EPS軟件平臺直接編輯的數據為其自有格式(*.edb),EPS雖提供了與其他格式數據的交互轉換功能,但僅是幾何圖形上的簡單轉換,不能實現要素編碼、擴展屬性等的無損輸入和輸出,需借助EPS軟件提供的VB Script技術配合模板定制來實現數據的無損轉換。虞秀花[6]等對EPS平臺的模板定制技術做了較具體的說明,本文不再闡述。
EPS軟件平臺提供了包括空間邏輯檢查、規范編碼檢查、擴展屬性檢查等檢查模型,用戶可根據工程實際需要定制通用的檢查項。但針對工程的特殊要求,需通過VB Script腳本編程進行數據檢查或數據修復。
DLG制圖入庫一體化生產中,可通過EPS平臺的符號化技術和VB Script開發實現圖形注記與屬性值的關聯,從而避免圖面注記與要素屬性不一致的情況發生,從而提高作業效率和數據質量。
此外,通過VB Script開發可實現自動化批量處理,簡化操作,達到提高生產效率的目的。
本文以DWG數據導入、GDB數據導出、房屋屬性賦值及檢查為例,闡述EPS VB Script開發的具體實現。
程序通過逐行讀取text文檔,該文檔第一列為DWG圖層名,第二列為EPS編碼,分別針對點、線、面、注記進行DWG圖層到EPS編碼/注記分類的轉換,從而實現DWG數據的無損導入。程序的主要代碼如下:
Sub OnClick()
Dim arrFileLines()
Dim objFSO
Dim objFile
Dim i as integer
Dim l as integer
Dim a()as string
i=0
SSProcess.PushUndoMark
清空選擇集
SSProcess.ClearSelection
清空選擇條件
SSProcess.ClearSelectCondition
設置選擇條件為只選擇點對象
SSProcess.SetSelectCondition"SSObj_Type","=","POINT"
執行選擇過濾
SSProcess.SelectFilter
去除點名
SSProcess.ChangeSelectionObjAttr"SSObj_name",""
讀取text文檔,文檔第一列為DWG圖層名,第二列為EPS編碼
Set objFSO=CreateObject("Scripting.FileSystemObject")
Set objFile=objFSO.OpenTextFile("d:hrb c-bm.txt",1)
逐行讀取text文檔,分別針對點、線、面、注記進行圖層到編碼/注記分類的轉換。
For l=LBound(arrFileLines)To UBound(arrFileLines)
SSProcess.ClearSelection
SSProcess.ClearSelectCondition
SSProcess.SetSelectCondition "SSObj_Type","==","POINT"
SSProcess.SetSelectCondition"SSObj_LayerName","==",trim(a(0))
SSProcess.SelectFilter
SSProcess.PushUndoMark
SSProcess.ChangeSelectionObjAttr"SSObj_Code",trim(a(1))
Next
......
End Sub
GDB數據是目前主流GIS平臺支持的一種空間地理信息數據庫,程序通過設定數據轉換參數并結合EPS模板實現GDB數據的無損導出。程序執行前需首先利用EPS模板技術定制要素導出的編碼、幾何類型、要素類名稱等信息。程序的主要代碼如下:
Sub OnClick()
Dim fso,f1,f2,s
Set fso=CreateObject("Scripting.FileSystemObject")
Set f1=fso.GetFile(pathname)
fileName=Replace(edbFileName,".edb","")&".gdb"
SSProcess.ClearDataXParameter
設置數據輸出格式。其中22對應的是ArcGIS Mdb格式。
SSProcess.SetDataXParameter"DataType","22"
設置輸出使用編碼對照表名稱。
SSProcess.SetDataXParameter "FeatureCodeTBName","FeatureCodeTB_MDB"
設置輸出使用符號描述表名稱。
SSProcess.SetDataXParameter "SymbolScriptTBName","SymbolScriptTB_MDB"
設置輸出使用注記分類表名稱。
SSProcess.SetDataXParameter "NoteTemplateTBName","NoteTemplateTB_MDB"
SSProcess.SetDataXParameter"ExportPathName",""
設置數據輸出范圍方式。0(所有數據)、1(選擇集數據)、2(當前圖幅)、3(緩沖區)、4(指定編碼閉合地物)、5(指定 ID 閉合地物)、6(所有圖幅)
SSProcess.SetDataXParameter"DataBoundMode","0"
設置符號打散方式。0(自動打散)、1(根據編碼表設定打散)、2(全部不打散)
SSProcess.SetDataXParameter"SymbolExplodeMode","1"設置數據輸出層名使用狀態。0(按編碼表設定層名輸出)、1(按地物設定層名輸出)
SSProcess.SetDataXParameter"LayerUseStatus","0"
設置內嵌符號圖層輸出方式。0(按符號描述設定輸出)、1(與主地物同層輸出)
SSProcess.SetDataXParameter"ExplodeObjLayerStatus","0"設置線寬使用狀態。0(按編碼表設定線寬輸出)、1(按地物設定線寬輸出)
SSProcess.SetDataXParameter"LineWidthUseStatus","0"
設置輸出數據時,是否強制輸出系統字段,0(不輸出)、1(輸出)
SSProcess.SetDataXParameter"AddSystemFieldMode","0"
設置PDB數據轉換中的注記輸出模式,0(直接轉換為ArcGIS 的 Annotation)、1(所有注記轉換為線方式)、2(所有注記轉換為點方式)、3(注記分別按點和線方式轉換)
SSProcess.SetDataXParameter "EXCHANGE_PDB_Export NoteMode","0"
設置輸出PDB數據時Shape輸出方式(腳本未指定Shape字段時有效),0(2D)、1(3D)
SSProcess.SetDataXParameter "EXCHANGE_PDB_Export ShapeMode","1"
startIndex=0
......
End Sub
程序用于為房屋賦【層數】【結構】屬性值且同時檢查房屋內注記是否合理。程序的主要代碼如下:
Sub OnClick()
SSProcess.PushUndoMark
SSProcess.ClearSelection
SSProcess.ClearSelectCondition
SSProcess.SetSelectCondition "SSObj_Code", "=", "3103013,3103014,3108003"
SSProcess.SelectFilter
geoCount=SSProcess.GetSelGeoCount()
Dim arID1(100),idCount1
Dim fwCS(10),idCountCS
For i=0 To geoCount-1
polygonID=SSProcess.GetSelGeoValue(i,"SSObj_ID")
ids = SSProcess.SearchInnerObjIDs (polygonID,3,"3990022",0)
If ids=""Then
geoID=SSProcess.GetSelGeoValue(i,"SSObj_ID")
SSProcess.GetSelGeoPoint i,0,x,y,z,ptype,name
SSProcess.AddCheckRecord"檢查","房屋面","自定義腳本檢查類->房屋面注記檢查","ID為:"&geoID&"房屋面[層數]無值",x,y,z,objtype,geoID,""
......
SSProcess.ShowCheckOutput
End Sub
本文基于EPS 2008平臺的模板定制和VB Script開發技術解決了DLG制圖、入庫一體化生產的關鍵問題,數據處理簡捷高效,自動化水平較高,對提高DLG生產效率并保證成果質量具有重要意義。本技術已成功應用于蘭州市數字線化圖(DLG)的生產和地理信息建庫項目,驗證了本文提供方法的有效性。