闫炜亮 陈俊任
(江西核工业二六八测绘院 江西玉山 334700)
在测绘地理信息项目生产中,数据的前端采集和数据编辑都采用了数据格式为Dwg 的AutoCAD和南方Cass 软件,但这两种软件建库及分析能力欠佳,而建库及分析能力较强的主流GIS 软件一般通用支持格式为Shape 文件格式,且Shape 格式是地理信息系统界公认的标准格式[1],故探索Dwg 向Shape 格式的优化转换方法对提高生产效率有重要意义。本文以农村不动产调查房地数据为例,设计了AutoCAD VBA 结合ArcGIS 模型构建器的Dwg 文件转Shape 文件方法,提高了生产效率。
AutoCAD 软件是由美国欧特克有限公司(Autodesk)开发的一款在自动制图领域广泛使用的自动计算机辅助设计软件。因其强大的数据编辑功能,良好的人机交互设计以及完善的二次开发和用户定制接口,在测绘地理信息行业得到广泛应用。AutoCAD 平台提供了针对多种开发方式的扩展接口,可通过VBA、Lisp、C++等多种语言进行扩展开发,为数据处理提供了更多的可能性。南方Cass 软件是广东南方数码科技股份有限公司在AutoCAD平台开发进行二次开发出品的一套软件,该软件在地形、地籍、工程应用、土石方量算等领域应用广泛。南方Cass 与AutoCAD 常用数据格式均为Dwg 格式。AutoCAD VBA 开发环境如图1 所示。
图1 AutoCAD VBA 开发环境
ArcGIS 模型构建器英文名为ArcGIS Model builder,其本质是一种可视化的编程语言,可根据生产需求构建用于自动化执行数据管理和空间分析流程的地理处理工作流。使用ArcGIS 模型构建器可创建并修改模型构建器中的地理处理模型,并通过添加地理处理工具、地图图层、数据集以及其他数据类型并将其连接到流程来构建模型,同时,使用Python语言可以轻易的对模型构建器功能进行拓展。其优点有:1.处理大量重复操作。程序化的本质使其可以自动重复处理各种文件。2.可视化编程。既可以以代码构建补充功能,又可用易于理解的图表显示工作流顺序。3.调试方便。可分步调试,查看结果,提高开发效率。4.移植性强。模型只需简单处理,即移植到其他PC 或用于另一Python 脚本。ArcGIS 模型构建器如图2 所示。
图2 ArcGIS 模型构建器
Dwg 文件为AutoCAD 软件的常用数据格式,其本质是一个集成了点、线、面的二进制格式[2]的图形数据库。一个Dwg 文件由图纸信息和各种图元对象组成,分为无图形表示类和有图形表示类,其中无图形表示类包括图层、线型;有图形表示类包括以块表方式存放的对象。
Dwg 文件根据内容可以分为四个部分:
(1)索引部:索引部存储了AutoCAD 的版本信息及各部的首地址、各分表的首地址、长度及个数信息。
(2)环境部:环境部存储了系统变量、属性设置及当前状态等信息。
(3)实体部:实体部存储了所有图形实体的描述,一个Dwg 文件的大部分图形信息存储在实体部。图形实体又分为简单图形实体和复杂图形实体。简单图形实体是点、直线等基本图形,如Point 实体、Line 实体等;复杂图形实指由多段线、图块等基本图形实体组成的图形,如PolyLine 实体、Block 实体。
(4)名表部:名表部存储了所有实体的描述,如图层名称、字体类型、线型名称等。
Dwg 文件的属性存储能力较弱,可通过扩展属性(XData)存储一定的属性。使用AutoCAD VBA 语言,可以对扩展属性进行存储和导出,从而有了Dwg向Shape 文件格式带属性转换的基础。
Shape 文件格式属于一种矢量图形格式,它能够保存几何图形的位置及相关属性,它在20 世纪九十年代初的ArcView GIS 的第二个版本被首次应用。目前,主流GIS 软件都可以读取Shapefile。
Shape 实质上由多个文件组成的。这其中“.shp”,“.shx”与“.dbf”三个文件是必须的,表示同一个Shape 文件的文件名必须相同,另外还有八个可以增强空间数据的表达能力的可选文件。文件格式说明如下:
(1)*.shp:Shape 文件的主要图形格式,保存了要素的几何实体。
(2)*.shx:Shape 文件的图形索引格式。记录了每个实体在shp 文件中的位置,通过它可实现对实体的快速搜索。
(3)*.dbf:Shape 文件的属性数据格式,以Dbase数据表格式存储了实体的属性数据。
Shape 文件的三个必须文件决定了Shape 文件的图形和属性是一体的,转换时要同时考虑图形和属性的对应关系。
对于Dwg 文件,一个文件中包含了点线面各种图形数据,各图形数据分布在各图层,对应的扩展属性可以存储一定的属性数据;而Shape 文件一个文件只对应一种数据类型,如点的Shape 文件只存储点数据格式,不能接受其他数据格式,属性随图形一并存储。Dwg 文件要转换为Shape 文件,须按数据类型对原始文件进行分层处理,使之与对应的转换后的数据类型对应,同时转换后图形和属性的对应关系应正确,以此为关键点进行转换方法设计。
转换步骤:
(1)为了使转换后数据类型对应,先对待转换数据进行预处理,按数据类型和图层分别存储,对Dwg文件的图层进行标准化规范,使其内部图层名称符合要求,使用VB 语言,在AutoCAD VBA 环境下进行开发。编写CAD 数据分层和实体扩展属性的导出程序,完成图形的预处理和属性的导出。
(2)在ArcGIS 模型构建器中,编写Dwg 文件转换为Shape 文件的工作流模型,实现各图层、各类型数据转线,转面,转点等操作,其中,转点操作主要是将AutoCAD 中的Annotation 注记转换为点文件,实现将其注记内容转换为其属性的功能。然后通过空间连接,关联各类型文件之间的关键字段,实现各文件之间的关系关联。
(3)在ArcGIS 模型构建器中,对转换后的各类型文件,通过属性连接(Join)方法,关联图形和第一步导出的扩展属性,如果需要加入其它属性,也可以通过Excel 表格或Dbf 表格进行属性连接。关联可以使用AutoCAD 的Handle 字段作为关键字段,也可使用第二步已连接的关键字段。属性连接完成后将文件通过过程库过滤,过滤掉无用字段,然后导出即可。
(4)将编写好的模型保存为ArcGIS ToolBox 工具箱,实现转换功能的封装,便于移植到其它PC 机使用。转换设计流程图如图3 所示。
图3 转换流程设计
农村不动产调查房地数据主要为宗地面及其属性,自然幢面及其属性,分层分幢图及其属性。以宗地面和自然幢面的Dwg 数据为例,详述转换方法的实现。
4.2.1 CAD/CASS 图层处理
CAD/CASS 图层处理主要是对Dwg 文件中的点线面要素分层处理和保存,在规范了图层命名(标准化)后,可以较容易的基于AutoCAD VBA 开发出相应功能。此功能的设计思路是:拷贝一份Dwg 数据并将文件名称命名为需要的图层名,读取这份拷贝后文件名称,删除这份文件中除了文件名图层外的所有内容,只保留与文件名相同的图层,其他图层以此类推,实现Dwg 图层的分离。处理后,每个Dwg 文件中只有一个图层,与Shape 文件在形式上已经对应。
Dwg 文件的打开方法为:
ThisDrawing.Application.Documents.OpenshlFolder.Items.Item.path&""&Dwg_Name
Dwg 文件的另存方法为:
ThisDrawing.SaveAs shlFolder.Items.Item.path &"" & Dwg_Name
图层实体的删除方法为:
Del_Entity.Delete
4.2.2 CAD/CAS 扩展属性导出
自定义扩展AutoCAD 图形属性信息的方法有两种[3],一是通过ObjectARX 以添加XData 属性的方式扩展,扩展数据是以结果缓存的形式附加在图形实体上;二是通过ObjectARX 以添加数据库词典(DBDictionary)的方式进行属性扩展。
以XData 属性导出为例,基于AutoCAD VBA 进行代码编写,获取扩展属性代码如下:
Ent.GetXData "SOUTH", XOutDataType,XOutData
4.2.3 ArcGIS 模型构建器开发
ArcGIS 模型构建器主要实现图形转换、空间连接和属性挂接功能,这些功能ArcGIS 内置函数已提供,可直接调用,如需拓展功能,使用Python 语言也可很快进行开发。模型构建图如图4 所示。
图4 模型构建图
(1)图形转换
图形转换功能主要使用 ArcGIS 的FeatureToPolygon 函数和FeatureToPoint 函数。
FeatureToPolygon 函数允许将输入的线或面要素所封闭的区域生成的面的要素类,同时其ATTRIBUTES 参数可以在输出要素类中保留标注要素的属性。以宗地面和其宗地号为例,将宗地面Dwg转换为宗地面Shape,并将宗地号赋值给宗地面的Python 语句为:arcpy.FeatureToPolygon_management("''", ZD_Polygon, "", "ATTRIBUTES", 宗 地 号_DWG_Annotation)。
FeatureToPoint 函数允许输入要素的代表位置生成的点的要素类,可以将点、面转换为点要素,同时附带有相应属性。如面转换为点后可以方便的通过空间连接将属性赋给另一面要素。宗地面转为点的Python 语句为:arcpy.FeatureToPoint_management(ZD_shp, ZD_Point, "INSIDE")。
(2)空间连接
空间连接主要使用ArcGIS 的SpatialJoin_analysis函数。其可以根据空间关系将一个要素类的属性连接到另一个要素类的属性,目标要素和来自连接要素的被连接属性写入到输出要素类。
以自然幢面为例,一个宗地有多个自然幢,将宗地号赋值给自然幢面的思路为先将宗地面转换为点,再通过点对自然幢面赋值。Python 实现语句如下 :arcpy.SpatialJoin_analysis (ZRZ, ZD_Point,ZRZ_Polygon, "JOIN_ONE_TO_ONE", "KEEP_ALL","ORIG_FID "ORIG_FID" true true false 0 Long 0 0,First,#,C:\ 农房\Shape\z1.shp,ORIG_FID,-1,-1", "INTERSECT", "", "")。
(3)属性连接
属性连接主要使用ArcGIS的AddJoin_management函数和CalculateField_management函数,前者根据相同字段建立图与图、或图与表的连接,后者对属性表中的字段进行各种计算。建立基于宗地代码的连接的Python 语句为:arcpy.AddJoin_management (宗地面, "ZDDM", 连接工作薄_表或mdb_, "ZDNUM", "KEEP_ALL"),计算字段的Python 语句为:arcpy.CalculateField_management (连接-中间数据, "ZD.OWNER", "[zdinfo.QUANLI]", "VB", "")。
4.2.4 数据导出
处理后的要素数据包含有很多过程字段,最终结果并不需要,需建立过滤数据库,将过程数据导入进行过滤处理,然后导出为Shape 格式文件,即可得到最终数据。过滤数据库本质是一个模板数据集,规范化设计了每个字段的格式,长度,是否允许空值等数据库条件。
图5 是农村不动产调查的宗地面,其上有宗地代码注记,数据格式为DWG 格式;图6 是经过本文设计方法转换后得到的宗地面,宗地代码已赋值进其属性里,其他扩展属性已连接,数据格式为Shape格式。测试数据量150 宗,转换过程耗时15 秒,效率较高。
图5 宗地Dwg(部分)
图6 宗地Shape(部分)
本文研究了Dwg 和Shape 格式数据,并对其进行细致分析,基于AutoCAD VBA 和ArcGIS 模型构建器,设计了Dwg 转换为Shape 格式的方法,该方法开发速度快,运行效率高,在以农村不动产调查为首的测绘地理信息项目中发挥了较大作用,接下来将进一步优化方法,提高转换效率。