基于VBA的SCS数据分类转换为Shape文件
基于VBA 的SCS 数据分类转换为Shape 文件
高宏兵,李凤斌,王 进,刘 域
(大连九成测绘企业集团,辽宁大连116400)
摘 要 数据是GIS 发展及各类专题地理信息系统建立的基础,而目前提供基础数据的来源,主要是各部门由
AutoCAD 二次开发软件编辑的DWG数据,并有编码规则,用以区分不同的地物,所以有必要研究DWG数据的各
种转换方法。在学习其他的数据转换方法中,本文提出一种基于ArcMap 内置VBA ,利用自定义转换文件,对
DWG进行分类转换的方法,并在大连某地区的地籍测量的数据转换中得到较好的应用。
关键词 编码 GIS DWG VBA Geodatabase 数据转换
中图分类号: P208 文献标识码:B 文章编号:1672 - 4097 (2007) 04 - 0037 - 03
本文是以大连某地区开思绘制的DWG 数据
为例,为满足辽宁省城镇地籍数据建库标准,将其
分类转为Shape 数据格式为例,分析DWG、Shape
数据格式,介绍目前的转换方法,根据笔者工作,
谈谈利用ArcMap 内置VBA ,将DWG数据分类转
换为Shape 数据的原理和转换流程,并赋有关键
代码。
1 一般的数据转换方法
111 Arc Toolbox 转换方法
ESRI 的Arc Toolbox 软件,提供用户强大的地
理信息处理功能,为不同类型的任务提供解决的途
径。主要工具有:数据管理工具、分析工具、转换工
具和定制工具(My Tool s) 。在Arc Toolbox 中,先
将DWG 转为Geodatabase 数据格式, 选择“Con2
version Tools (转换工具) - > Import to Geodata2
base - > CAD to Geodatabase”;再把Geodatabase
转为Shape 格式,选择“Conversion Tool s (转换工
具) - > Import to Shapefile - > Geodatabase to
Shapefile”。这种转换只是把DWG 数据简单的转
为:点、线、面,不能实现分类提取的目的,达不到用
户需要的结果。
112 利用其他软件转换
目前许多的GIS 软件也可以转换数据,例如
SuperMap Deskpro 。还有专门对数据进行转换的
FME 软件,它可以实现100 多种GIS 及CAD 空
间数据格式, 如DWG、DXF 、DGN 、Shape File 、
ArcSDE 等的相互转换。但是对于专业的数据处
理软件,价格一般比较昂贵,要定制复杂的数据
转换任务,需要使用人员参加培训学习,这些对
于工程的投入大量资金, 所以这种转换也不
可取。
2 利用ArcMap 内置VBA 编写分类转换
程序
下面说明如何利用VBA 程序,将广州开思软
件编辑生成的DWG 格式数据分类转为Shape
格式。
211 程序设计思想
21111 了解开思编码体系
开思是采用对地物分类编码的规则,先将地
物按层划分,主要包括10 类(见表1) ,其它层还
有:Bound(框架线) 、Axes (轴线) 、Value (骨架线)
等。再将各层下不同地物进行分类编码,编码统
一用7 位数字描述,结构为:主编码( 4 位+ 1 位)
+ 附编码(2 位) ,前四位是按《国标》要求,后面是
细分类的码, 7 位编码存储在Thickness 属性中。
对于以块表示的地物,采用块名的不同进行7 位
数字编码。
21112 建立转换文件
根据开思软件的编码体系,建立DWG 数据与
Shape 的转换文件( ZHWJ . t xt ) 。格式为:类型,属
性字段,属性值,Shape 文件名。如图1 ,文件说明:
①将点数据中Text 属性值为GC113 和GC200 转
到CL KZD. shp (测量控制点) ②将线数据中Thick2
ness 属性值为3231000 和3232000 转到XZDW.
shp (线状地物) ③将面数据中Thickness 属性值为
2110100 和2110200 转到MZFW. shp (面状房屋)
④将注记点数据中Layer 属性值为002 转到TK.
shp (图廓注记) ⑤将注记点数据中Layer 属性值为
ZJ 转到ZZJ . shp (注记) 。
212 程序流程及代码说明
21211 程序流程
启动ArcMap ,运行宏,读入DWG 文件,根据
转换文件构造选择条件,从DWG 数据中提取地物
转换到指定的Shape 文件中,详细流程(见图1) 。
图1 程序流程
31211 程序主要代码说明
程序主要有三部分组成:读入DWG文件,读入
转换文件,根据转换文件分类选取并保持到Shape
文件。受篇幅限制,下面给出部分主要代码。
(1) 读入DWG文件。
Set pWorkspace = pCadWKSFact . OpenFromFile
(DWG- Path , 0) ‘/ 设置DWG文件路径/
Set p FeatureDataset = pWorkspace. OpenFeatureDataset
(DWG- name) ‘/ 打开DWG特征数据/
Set p FeatureClassContainer = p FeatureDataset
For Count = 0 To p FeatureClassContainer. ClassCount
—1‘/ 分类特征数据/
⋯‘/ 代码略,读入DWG 数据,生成点D、点Z、线
X、面M FeatureLayer/
Next Count
pMxDoc. UpdateContent s ’/ 刷新显示/
(2) 读入转换文件。
Open " ZHWJ . TXT" For Input As # 1‘/ 打开转换
文件/
Do While Not EOF (1) ‘/ 循环读取转换文件读到数
组ZH 中/
Input # 1 , ZH (Number , 1) , ZH (Number , 2) ,
ZH(Number , 3) , ZH(Number , 4)
Number = Number + 1‘/ 循环到数组的下一行/
Loop
Close # 1‘/ 关闭转换文件/
(3) 根据转换文件分类选取,并存储为Shape
文件,并按辽宁省城镇地籍数据建库标准添加属性
字段。
Set pMxDoc = Application. Document‘/ 取得焦点Map
对象/
Set pMap = pMxDoc. FocusMap‘/ 设置当前活动视图/
‘/ 创建一个新的空间书签对象,并设置它定位到焦点地
图的当前可视范围/
Set pActiveView = pMap
For I = 1 To Number —1‘/ 按行循环存放转化文件的
数组/
Select Case ZH( I , 1) ‘/ 根据数组第一列/
Case“Z”‘/ 如果ZH( I , 1) = ”Z”,为注记点层/
Set p FeatureLayer = pMap . Layer (0)
Set p FeatureSelection = p FeatureLayer‘/ 指定查
询的图层为注记点层/
Case“M”‘/ 如果ZH( I , 1) = ”M”, 查询的图层为
面层(代码略) /
Case“X”‘/ 如果ZH( I , 1) = ”X”, 查询的图层为
线层(代码略) /
Case“D”‘/ 如果ZH ( I , 1) = ”D”, 查询的图层为
点层(代码略) /
End Select‘/ 语句结束
Set pQueryFilter = New QueryFilter‘/ 查询过滤器/
pQueryFilter. WhereClause = " " + ZH( I ,2) + " = " + ZH
( I ,3) + " "‘/ 创建查询过滤器/
‘/ 以下Shape 文件存在,不存在创建,并添加地籍需要
的字段,插入选择结果/
If Check - for - shapefile ( Path , ZH( I ,4) ) = False Then
‘/ 自己定义函数,按指定路径创建Shape 文件,添
加地籍需要的字段/
Fun - Create - AddField ( Path)
End If
Set pNewFeatureClass = p TargetWorkspace. OpenFea2
tureClass (ZH( I ,4) ) ‘/ 打开shape/
Set pCursor = p FeatureClass. Search ( pQueryFilter ,
False) ‘/ 执行选择,获取选择指针/
Set p Feature = pCursor. Next Feature‘/ 游标指针指向
第一个位置的上面/
Do Until ( (p Feature Is Nothing) Or (bAbort) )‘/ 选择
不为空,根据指针遍历要素/
Set p Geom = p Feature. ShapeCopy
Set pBuffer. Shape = p Geom‘/ 获取要素的空间
范围/
For i = 0 To p Feature. Fields. FieldCount —1‘/ 返
回所有字段的数目/
‘/ 代码略,循环选择要素的属性及其值/
Next
p Insert . Insert Feature pBuffer ‘/ 插入到shape
文件/
Set p Feature = pCursor. Next Feature‘/ 游标指针
移动到下个位置/
Loop‘/ 返回到Do 语句/
Next‘/ 移动到数组下一行位置/
213 程序运行结果
转换文件是根据辽宁省城镇地籍数据建库
分类标准编写的,利用转换程序对图形进行分类
转换,并利用程序添加了属性字段,经验证达到
38 现 代 测 绘 第30 卷
了辽宁省城镇地籍数据建库标准。
3 结 论
这种转换方法,利用ArcMap 内置的VBA 程
序,对DWG 数据根据转换文件,直接进行分类转
换,用户可以按需要,按图层(Layer) 、颜色(color) 、
线形(Linetype) 、厚度( Thickness) 、块名( Text ) 等
分类转换,也可以要求提取部分感兴趣的数据,用
户不必了解DWG 数据的存储格式,只需编辑转换
文件,程序就可以根据转换文件,提取不同的数据
并转为Shape 格式。本程序已经过实际的验证,结
果较好。因此,对于DWG 转为Shape 数据有一定
的意义。
参考文献
1 薛伟. MapObject 地理信息系统程序设计[M] . 北京:国
防工业出版社,2004
2 田鹏波,刘清. AutoCAD 到Map Info 的地形图转换[J ] .
城市勘测, 2003 (1) : 32 - 34
3 刘光,刘小东. 地理信息系统二次开发教程- VB. net 和
Mapobject 实现[M] . 北京:清华大学出版社,2004
4 王钰. 用VBA 开发AutoCAD 应用程序[M] . 北京:人
民邮电出版社,1999 : 97 - 145
高宏兵,李凤斌,王 进,刘 域
(大连九成测绘企业集团,辽宁大连116400)
摘 要 数据是GIS 发展及各类专题地理信息系统建立的基础,而目前提供基础数据的来源,主要是各部门由
AutoCAD 二次开发软件编辑的DWG数据,并有编码规则,用以区分不同的地物,所以有必要研究DWG数据的各
种转换方法。在学习其他的数据转换方法中,本文提出一种基于ArcMap 内置VBA ,利用自定义转换文件,对
DWG进行分类转换的方法,并在大连某地区的地籍测量的数据转换中得到较好的应用。
关键词 编码 GIS DWG VBA Geodatabase 数据转换
中图分类号: P208 文献标识码:B 文章编号:1672 - 4097 (2007) 04 - 0037 - 03
本文是以大连某地区开思绘制的DWG 数据
为例,为满足辽宁省城镇地籍数据建库标准,将其
分类转为Shape 数据格式为例,分析DWG、Shape
数据格式,介绍目前的转换方法,根据笔者工作,
谈谈利用ArcMap 内置VBA ,将DWG数据分类转
换为Shape 数据的原理和转换流程,并赋有关键
代码。
1 一般的数据转换方法
111 Arc Toolbox 转换方法
ESRI 的Arc Toolbox 软件,提供用户强大的地
理信息处理功能,为不同类型的任务提供解决的途
径。主要工具有:数据管理工具、分析工具、转换工
具和定制工具(My Tool s) 。在Arc Toolbox 中,先
将DWG 转为Geodatabase 数据格式, 选择“Con2
version Tools (转换工具) - > Import to Geodata2
base - > CAD to Geodatabase”;再把Geodatabase
转为Shape 格式,选择“Conversion Tool s (转换工
具) - > Import to Shapefile - > Geodatabase to
Shapefile”。这种转换只是把DWG 数据简单的转
为:点、线、面,不能实现分类提取的目的,达不到用
户需要的结果。
112 利用其他软件转换
目前许多的GIS 软件也可以转换数据,例如
SuperMap Deskpro 。还有专门对数据进行转换的
FME 软件,它可以实现100 多种GIS 及CAD 空
间数据格式, 如DWG、DXF 、DGN 、Shape File 、
ArcSDE 等的相互转换。但是对于专业的数据处
理软件,价格一般比较昂贵,要定制复杂的数据
转换任务,需要使用人员参加培训学习,这些对
于工程的投入大量资金, 所以这种转换也不
可取。
2 利用ArcMap 内置VBA 编写分类转换
程序
下面说明如何利用VBA 程序,将广州开思软
件编辑生成的DWG 格式数据分类转为Shape
格式。
211 程序设计思想
21111 了解开思编码体系
开思是采用对地物分类编码的规则,先将地
物按层划分,主要包括10 类(见表1) ,其它层还
有:Bound(框架线) 、Axes (轴线) 、Value (骨架线)
等。再将各层下不同地物进行分类编码,编码统
一用7 位数字描述,结构为:主编码( 4 位+ 1 位)
+ 附编码(2 位) ,前四位是按《国标》要求,后面是
细分类的码, 7 位编码存储在Thickness 属性中。
对于以块表示的地物,采用块名的不同进行7 位
数字编码。
21112 建立转换文件
根据开思软件的编码体系,建立DWG 数据与
Shape 的转换文件( ZHWJ . t xt ) 。格式为:类型,属
性字段,属性值,Shape 文件名。如图1 ,文件说明:
①将点数据中Text 属性值为GC113 和GC200 转
到CL KZD. shp (测量控制点) ②将线数据中Thick2
ness 属性值为3231000 和3232000 转到XZDW.
shp (线状地物) ③将面数据中Thickness 属性值为
2110100 和2110200 转到MZFW. shp (面状房屋)
④将注记点数据中Layer 属性值为002 转到TK.
shp (图廓注记) ⑤将注记点数据中Layer 属性值为
ZJ 转到ZZJ . shp (注记) 。
212 程序流程及代码说明
21211 程序流程
启动ArcMap ,运行宏,读入DWG 文件,根据
转换文件构造选择条件,从DWG 数据中提取地物
转换到指定的Shape 文件中,详细流程(见图1) 。
图1 程序流程
31211 程序主要代码说明
程序主要有三部分组成:读入DWG文件,读入
转换文件,根据转换文件分类选取并保持到Shape
文件。受篇幅限制,下面给出部分主要代码。
(1) 读入DWG文件。
Set pWorkspace = pCadWKSFact . OpenFromFile
(DWG- Path , 0) ‘/ 设置DWG文件路径/
Set p FeatureDataset = pWorkspace. OpenFeatureDataset
(DWG- name) ‘/ 打开DWG特征数据/
Set p FeatureClassContainer = p FeatureDataset
For Count = 0 To p FeatureClassContainer. ClassCount
—1‘/ 分类特征数据/
⋯‘/ 代码略,读入DWG 数据,生成点D、点Z、线
X、面M FeatureLayer/
Next Count
pMxDoc. UpdateContent s ’/ 刷新显示/
(2) 读入转换文件。
Open " ZHWJ . TXT" For Input As # 1‘/ 打开转换
文件/
Do While Not EOF (1) ‘/ 循环读取转换文件读到数
组ZH 中/
Input # 1 , ZH (Number , 1) , ZH (Number , 2) ,
ZH(Number , 3) , ZH(Number , 4)
Number = Number + 1‘/ 循环到数组的下一行/
Loop
Close # 1‘/ 关闭转换文件/
(3) 根据转换文件分类选取,并存储为Shape
文件,并按辽宁省城镇地籍数据建库标准添加属性
字段。
Set pMxDoc = Application. Document‘/ 取得焦点Map
对象/
Set pMap = pMxDoc. FocusMap‘/ 设置当前活动视图/
‘/ 创建一个新的空间书签对象,并设置它定位到焦点地
图的当前可视范围/
Set pActiveView = pMap
For I = 1 To Number —1‘/ 按行循环存放转化文件的
数组/
Select Case ZH( I , 1) ‘/ 根据数组第一列/
Case“Z”‘/ 如果ZH( I , 1) = ”Z”,为注记点层/
Set p FeatureLayer = pMap . Layer (0)
Set p FeatureSelection = p FeatureLayer‘/ 指定查
询的图层为注记点层/
Case“M”‘/ 如果ZH( I , 1) = ”M”, 查询的图层为
面层(代码略) /
Case“X”‘/ 如果ZH( I , 1) = ”X”, 查询的图层为
线层(代码略) /
Case“D”‘/ 如果ZH ( I , 1) = ”D”, 查询的图层为
点层(代码略) /
End Select‘/ 语句结束
Set pQueryFilter = New QueryFilter‘/ 查询过滤器/
pQueryFilter. WhereClause = " " + ZH( I ,2) + " = " + ZH
( I ,3) + " "‘/ 创建查询过滤器/
‘/ 以下Shape 文件存在,不存在创建,并添加地籍需要
的字段,插入选择结果/
If Check - for - shapefile ( Path , ZH( I ,4) ) = False Then
‘/ 自己定义函数,按指定路径创建Shape 文件,添
加地籍需要的字段/
Fun - Create - AddField ( Path)
End If
Set pNewFeatureClass = p TargetWorkspace. OpenFea2
tureClass (ZH( I ,4) ) ‘/ 打开shape/
Set pCursor = p FeatureClass. Search ( pQueryFilter ,
False) ‘/ 执行选择,获取选择指针/
Set p Feature = pCursor. Next Feature‘/ 游标指针指向
第一个位置的上面/
Do Until ( (p Feature Is Nothing) Or (bAbort) )‘/ 选择
不为空,根据指针遍历要素/
Set p Geom = p Feature. ShapeCopy
Set pBuffer. Shape = p Geom‘/ 获取要素的空间
范围/
For i = 0 To p Feature. Fields. FieldCount —1‘/ 返
回所有字段的数目/
‘/ 代码略,循环选择要素的属性及其值/
Next
p Insert . Insert Feature pBuffer ‘/ 插入到shape
文件/
Set p Feature = pCursor. Next Feature‘/ 游标指针
移动到下个位置/
Loop‘/ 返回到Do 语句/
Next‘/ 移动到数组下一行位置/
213 程序运行结果
转换文件是根据辽宁省城镇地籍数据建库
分类标准编写的,利用转换程序对图形进行分类
转换,并利用程序添加了属性字段,经验证达到
38 现 代 测 绘 第30 卷
了辽宁省城镇地籍数据建库标准。
3 结 论
这种转换方法,利用ArcMap 内置的VBA 程
序,对DWG 数据根据转换文件,直接进行分类转
换,用户可以按需要,按图层(Layer) 、颜色(color) 、
线形(Linetype) 、厚度( Thickness) 、块名( Text ) 等
分类转换,也可以要求提取部分感兴趣的数据,用
户不必了解DWG 数据的存储格式,只需编辑转换
文件,程序就可以根据转换文件,提取不同的数据
并转为Shape 格式。本程序已经过实际的验证,结
果较好。因此,对于DWG 转为Shape 数据有一定
的意义。
参考文献
1 薛伟. MapObject 地理信息系统程序设计[M] . 北京:国
防工业出版社,2004
2 田鹏波,刘清. AutoCAD 到Map Info 的地形图转换[J ] .
城市勘测, 2003 (1) : 32 - 34
3 刘光,刘小东. 地理信息系统二次开发教程- VB. net 和
Mapobject 实现[M] . 北京:清华大学出版社,2004
4 王钰. 用VBA 开发AutoCAD 应用程序[M] . 北京:人
民邮电出版社,1999 : 97 - 145