王鵬
(蘭州市勘察測繪研究院,蘭州730030)
我國測繪正朝著信息化測繪方向發(fā)展,城市測繪將從以傳統(tǒng)地形圖生產為主轉向以地理信息綜合服務為主。EPS軟件是由清華山維公司開發(fā)的、具有自主知識產權的面向測繪地理信息生產的軟件系統(tǒng)。該軟件從地理信息系統(tǒng)應用的角度構建數(shù)據(jù)模型,綜合CAD技術與GIS技術,以數(shù)據(jù)庫為核心,將圖形和屬性關聯(lián)為一體[1],從根本上實現(xiàn)了DLG制圖入庫一體化生產,做到了GIS應用與制圖的便捷統(tǒng)一。同時,EPS平臺支持基于腳本語言的二次開發(fā),用于用戶定制開發(fā)平臺不支持的功能以及處理重復性工作。EPS軟件對提高DLG制圖入庫的生產效率,保證成果質量起到很好的促進作用。
對各測繪單位而言,DLG制圖數(shù)據(jù)與入庫數(shù)據(jù)的側重點不同,制圖數(shù)據(jù)強調地理要素的符號化表達,需要根據(jù)規(guī)范正確、合理、清晰易讀地展示地理信息,不關注屬性信息;而入庫數(shù)據(jù)不僅要求具有一般地形圖的幾何要素內容,還要求要素具有豐富的屬性信息以及要素間的拓撲關系正確。如何同時滿足DLG制圖、入庫的要求并正確、快速、自動化地提取屬性,是本文進行二次開發(fā)的主要出發(fā)點。
EPS軟件提供了2種二次開發(fā)技術,分別是基于基礎庫二次開發(fā)和腳本類二次開發(fā),前者主要使用C++作為開發(fā)語言,后者主要以VB Script和Java Script作為開發(fā)語言,但常用VB Script[2]。EPS VB Script語言是EPS為支持數(shù)據(jù)處理和功能擴展而面向用戶提供的一門腳本語言,其在EPS腳本編輯器中運行,為解釋性執(zhí)行[3]。與AutoCAD的ActiveX技術類似,用戶能夠以VB Script或Java Script語言標準為基礎,在EPS平臺內部以編程的方式來訪問EPS提供的對象和函數(shù)[4],可根據(jù)系統(tǒng)集成的命令語言規(guī)則、函數(shù)等方便地實現(xiàn)諸如坐標轉換、數(shù)據(jù)入庫、圖形處理、數(shù)據(jù)檢查等諸多應用。
EPS沒有多層次的對象模型體系,這一點與AutoCAD的ActiveX技術不同,它僅提供了SSProcess這個系統(tǒng)缺省定義的對象。SSProcess是與EPS平臺交互的主要入口對象,使用系統(tǒng)提供的類方法時需要加上此類名[5]。利用SSProcess可調用EPS平臺暴露給用戶的所有功能函數(shù),包括圖形編輯、數(shù)據(jù)整理、選擇集操作、數(shù)據(jù)檢查、數(shù)據(jù)轉換、坐標轉換等。EPS提供的是面向過程的腳本技術,與AutoCAD的ActiveX開發(fā)技術相比,其更加簡潔高效,適用于缺乏面向對象編程知識的廣大測繪工作者,使得他們能將更多的精力集中于業(yè)務功能實現(xiàn)上。此外,EPS VB Script提供了外部函數(shù)調用功能,能夠實現(xiàn)函數(shù)級別的代碼重用,利于構建具有良好邏輯層次的應用模塊。
DLG制圖入庫一體化生產,要解決以下5個關鍵問題:(1)其他格式數(shù)據(jù)的無損導入;(2)滿足制圖數(shù)據(jù)符合圖式規(guī)定的同時,也需滿足入庫數(shù)據(jù)符合項目要求;(3)圖形注記與入庫屬性值的聯(lián)動生產;(4)根據(jù)項目需求建立一套完備的檢查方案;(5)無損導出為項目要求的圖形數(shù)據(jù)和入庫數(shù)據(jù)。借助EPS模板定制和VB Script開發(fā)技術,可較完美地解決上述問題。
EPS軟件平臺直接編輯的數(shù)據(jù)為其自有格式(*.edb),EPS雖提供了與其他格式數(shù)據(jù)的交互轉換功能,但僅是幾何圖形上的簡單轉換,不能實現(xiàn)要素編碼、擴展屬性等的無損輸入和輸出,需借助EPS軟件提供的VB Script技術配合模板定制來實現(xiàn)數(shù)據(jù)的無損轉換。虞秀花[6]等對EPS平臺的模板定制技術做了較具體的說明,本文不再闡述。
EPS軟件平臺提供了包括空間邏輯檢查、規(guī)范編碼檢查、擴展屬性檢查等檢查模型,用戶可根據(jù)工程實際需要定制通用的檢查項。但針對工程的特殊要求,需通過VB Script腳本編程進行數(shù)據(jù)檢查或數(shù)據(jù)修復。
DLG制圖入庫一體化生產中,可通過EPS平臺的符號化技術和VB Script開發(fā)實現(xiàn)圖形注記與屬性值的關聯(lián),從而避免圖面注記與要素屬性不一致的情況發(fā)生,從而提高作業(yè)效率和數(shù)據(jù)質量。
此外,通過VB Script開發(fā)可實現(xiàn)自動化批量處理,簡化操作,達到提高生產效率的目的。
本文以DWG數(shù)據(jù)導入、GDB數(shù)據(jù)導出、房屋屬性賦值及檢查為例,闡述EPS VB Script開發(fā)的具體實現(xiàn)。
程序通過逐行讀取text文檔,該文檔第一列為DWG圖層名,第二列為EPS編碼,分別針對點、線、面、注記進行DWG圖層到EPS編碼/注記分類的轉換,從而實現(xiàn)DWG數(shù)據(jù)的無損導入。程序的主要代碼如下:
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"
執(zhí)行選擇過濾
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數(shù)據(jù)是目前主流GIS平臺支持的一種空間地理信息數(shù)據(jù)庫,程序通過設定數(shù)據(jù)轉換參數(shù)并結合EPS模板實現(xiàn)GDB數(shù)據(jù)的無損導出。程序執(zhí)行前需首先利用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
設置數(shù)據(jù)輸出格式。其中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",""
設置數(shù)據(jù)輸出范圍方式。0(所有數(shù)據(jù))、1(選擇集數(shù)據(jù))、2(當前圖幅)、3(緩沖區(qū))、4(指定編碼閉合地物)、5(指定 ID 閉合地物)、6(所有圖幅)
SSProcess.SetDataXParameter"DataBoundMode","0"
設置符號打散方式。0(自動打散)、1(根據(jù)編碼表設定打散)、2(全部不打散)
SSProcess.SetDataXParameter"SymbolExplodeMode","1"設置數(shù)據(jù)輸出層名使用狀態(tài)。0(按編碼表設定層名輸出)、1(按地物設定層名輸出)
SSProcess.SetDataXParameter"LayerUseStatus","0"
設置內嵌符號圖層輸出方式。0(按符號描述設定輸出)、1(與主地物同層輸出)
SSProcess.SetDataXParameter"ExplodeObjLayerStatus","0"設置線寬使用狀態(tài)。0(按編碼表設定線寬輸出)、1(按地物設定線寬輸出)
SSProcess.SetDataXParameter"LineWidthUseStatus","0"
設置輸出數(shù)據(jù)時,是否強制輸出系統(tǒng)字段,0(不輸出)、1(輸出)
SSProcess.SetDataXParameter"AddSystemFieldMode","0"
設置PDB數(shù)據(jù)轉換中的注記輸出模式,0(直接轉換為ArcGIS 的 Annotation)、1(所有注記轉換為線方式)、2(所有注記轉換為點方式)、3(注記分別按點和線方式轉換)
SSProcess.SetDataXParameter "EXCHANGE_PDB_Export NoteMode","0"
設置輸出PDB數(shù)據(jù)時Shape輸出方式(腳本未指定Shape字段時有效),0(2D)、1(3D)
SSProcess.SetDataXParameter "EXCHANGE_PDB_Export ShapeMode","1"
startIndex=0
......
End Sub
程序用于為房屋賦【層數(shù)】【結構】屬性值且同時檢查房屋內注記是否合理。程序的主要代碼如下:
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&"房屋面[層數(shù)]無值",x,y,z,objtype,geoID,""
......
SSProcess.ShowCheckOutput
End Sub
本文基于EPS 2008平臺的模板定制和VB Script開發(fā)技術解決了DLG制圖、入庫一體化生產的關鍵問題,數(shù)據(jù)處理簡捷高效,自動化水平較高,對提高DLG生產效率并保證成果質量具有重要意義。本技術已成功應用于蘭州市數(shù)字線化圖(DLG)的生產和地理信息建庫項目,驗證了本文提供方法的有效性。