房屋入库属性的批量修改
2013-08-06任航科齐宇
任航科,齐宇
(福建省国土测绘院,福建 厦门 362000)
1 引言
在福建省某市的近40 km2的1∶500数字地形图入库项目中,其中一个很重要且工作量很大的工作就是要对居民地进行入库前的属性修改。要保证地形图的房子线条的属性和房屋层次注记的属性相吻合,并且执行CASS软件的编组命令后,房屋线条和其对应层次注记等都在同一个编组内。这个项目房屋的所占的比例达80%以上,由于前期并未考虑到入库的要求,新测的图都是没有考虑属性这一块,作业过程中直接采取复制线条或者层次注记等,老图由于是以前其他软件内业成图的,所以房屋的内部属性和入库标准更不符合了。笔者以CASS软件为基础,AutoLISP工具为手段,编写程序对其进行批量处理,实现了对房屋属性进行修改并最终达到了入库要求。
2 程序开发的基础和设计
2.1 居民地线条,房屋结构层次注记对应的内部属性组
由于本项目重点在于房子,主要是对房屋进行最后分属性入库,所以对房子的属性要求很严格,要求房屋的线条属性要和其对应的房屋注记相对应。房屋编码采用CASS软件的内部编码。部分编码的具体对应要求如表1所示。
房屋内部属性编码对应关系 表1
续 表1
由于房子线条的内部编码以及表示该房屋的结构注记,和楼层注记的编码都存储在线条的内部扩展属性中。如下面是对一个混3的房子线条的CASS内部属性编组。
其中(-3("SOUTH"(1000."141161")(1040.3.0))))这一个属性表中的141161代表的就是混房,3.0为房屋楼层注记。其中的(10250.08277.2317)这几组属性码为这个封闭多边形的各个节点的坐标数据。
房屋结构注记和楼层注记录的汉字对应的内部编码组如下:
其中的(1."混")就是该房屋的结构注记组属性,(1."3")为该房屋的楼层注记组属性。
2.2 居民地处理前的图形质量检查
不能保证所有的房子都达到了线条内部属性和图面注记的相统一。在图面上有个别情况,如前期检查不是很仔细或者其他原因导致居民地注记不在房屋线条的闭合线以内,导致利用程序不能提取到相对应的结构注记信息赋值给线条。为了避免这种情况的发生,保证整个图面经过处理后的居民地100%的正确。我们可以通过以下两个方面进行处理。
(1)通过编写程序检查线条内部是否有对应的注记信息
参考上面房子线条的内部属性编码组,我们通过其中的((0."LWPOLYLINE")(8."JMD")(100."Ac-DbPolyline")),这几个条件的联合对整个图面的居民地进行搜索,再通过LISP命令提取出房屋线条的每个端点坐标,形成一个点列表。通过这点列表利用LISP的选择命令来框选其中的文字并形成一个结果值,通过判断结果值是否为空就可以判断出是否房屋线条内部是否包含文字。对于闭合线内部缺少注记文字的我们通过上面的点列表计算该房屋闭合线的中心点坐标,并在该坐标上生成点错误标记来达到检查的目的。
(2)通过ArcGIS进行拓扑检查
把CASS中的房屋线条导入到ArcGIS中构面,再把CASS中的房屋注记信息导入到ArcGIS中转换成点,通过点-面拓扑规则中的“面包含点”和“点在面内”生成拓扑检查文件,再对照CASS文件进行相对应的修改。
通过上面两个步骤的结合应用可以保证房屋注记的正确性。
2.3 房屋线条属性和其对应的结构注记进行关联
要将房屋线条的属性同其对应的结构属性进行关联处理,并最终把线条和文字进行编组。我们可以通过LISP程序提取房屋线条对应的各个顶点的坐标形成一个点列表。然后通过这个点列表利用LISP中的ssget命令来进行框选其范围内的结构层次文字信息。通过获取的结构层次信息来改变房屋线条的内部编码组中对应的结构和楼层注记编码组,最后通过更新房屋线条的编码组就可以达到线条和属性的相对应。
基于上面的构思,为了提取到相对应的房屋结构和楼层注记信息。我们可以先编写程序将图面上一层以上房屋的层次和楼层注记信息分开显示,以便于提取和便于程序中对房屋层次的判断。如“混2”,这两个字分开在图面上显示,也就是这两个字可以单独选择,不能选择的时候是连接在一起的。这个可以根据文字的长度来加以分割,一个汉字的长度是2,我们可以在选中文字后,按其长度取其前两位即为房屋结构注记,从其长度为3开始取其以后部分即为房屋楼层注记。对于一层的房屋可以在程序中通过判断注记的长度来进行区分,如果长度小于等于2则不需要进行处理,大于2的才需要进行分分开显示处理。
编写程序提取房屋线条的内部属性编码表,提取该房屋线条各顶点坐标组成列表,利用这个坐标集来框选该房屋线条内部的房屋层次注记内容,通过判断提取到注记信息的个数来判断该房屋是楼层是否大于1层,通过LISP的numberp函数判断提取到的注记内容是否为数字来对结构注记和楼层注记进行区分。根据提取到的注记内容对房屋线条的内部属性中房屋结构注记和楼层注记的编码组进行重新组合,并对原编码组进行替换,对图元编码组进行更新,最后通过CASS软件中的重新生成命令来达到线条内部属性和图面注记的相互统一以及线条和文字的相互编组。
2.4 最终图形质量的检查
有的时候由于注记没有得到彻底的检查修改导致个别的房屋线条没办法处理,程序处理的时候会越过不处理。所以在主编组程序中可以考虑加入改变颜色的程序代码行,通过CAD的Change函数来对处理过的房屋线条进行改变颜色。这样通过整个图面处理过后,可以很方便的通过颜色的区分来对没有处理过的房屋进行检查单独处理。
3 部分程序的原代码
由于文字注记炸开程序和居民地注记检查程序相对较为简单,下来就将房屋编组的部分程序简单罗列如下:
在整个图面中搜索居民地信息,并进入循环进行单个处理。
4 具体处理流程
(1)基础数据准备
先把需要处理的数字化地形图转换到CASS软件中,除了JMD层外其他层全部删除掉了。然后就是用编写的注记检查命令检查没有注记的房屋线条,并进行整改处理。接下来把处理好的居民地线条导入到ArcGIS中构面,再把居民地注记导入到ArcGIS软件中转换成点,通过 ArcGIS中的“面包含点”和“点在面内”对居民地和注记进行拓扑处理,根据拓扑处理的结果相应改正CASS图件,以保证居民地线条和其对应文字注记相统一。
(2)运行房屋层次分割命令,对JMD层中的房屋结构注记和楼层注记进行分割处理,转换后的效果如下:
图1 转换前文字注记
图2 转换后文字注记
(3)运行居民编组修改的程序对房屋线条进行处理,根据居民地线条内部的居民地注记来修改房屋线条的内部属性编码,继而更新整个居民地线条的内部编码属性组。
(4)在CASS软件中利用快速选择对JMD层中的文字注记进行全部删除。只留下居民地线条。
(5)利用CASS软件中的“地物编辑”菜单下的“重新生成”命令对整个项目的居民地进行重新生成,这样每个居民地其对应的文字注记会根据其内部编码进行自动显示,并且和房物线条在同一个编组内。效果图如图3:
图3 最终处理后的房屋线
5 小结
按照上面的步骤,通过编写检查程序和ArcGIS拓扑检查两道工序保证了原始数据的质量。对于检查整改好的数据只需要运行命令对其进行编组处理,即可轻松的使这个项目中90%以上的工作得以轻松解决,使得原本单调乏味的工作变得轻松,不需要再去面对好几十万栋房屋一个一个地改过去,因此不仅节约了时间,更节省了人力,物力,财力,保证了整个工程的质量和进度。
[1]黎新懿,赵景亮.用Visual LISP开发AutoCAD 2004应用程序[M].北京:科学出版社,2003.
[2]周明,董仁扬.Visual LISP程序设计及其应用教程[M].上海:上海科学技术文献出版社,2008.
[3]蒋辉,潘庆林,刘三枝.数字化测图技术及应用[M].北京:国防工业出版社,2006.
[4]汤国安,杨昕.ArcGIS地理信息系统空间分析实验教程[M].北京:科学出版社,2006.
[5]吴静,何必,李海涛.ArcGIS 9.3 Desktop地理信息系统应用教程[M].北京:清华大学出版社,2008.