王光昇
(天津市測繪院,天津 300381)
我們國家在2007年發布了新版的基礎地理信息要素數據字典和國家基本比例尺地圖圖式,天津市測繪院在基礎地形圖測繪中為與國家標準保持一致,對原有的數據字典進行了修訂,于2011年發布了新版的天津市基礎地理信息要素數據字典,新字典對要素的分解表示更加細化,將原有的要素編碼由7位改為10位,相比舊的數據標準,部分要素的圖面表示方式有了很大的變化。新字典發布的同時,問題就出現了,盡管已經自主研發了基于新標準的數據采集編輯軟件,但現有的數據仍然全部是適用的舊標準,出現了有新標準而沒有新數據的現象,日常的測繪工作無法正常開展。為了解決這一矛盾,本文討論了如何利用程序的方法實現新舊數據標準下地形圖數據的自動轉換。
用程序處理數據時,采用什么樣的程序設計思路要依具體需求而定。處理特定要素時,可以將要素的信息寫在程序里,雖然缺少靈活性,但它僅限于滿足特定的功能;而當需要處理的要素種類很多時,就不應該把所有的要素信息都固定在程序代碼中,那樣的話,程序員就永遠和數據綁定在一起了,用戶每增加一個新要素,程序員就要調整一次程序。要避免這種情況出現,必須在寫程序前進行流程設計,制定出程序規則,在規則允許的范圍內指定哪些交給用戶去做,哪些由程序本身完成。本文討論的數據轉換流程圖,如圖1所示。

圖1 轉換流程
定制規則的目的是讓所有地物都能在轉換規則中找到匹配的項,所以規則要定義得適當。本文以交通類要素為例,定制的轉換規則如表1所示。

交通要素轉換規則 表1
表1中對交通(JT)類的地形要素制定了12項轉換規則,從規則列表中可以看出,大部分規則的不同之處就在于處理的屬性項有所區別。這實際上暴露了目前數據存儲中的一些問題:目前大部分用戶在存儲自定義信息時還是使用擴展數據(XData),這種信息存儲方式有數量的限制,不能超過128Kb,而且存儲的信息不能像一般的數據庫那樣可以依據字段名稱進行查詢。而這樣的不足可以通過使用對象擴展詞典來解決,如:“extDict.SetAt("searchKey",xRec);”,我們注意到,SetAt函數的第一個參數表示擴展記錄的搜索關鍵字,它就類似于數據庫表中的字段名稱,用它可以很方便地查詢用戶信息。
在確定了轉換的規則后,編寫轉換對照表的工作就可以完全交給用戶去做了。對照表結構如表2所示。

轉換對照表 表2
編寫轉換程序實際上就是對轉換規則的程序化,每個規則對應一個應用程序模塊。以表1中的規則2為例,介紹程序處理的流程:
第一步,用SQL語句在轉換對照表中讀取JT類且轉換規則為2的所有記錄,(SETQ A(DSQL_ASSOCQUERY DB“SELECT*FROM code WHERE CLASS=’%S’AND ID='%s’”“JT”“2”)),語句中以DSQL_為前綴的函數是用ObjectARX環境編寫的供LISP來調用的函數,程序中集成了開源的SQLite程序,所以它可以很方便地操作SQLite數據庫文件,我們的所有轉換對照文件都是用SQLite數據庫表來管理的;
第二步,循環處理數據集中的記錄,按照表2中的字段讀取每條記錄的新舊編碼、類型、轉換規則ID等信息;
第三步,以編碼作為過濾條件,通過LISP語句建立選擇集循環處理,處理的內容包括:圖層、編碼、顏色等通用屬性,其他屬性的處理依實體類型而不同,如線性實體需要修改線型、線寬、線型比例等;文字實體需要修改字體、字高、長寬比、旋轉角度等。
在新版天津市基礎地理信息要素數據字典中,對地物的關聯關系作出了明確的規定。建立關聯關系的目的是為了將組成一個實體的各個部分或將若干實體表示為一個整體而建立起數據關系,如圖2所示。

圖2 關聯關系
圖2表示“已加固的斜坡式一般堤”,坡頂線和坡底線以及中間的描述符都是獨立的CAD實體,要讓它們之間建立聯系,共同來表示一個地形要素。方法是通過給這一組對象都添加一個共同的標識碼,標識碼是隨機生成的,每個標識碼是不重復的。Windows系統的全局唯一標識(GUID)恰好可以滿足這一需求。
在新舊數據轉換過程中要將這些零散的對象準確地關聯在一起,必需建立一系列關聯規則,以此來約束程序按照指定的次序搜索相關要素,如表3所示。

關聯關系規則 表3
以圖2所示坡坎線為例,將關聯規則中的4A和4B兩項規則程序化,即需要作兩步處理:
首先由坡頂線創建“緩沖區1”(見圖3),然后通過緩沖區選擇坡頂線附近的符號線和符號塊,為了避免搜索到其他鄰近的坡坎的符號,需要在程序中進行邏輯控制,邏輯條件是:坡坎的符號線與坡頂線之間的最近距離是0,每一對符號塊與符號線在坡頂線的同側,且與符號線的距離恒定。搜索完成后,建立坡頂線與符號線和符號塊的關聯。
其次是由坡底線創建“緩沖區2”,再通過緩沖區選擇與它相交的符號線(見圖3中傳導線),坡底線的標識碼由符號線(傳導線)繼承過來,這樣坡頂線、符號線、符號塊以及坡底線就通過相同的標識碼聯系在一起了。

圖3 建立緩沖區搜索關聯
有些地形要素在新舊圖示中的表示方式有很大的區別,這些要素無法實現全自動轉換,需要在程序處理后再進行人工編輯。而有些要素盡管可以用程序自動處理,但為了避免編輯錯誤,處理后也需要人工確認,為此須將每個程序編輯過的要素添加到自定義的實體定位列表,便于用戶核查,如圖4所示。

圖4 后期處理與實體定位
在完成圖形的轉換處理后,還要對轉換后的圖形進行質量控制,我們依據新版的數據字典編寫了檢查程序(見圖5),檢查程序從要素屬性、空間關系、拓撲關系等多方面對地形圖進行檢查,極大地提高了數據檢查的效率,同時也最大限度地保證了新舊標準地形數據的轉換質量。

圖5 數據檢查
筆者在研究地形圖數據新舊標準轉換的過程中,將SQLite數據庫技術引入到轉換規則設計及對照表信息管理中,用戶可以根據自己的需要匹配要素規則、修改轉換配置文件,這種設計方式增強了程序功能的延展性,使得數據轉換的流程控制更加靈活。
目前該轉換程序已經廣泛應用于天津市測繪院2011年的1∶2 000地形圖修測項目中。
[1]余承飛,方勇.AutoCAD 2000二次開發技術(ObjectARX)[M].北京:人民郵電出版社,1999
[2]佟里欣.AutoCAD 2000探秘–AutoLISP入門[M].北京:海洋出版社,2000
[3]張長勛.AutoCAD VisualLISP程序開發技術[M].北京:國防工業出版社,2005
[4]Jay A.Kreibich.Using SQLite[M].O’Reilly Media,2010
[5]GB/T 20257.1-2007,1 ∶500 1 ∶1 000 1 ∶2 000地形圖圖式[S].
[6]天津市基礎地理信息要素數據字典第一部分:1∶500、1 ∶2000[S].