王光昇
(天津市測繪院,天津 300381)
我們國家在2007年發(fā)布了新版的基礎(chǔ)地理信息要素數(shù)據(jù)字典和國家基本比例尺地圖圖式,天津市測繪院在基礎(chǔ)地形圖測繪中為與國家標(biāo)準(zhǔn)保持一致,對原有的數(shù)據(jù)字典進行了修訂,于2011年發(fā)布了新版的天津市基礎(chǔ)地理信息要素數(shù)據(jù)字典,新字典對要素的分解表示更加細化,將原有的要素編碼由7位改為10位,相比舊的數(shù)據(jù)標(biāo)準(zhǔn),部分要素的圖面表示方式有了很大的變化。新字典發(fā)布的同時,問題就出現(xiàn)了,盡管已經(jīng)自主研發(fā)了基于新標(biāo)準(zhǔn)的數(shù)據(jù)采集編輯軟件,但現(xiàn)有的數(shù)據(jù)仍然全部是適用的舊標(biāo)準(zhǔn),出現(xiàn)了有新標(biāo)準(zhǔn)而沒有新數(shù)據(jù)的現(xiàn)象,日常的測繪工作無法正常開展。為了解決這一矛盾,本文討論了如何利用程序的方法實現(xiàn)新舊數(shù)據(jù)標(biāo)準(zhǔn)下地形圖數(shù)據(jù)的自動轉(zhuǎn)換。
用程序處理數(shù)據(jù)時,采用什么樣的程序設(shè)計思路要依具體需求而定。處理特定要素時,可以將要素的信息寫在程序里,雖然缺少靈活性,但它僅限于滿足特定的功能;而當(dāng)需要處理的要素種類很多時,就不應(yīng)該把所有的要素信息都固定在程序代碼中,那樣的話,程序員就永遠和數(shù)據(jù)綁定在一起了,用戶每增加一個新要素,程序員就要調(diào)整一次程序。要避免這種情況出現(xiàn),必須在寫程序前進行流程設(shè)計,制定出程序規(guī)則,在規(guī)則允許的范圍內(nèi)指定哪些交給用戶去做,哪些由程序本身完成。本文討論的數(shù)據(jù)轉(zhuǎn)換流程圖,如圖1所示。
圖1 轉(zhuǎn)換流程
定制規(guī)則的目的是讓所有地物都能在轉(zhuǎn)換規(guī)則中找到匹配的項,所以規(guī)則要定義得適當(dāng)。本文以交通類要素為例,定制的轉(zhuǎn)換規(guī)則如表1所示。
交通要素轉(zhuǎn)換規(guī)則 表1
表1中對交通(JT)類的地形要素制定了12項轉(zhuǎn)換規(guī)則,從規(guī)則列表中可以看出,大部分規(guī)則的不同之處就在于處理的屬性項有所區(qū)別。這實際上暴露了目前數(shù)據(jù)存儲中的一些問題:目前大部分用戶在存儲自定義信息時還是使用擴展數(shù)據(jù)(XData),這種信息存儲方式有數(shù)量的限制,不能超過128Kb,而且存儲的信息不能像一般的數(shù)據(jù)庫那樣可以依據(jù)字段名稱進行查詢。而這樣的不足可以通過使用對象擴展詞典來解決,如:“extDict.SetAt("searchKey",xRec);”,我們注意到,SetAt函數(shù)的第一個參數(shù)表示擴展記錄的搜索關(guān)鍵字,它就類似于數(shù)據(jù)庫表中的字段名稱,用它可以很方便地查詢用戶信息。
在確定了轉(zhuǎn)換的規(guī)則后,編寫轉(zhuǎn)換對照表的工作就可以完全交給用戶去做了。對照表結(jié)構(gòu)如表2所示。
轉(zhuǎn)換對照表 表2
編寫轉(zhuǎn)換程序?qū)嶋H上就是對轉(zhuǎn)換規(guī)則的程序化,每個規(guī)則對應(yīng)一個應(yīng)用程序模塊。以表1中的規(guī)則2為例,介紹程序處理的流程:
第一步,用SQL語句在轉(zhuǎn)換對照表中讀取JT類且轉(zhuǎn)換規(guī)則為2的所有記錄,(SETQ A(DSQL_ASSOCQUERY DB“SELECT*FROM code WHERE CLASS=’%S’AND ID='%s’”“JT”“2”)),語句中以DSQL_為前綴的函數(shù)是用ObjectARX環(huán)境編寫的供LISP來調(diào)用的函數(shù),程序中集成了開源的SQLite程序,所以它可以很方便地操作SQLite數(shù)據(jù)庫文件,我們的所有轉(zhuǎn)換對照文件都是用SQLite數(shù)據(jù)庫表來管理的;
第二步,循環(huán)處理數(shù)據(jù)集中的記錄,按照表2中的字段讀取每條記錄的新舊編碼、類型、轉(zhuǎn)換規(guī)則ID等信息;
第三步,以編碼作為過濾條件,通過LISP語句建立選擇集循環(huán)處理,處理的內(nèi)容包括:圖層、編碼、顏色等通用屬性,其他屬性的處理依實體類型而不同,如線性實體需要修改線型、線寬、線型比例等;文字實體需要修改字體、字高、長寬比、旋轉(zhuǎn)角度等。
在新版天津市基礎(chǔ)地理信息要素數(shù)據(jù)字典中,對地物的關(guān)聯(lián)關(guān)系作出了明確的規(guī)定。建立關(guān)聯(lián)關(guān)系的目的是為了將組成一個實體的各個部分或?qū)⑷舾蓪嶓w表示為一個整體而建立起數(shù)據(jù)關(guān)系,如圖2所示。
圖2 關(guān)聯(lián)關(guān)系
圖2表示“已加固的斜坡式一般堤”,坡頂線和坡底線以及中間的描述符都是獨立的CAD實體,要讓它們之間建立聯(lián)系,共同來表示一個地形要素。方法是通過給這一組對象都添加一個共同的標(biāo)識碼,標(biāo)識碼是隨機生成的,每個標(biāo)識碼是不重復(fù)的。Windows系統(tǒng)的全局唯一標(biāo)識(GUID)恰好可以滿足這一需求。
在新舊數(shù)據(jù)轉(zhuǎn)換過程中要將這些零散的對象準(zhǔn)確地關(guān)聯(lián)在一起,必需建立一系列關(guān)聯(lián)規(guī)則,以此來約束程序按照指定的次序搜索相關(guān)要素,如表3所示。
關(guān)聯(lián)關(guān)系規(guī)則 表3
以圖2所示坡坎線為例,將關(guān)聯(lián)規(guī)則中的4A和4B兩項規(guī)則程序化,即需要作兩步處理:
首先由坡頂線創(chuàng)建“緩沖區(qū)1”(見圖3),然后通過緩沖區(qū)選擇坡頂線附近的符號線和符號塊,為了避免搜索到其他鄰近的坡坎的符號,需要在程序中進行邏輯控制,邏輯條件是:坡坎的符號線與坡頂線之間的最近距離是0,每一對符號塊與符號線在坡頂線的同側(cè),且與符號線的距離恒定。搜索完成后,建立坡頂線與符號線和符號塊的關(guān)聯(lián)。
其次是由坡底線創(chuàng)建“緩沖區(qū)2”,再通過緩沖區(qū)選擇與它相交的符號線(見圖3中傳導(dǎo)線),坡底線的標(biāo)識碼由符號線(傳導(dǎo)線)繼承過來,這樣坡頂線、符號線、符號塊以及坡底線就通過相同的標(biāo)識碼聯(lián)系在一起了。
圖3 建立緩沖區(qū)搜索關(guān)聯(lián)
有些地形要素在新舊圖示中的表示方式有很大的區(qū)別,這些要素?zé)o法實現(xiàn)全自動轉(zhuǎn)換,需要在程序處理后再進行人工編輯。而有些要素盡管可以用程序自動處理,但為了避免編輯錯誤,處理后也需要人工確認,為此須將每個程序編輯過的要素添加到自定義的實體定位列表,便于用戶核查,如圖4所示。
圖4 后期處理與實體定位
在完成圖形的轉(zhuǎn)換處理后,還要對轉(zhuǎn)換后的圖形進行質(zhì)量控制,我們依據(jù)新版的數(shù)據(jù)字典編寫了檢查程序(見圖5),檢查程序從要素屬性、空間關(guān)系、拓撲關(guān)系等多方面對地形圖進行檢查,極大地提高了數(shù)據(jù)檢查的效率,同時也最大限度地保證了新舊標(biāo)準(zhǔn)地形數(shù)據(jù)的轉(zhuǎn)換質(zhì)量。
圖5 數(shù)據(jù)檢查
筆者在研究地形圖數(shù)據(jù)新舊標(biāo)準(zhǔn)轉(zhuǎn)換的過程中,將SQLite數(shù)據(jù)庫技術(shù)引入到轉(zhuǎn)換規(guī)則設(shè)計及對照表信息管理中,用戶可以根據(jù)自己的需要匹配要素規(guī)則、修改轉(zhuǎn)換配置文件,這種設(shè)計方式增強了程序功能的延展性,使得數(shù)據(jù)轉(zhuǎn)換的流程控制更加靈活。
目前該轉(zhuǎn)換程序已經(jīng)廣泛應(yīng)用于天津市測繪院2011年的1∶2 000地形圖修測項目中。
[1]余承飛,方勇.AutoCAD 2000二次開發(fā)技術(shù)(ObjectARX)[M].北京:人民郵電出版社,1999
[2]佟里欣.AutoCAD 2000探秘–AutoLISP入門[M].北京:海洋出版社,2000
[3]張長勛.AutoCAD VisualLISP程序開發(fā)技術(shù)[M].北京:國防工業(yè)出版社,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]天津市基礎(chǔ)地理信息要素數(shù)據(jù)字典第一部分:1∶500、1 ∶2000[S].