謝年
(重慶市勘測院,重慶 400000)
在地形圖中,圖形是地物的幾何抽象表達,同時為了便于讀圖判圖,文字注記同樣是不可缺少的,是地物語義級別的表達[1]。以建筑物為例,建筑物輪廓幾何形狀表達了建筑物的幾何位置、空間形態等屬性,建筑物的結構注記、樓層注記、高程注記等則表達了建筑物的結構、樓層和各種高程等屬性。隨著地理信息技術的快速發展和應用場景的不同需求,通常需要對地形圖進行GIS建庫處理,注記內容成為GIS屬性數據的重要來源和依據。如何準確快速地將建筑物注記轉換到屬性值是建庫工作中一項重要的任務,如果全部由人工來判讀并附加屬性,會產生巨大的工作量。因此本文提出了一種利用正則表達式規則提取建筑物屬性的方法,通過基于ArcGIS Addin開發插件工具嵌入到ArcMap中,能高效快速地進行地形圖建筑物的屬性提取工作。
正則表達式是一種功能強大的文本處理語言,具有強大的模式表達功能,通過使用一系列特殊字符構建匹配模式(pattern),具有匹配、過濾、提取等基本功能,其靈活性和邏輯性極強,能用極其簡單的方式實現對字符串的復雜操作,在目前主流的開發語言(C++、C#、VB、Java、Python等)均支持正則表達[2],本文正是基于這些特點,采用正則表達式識別、提取建筑物屬性。
一個正則表達式是由普通字符和元字符組成的文字模式。元字符表示特殊的含義(均為半角字符),包括“”“^”“$”“*”“+”“?”“.”“(”“)”“{”“}”“[”“]”“|”。元字符前加“”轉義為符號自身,普通字符是除元字符外的所有字符[3]。
構造正則表達式就是將元字符與普通字符通過各種方式組合在一起,得到需要的匹配或捕獲。字符的組合存在先后法則,元字符的優先級從高到低如表1所示。

元字符的優先級順序 表1
根據地形圖相關制圖規范,建筑物注記一般以建筑物輪廓中心點為定位基準,以單點注記的方式依次將不同的注記對象從上而下依次放置,以 1∶500地形圖為例,建筑物圖形與注記的制圖表達如圖1所示。

圖1 1∶500地形圖建筑物制圖表達樣例
通過對數據進行分析不難發現,一是注記中心點的位置一般位于建筑物空間形狀的內部;二是不同類型的注記表達方式會遵循一定標準,比如建筑物的結構與樓層是組合表達,地上樓層與地下樓層之間用“/”進行分隔,標高的注記前部有標高類型說明等。因此可以通過注記與建筑物的空間關系來確定注記轉屬性的歸屬問題,然后再建立一套可以對注記內容進行識別和提取的規則,就能自動將建筑物注記轉換到相應屬性值中。
注記的預處理主要處理兩種問題。第一種,利用關鍵字查詢的方法,剔除與需要提取的建筑物屬性無關的注記,如“壩”“空”“平臺”等。第二種,合并分散的注記。根據地形圖成圖規范,一個完整的建筑物屬性表達應作為一個注記對象存在。通過實際數據分析,發現存在部分建筑物注記不規范,沒有將完整的屬性內容作為一個獨立的注記對象,而是分為多個組成,如建筑物結構與樓層、標高類型與高程值等分別作為一個獨立的對象表示等,需要對此部分注記進行合并處理。
通過建筑物與處理后的注記均進行空間運算,建立每個建筑物對象與落在建筑物內的注記對象之間的關聯關系。原則上位于建筑物內的注記均可認為是此建筑物的屬性內容。
對屬于建筑物的注記內容分別進行識別。先要建立識別規則,通過正則表達式的匹配方法來識別注記內容,如果識別返回結果為真,則可以標記為該規則對應的類別。以 1∶500地形圖為例,定義的部分識別規則如表2所示。

部分識別規則 表2
部分不同注記內容的匹配結果如表3所示。

部分注記匹配結果 表3
建立提取規則,根據識別結果匹配對應的提取規則,通過正則表達式提取方法將屬性信息提取出來,然后寫入建筑物對應的屬性字段中。同樣以 1∶500地形圖為例,部分屬性信息的提取規則和結果如表4所示。

部分屬性提取規則和結果 表4
為驗證本文提出的方法的效率和可用性,本文結合重慶市某區域地理框架要素數據建庫項目進行了生產性試驗。在C#平臺下,通過基于ArcGIS Addin開發插件工具嵌入到ArcMap中,實現建筑物屬性的自動識別和提取。
ArcGIS Addin是ArcGIS 10開始引入的新桌面定制開發技術,可以在ArcMap中更加方便地進行功能的自定義和擴展[4]。其支持的功能類型廣泛、文件結構簡單、安裝部署方便,能快速地進行開發投入應用。Addin支持的對象類型主要有交互類和容器類兩種[5],具體如圖2所示,通過這些對象,可以定制開發需要的插件。

圖2 Addin支持的功能類型
在開發過程中,根據開發的語言不同,可將Addin開發方式分為兩種[6]:基于Python腳本語言的Addin技術和面向.Net(包含C#、VB、C++等)及Java高級編程語言的Addin技術。
同Python Addin技術相比,面向.Net及Java高級編程語言的開發方式可支持更多的擴展元素,它是基于AO組件的擴展開發,可實現細粒度地控制ArcGIS的各種操作[7],因此本文選取的是基于C#的Addin開發模式。
(1)通過IfeatureCursor接口來實現對象的遍歷,主要代碼如下:
IfeatureCursor JzwFeaturecursor;
IFeature pfeature;
IQueryFilter pfilter;
pfilter=null;
JzwFeaturecursor=建筑物圖層.Search(pfilter,false);
pfeature=JzwFeaturecursor.NextFeature();
while(pfeature !=null)
{
pfeature=JzwFeaturecursor.NextFeature();
}
(2)空間運算可以通過IspatialFilter接口來實現,主要代碼如下:
ISpatialFilter pSpatialFilter=new SpatialFilterClass();
pSpatialFilter.SpatialRel=esriSpatialRelEnum. esriSpatialRelContains;
pSpatialFilter.Geometry=(IGeometry)建筑物對象.Shape;
IFeatureCursor ZjFeatureCursor;
ZjFeatureCursor=注記圖層.Search(pSpatialFilter,false);
(3)注記內容匹配的主要方法如下:
Bool Ragex. IsMatch(注記內容,識別規則);
(4)注記內容提取的主要方法如下:
Regex. Match(注記內容,提取規則);
(5)屬性字段寫入的主要代碼如下:
建筑物對象.set_Value(建筑物對象.Fields.FindField(字段),屬性值);
通過該方法對1 400 km2范圍內的110萬個建筑物對象進行了自動化的屬性提取,耗時約3個小時,數據成果經抽檢,準確率高達98%,只有少量的特殊情況需要人工干預處理,該項目自動提取的屬性字段如表5所示。

自動提取的屬性字段表結構 表5

地下樓層Int頂層Int架空層Int夾層IntH頂高程DoubleH地高程DoubleH0高程DoubleH制高程DoubleH女兒墻高程DoubleH吊高程Double
提取完成后建筑物數據的屬性結果如圖3所示。

圖3 建筑物屬性提取結果
由于注記內容具有多樣化和不可預見性,定義的規則只是根據大多數情況來制定的,因此要對提取的過程進行異常捕捉監控,對出現異常的情況進行分析,進一步完善相應的規則,從而提高屬性提取的準確度。
本文利用正則表達式規則的優勢,將其用于建筑物屬性的識別與提取,并在C#環境下基于ArcGIS Addin開發了地形圖建筑物屬性提取插件工具,通過實際案例測試與分析,能快速地將地形圖建筑物的注記內容提取到建筑物的屬性字段中,準確率和自動化程度高,能有效地節約生產成本,提高生產效率,在實際的項目應用中取得了比較好的效果。
同時也發現,該方法對地形圖的質量要求較高,受注記內容的規范性,不可能完全正確,針對特殊情況,還需要一定程度上的人工干預,接下來將進一步研究算法和正則表達式規則,提高成功率。