DWG数据转GIS数据在Web中的实现
2021-08-23杜红涛何旭海张华庞玉良
杜红涛 何旭海 张华 庞玉良
(洛阳鸿业迪普信息技术有限公司,河南 洛阳 471003)
GIS 平台在空间规划数据分析、编制、实施监督预警等工作中作用巨大,能够快速对数据进行建模、分析、处理。现阶段,空间规划编制成果有很大一部分是DWG 格式的数据。根据自然资源部要求,空间规划的最终成果要提交GIS 格式的数据,因此,亟须将DWG 格式的数据转换为GIS 格式。
1 概述
在Web 中实现DWG 数据向GIS 数据的转换主要体现在客户端和服务器。客户端采用Web Services 技术实现数据上传,服务器采用Teigha.Net 和ArcGIS Engine 技术将DWG 数据转换为GIS 数据。
Web Service 是一个平台独立、低耦合、自包含、基于可编程的Web 的应用程序。
Teigha.Net SDK 由开放设计联盟(Open Design Alliance,ODA)提供,是基于.Net 语言开发的软件开发包[1]。
ArcObjects SDK 由 美 国ESRI(Environmental Systems Research Institute,Inc.美国环境系统研究所公司)推出,是为编程人员开发客户化应用程序提供的组件包。
DWG 数据是由AutoCAD、中望CAD、浩辰CAD 等CAD 设计软件生产的数据,主要有DWG、DXF 两种数据格式[3]。
GIS 数据是由ArcGIS 等GIS 设计软件生产的数据,常用的GIS 数据类型有栅格数据和矢量数据两种类型[4]。栅格数据的主要格式有.jpg、.png、.tif 等;矢量数据的格式主要有Shapefile(矢量图形)、Personal Geodatabase(个人空间数据库)、File Geodatabase(基于文件格式的数据库)和ArcSDE Geodatabase(企业级空间数据库)。本文所说的GIS数据是指矢量数据。
DWG 数据常用的图元类型有:直线、多段线、圆弧、圆、椭圆弧、椭圆、面域、填充、块、属性块、单行文字、多行文字、组。GIS 数据常用的要素类型有:点、多点、线段、圆弧、椭圆弧、多段线、多边形、圆、椭圆等。
DWG 数据和GIS 数据是由两种不同软件平台生产的数据,因此需要先确定两种数据之间图元的对照关系(如表1 所示),才能够实现数据转换。
表1 DWG数据图元和GIS数据图元对应关系
2 数据上传
本文主要基于.NET 技术和Web Services 技术实现数据上传。
用户选择DWG 数据后,客户端将DWG 数据转为二进制数据流,通过POST 的方法传到服务器,服务器如果正确接收到DWG 数据,则对DWG 数据进行转换。数据上传流程如图1 所示。
图1 数据上传流程
3 数据转换
DWG 数据向GIS 数据转换的过程主要包括图形数据转换、属性数据转换、特性数据转换。具体步骤如下:
(1)使用Teigha.Net SDK 打开需要转换的DWG 数据,并获取DWG 数据中的块表记录(BlockTableRecord)[5]。
(2)根据表1 中DWG 数据图元和GIS 数据图元对应关系构建DWG 数据和GIS 数据的转换通道。
(3)循环解析块表记录中的DWG 数据并获取转换参数,根据转换参数使用ArcObjects SDK 创建GIS 数据。在图形转换过程中,为保证DWG 数据的完整性,需要将DWG 图元的特性转为GIS 要素的属性;如果DWG 图元存在扩展属性,则同步将DWG 图元的扩展属性转为GIS 要素的属性。具体转换流程如图2 所示。
图2 DWG数据和GIS数据转换流程
3.1 DWG 文件解析
使用Teigha.Net 接口打开DWG 数据,获取DWG 数据中的块表记录,遍历块表记录中的DWG 图元,获取需要转换的DWG 数据。
打开DWG 文件:
3.2 图形数据转换
解析DWG 图元是为了获取GIS 数据创建时需要的参数,创建不同类型的GIS 数据所需要的参数不同。下面以多段线和面填充为例说明图形数据转换的步骤。
3.2.1 DWG 多段线数据转换
DWG 多段线由直线或圆弧组合而成,首先,使用Teigha.Net 将DWG 多段线分解为图元集合(集合中包括直线、圆弧) ;其次,逐个解析并转换直线和圆弧数据;最后,将转换的直线和圆弧数据组合为GIS 多段线段集合(SegmentCollection)。DWG 多段线图元转换为GIS 数据线要素转换流程如图3 所示。
图3 DWG多段线图元转为GIS数据线要素
(1)解析多段线数据
使用Teigha.Net 将DWG 多段线分解为图元集合(集合中包括直线、圆弧)。((OdDbEntityPtr)pPolyline)->explode(entitySet);
遍历多段线,获取直线的起点坐标和终点坐标,圆弧的起点坐标、终点坐标、圆心角。
(2)直线数据转换
GIS 数据的直线要素由起点坐标(X、Y、Z)和终点坐标(X、Y、Z)构造。
使用Teigha.Net 获取直线的起点和终点坐标,通过ArcGIS Engine API 实现对GIS 直线要素的重构。
构建GIS 直线数据:
iLine->PutCoords(iPointStart,iPointEnd);
(3)圆弧数据转换
GIS 数据的圆弧要素是由圆弧起点坐标(X、Y、Z)、圆弧终点坐标(X、Y、Z),以及起点到终点的方向是否为逆时针、圆心角构造。
具体构造方法如下:
使用Teigha.Net 获取DWG 圆弧的起点坐标(X、Y、Z)、终点坐标(X、Y、Z)、起点角度、终点角度,计算得到圆心角。使用ArcGIS Engine API 实现对GIS 圆弧要素的重构。
构建GIS 圆弧要素:
pConstCArc->ConstructEndPointsAngle(Point Start,PointEnd,VARIANT_TRUE,ArcAngle);
(4)GIS 数据
使用ArcGIS Engine API段集合 (SegmentCollection)的方式构造线要素,然后将转换后的直线要素、圆弧要素进行拼接。
构造线要素:
ISegmentCollectionPtr ipGonColl(CLSID_Polyline);
GIS 数据拼接:
ipGonColl->AddSegment(ipSegment);
3.2.2 DWG 面域填充数据转换
DWG 面域填充无法矢量化,第一步:需要将面域填充转换为闭合多段线;第二步:使用Teigha.Net将DWG 多段线分解为图元集合(集合中包括直线、圆弧);第三步:逐个解析并转换直线和圆弧数据;第四步:将转换的直线和圆弧数据组合为GIS 面域段集合(SegmentCollection)。DWG 面域填充图元转换为GIS 数据面域要素的流程如图4 所示。
图4 DWG面域填充数据转为GIS数据面域要素
(1)面域填充转为闭合多段线
使用Teigha.Net 遍历面域填充边界,将填充边界组合为闭合多段线。
(2)解析多段线数据
使用Teigha.Net 将DWG 多段线分解为图元集合(集合中包括直线、圆弧)。((OdDbEntityPtr)pPolyline)->explode(entitySet);
遍历多段线,获取直线的起点坐标和终点坐标,圆弧的起点坐标、终点坐标、圆心角。
(3)直线数据转换
GIS 数据的直线要素由起点坐标(X、Y、Z)和终点坐标(X、Y、Z)构造。
使用Teigha.Net 获取直线的起点和终点坐标,通过ArcGIS Engine API 实现对GIS 直线要素的重构。
构建GIS 直线数据:
iLine->PutCoords(iPointStart,iPointEnd);
(4)圆弧数据转换
GIS 数据的圆弧要素由圆弧起点坐标(X、Y、Z),圆弧终点坐标(X、Y、Z),起点到终点的方向是否为逆时针、圆心角构造。
使用Teigha.Net 获取DWG 圆弧的起点坐标(X、Y、Z)、终点坐标(X、Y、Z)、起点角度、终点角度,计算得到圆心角。使用ArcGIS Engine API 实现对GIS 圆弧要素的重构。
构 建GIS 圆 弧 要 素:pConstCArc->Construct EndPointsAngle(PointStart,PointEnd,VARIANT_TRUE,ArcAngle);
(5)GIS 数据
使用ArcGIS Engine API 段集合(SegmentCollection)的方式构造面域要素,然后将转换后的直线要素、圆弧要素进行拼接。
构造线要素:
ISegmentCollectionPtr ipGonColl(CLSID_Polygon);
GIS 数据拼接:
ipGonColl->AddSegment(ipSegment);
3.3 属性数据转换
为了保证DWG 数据的完整性,本文在DWG 数据向GIS 数据转换过程中,将DWG 数据的扩展属性转换为GIS 要素的属性信息,同时设计了DWG 图元的特性和GIS 图元的对应关系(如表2 所示)。
表2 DWG图元特性和GIS要素属性对应关系
DWG 图元的特性和扩展属性都是以链表的形式保存在xData 中,需要获取DWG 图形的属性链表,然后遍历解析链表信息,根据DWG 特性的CODE 值和链表的类型,最终得到所有属性信息。
获取DWG 图元的XData 得到属性链表:
遍历属性链表获取属性信息:
GIS 数据是以空间信息表的形式进行存储的,图形数据和属性数据作为表记录存储在空间信息表中。对GIS 要素的属性操作,需要先获取表结构信息,然后将相应的属性值记录到表中。
获取GIS 要素属性表:IFieldsPtr ipFields;
3.4 数据输出
GIS 数据有两种存储方式,即:本地文件存储、数据库存储[7]。本文采用数据库存储方式来存储GIS数据。具体的输出步骤为:首先连接GIS 数据库,然后将构建的GIS 图形数据、GIS 要素属性数据逐条插入GIS 空间信息表中。数据输出方法如下:
4 结束语
本文通过对DWG 数据和GIS 数据图元对应关系的研究,采用Teigha.Net API 技术对DWG 数据进行解析,提出了图形分解、重组方法,以提高数据转换精度。在数据转换过程中,采用ArcGIS Engine API 技术实现DWG 数据的完整转换。此外,还基于Web Service技术,利用服务器强大的计算能力,提高转换效率。