谢年
(重庆市勘测院,重庆 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开发了地形图建筑物属性提取插件工具,通过实际案例测试与分析,能快速地将地形图建筑物的注记内容提取到建筑物的属性字段中,准确率和自动化程度高,能有效地节约生产成本,提高生产效率,在实际的项目应用中取得了比较好的效果。
同时也发现,该方法对地形图的质量要求较高,受注记内容的规范性,不可能完全正确,针对特殊情况,还需要一定程度上的人工干预,接下来将进一步研究算法和正则表达式规则,提高成功率。