39
学术出版,国际教著,国际期刊,SCI,SSCI,EI,SCOPUS,A&HCI等高端学术咨询
来源:职称驿站所属分类:软件开发论文 发布时间:2011-09-24浏览:391次
摘要:本文论述了采用AutoCADMap3D、ArcEngine实现图斑入库的方法,介绍了相应的功能和实现过程及代码。
关键词:图斑;GIS;AutoCADMap3D;ArcEngine;Shape
1. 引言
图斑是土地管理的基础,是土地划分的最小单元。它是以某一特定比例尺地形图为工作底图,将地貌、土地利用类型基本相同,水土流失类型基本一致的土地单元(地块)分为一类,以其为基础调查单元,然后将单元勾绘到地形图上成为图斑。
一般的图斑绘制是在AutoCAD下将图斑区域绘制成闭合的多段线(或二维多段线),之后利用专业软件如南方CASS,广州SCS等将图斑地类代码、权利人等属性录入到CAD的扩展属性中,之后转换为ArcGISShape格式的数据,最终导入到ArcGIS空间数据库中。这种方法操作复杂,出错率高。
本文利用AutoCADMap3D的图形清理、拓扑等功能,对基础AutoCAD图斑划分图进行整理,对图斑重叠、交叉等错误进行快速、有效的修改。使用ESRI公司的ArcEngine组件,开发程序,实现数据快速录入、转换,极大的简化了工作方法,提高了工作效率。
2. AutoCADMap3D及ArcEngine简介
AutoCADMap3D是AutoDesk公司开发的专业软件,它是以AutoCAD作为图形环境的地图制作和GIS软件。其具有强大的地理数据采集、编辑、数据库管理及专题图制作和空间分析功能,是服务于地图制作、GIS分析和应用领域的不可缺少的工具。
ArcEngine是ESRI公司开发的开发组件包。它具有一组完备的并且打包的嵌入式GIS组件库和工具库,开发人员可用来创建新的或扩展已有的桌面应用程序。ArcEngine由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发布的Runtime(运行时环境)。 ArcEngine开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,适于为Windows、UNIX或Linux用户构建基础制图和综合动态GIS应用软件。ArcGISEngineRuntime是一个使终端用户软件能够运行的核心ArcObjects组件产品,并且将被安装在每一台运行ArcEngine应用程序的计算机上。
3. 图形整理思路与流程
所谓“图斑勾绘”,是指在地形图(或影像)比对下,将地貌、土地利用类型基本相同的地块,用线封闭起来,并在封闭区域内部标注地类编码。这个过程一般是在AutoCAD平台下完成的。本文对于“图斑勾绘”过程不进行深入讨论。图斑勾绘完成后AutoCAD图形中的图元及说明请详见表1。刚刚勾绘完成后的图斑可能存在这样那样的问题,如图斑线重合、交叉、裂缝等,这些问题需要在AutoCAD中进行修改后,才能将图斑转换为ArcGISShape格式的入库数据。
图斑文件图元表
图元类型 图层名 备注
多段线(直线或二维多段线) DLTB 封闭的图斑线
文字 DLBM 所在图斑的地类编码
文字 QLR 所在图斑的权利人
表1
3.1图斑线检查的一般方法
由于AutoCAD并非专业的GIS软件,所以它并不具备GIS软件的关系运算、拓扑运算等功能。在一般情况下用AutoCAD勾绘好图斑后,一些专业软件都会提供一些检查图斑错误的功能,或者可以对AutoCAD进行二次开发来对图斑线进行检查。但由于AutoCAD图形处理方式和运算方法的限制,这些功能或二次开发的软件并不能完全检查出图斑线的所有问题。逐渐的,ArcGIS等专业的软件被运用于图斑线的检查工作中来。如使用ArcGIS对图斑检查时,首先将图斑线在ArcGIS中导入为Shape格式的线,然后进行拓扑进行错误标记,最后回到AutoCAD中依照标记的错误,对图斑线进行修改。这种方法虽然大大提高了图斑错误的检查率,但由于反复的数据转换给操作带来了极大的麻烦。
3.2利用AutoCADMap3D实现图斑错误自动修改
本文所用到的AutoCADMap3D版本为Autodesk最新的AutoCADMap3D2010。图斑处理可分为以下5步。
1、将DLTB层中所有图元复制到一个新建的AutoCAD文件中,并将其分解(AutoCAD命令为Explode)。检查其中是否有圆或圆弧存在,如果存在则需要将其加密绘制成多段线或直线。这里不允许图斑存在圆或圆弧的原因是,圆或圆弧转换成ArcGISShape格式数据后,ArcGIS会自动将其加密成多段线。因此,转换后会造成图斑面积的变化和出现拓扑错误。
2、在AutoCADMap3D中使用图形清理功能(命令为MapClean),在弹出的图形清理对话框中(图2)依次进行如图1所示流程操作。这里要说明两点:一、公差=0.01是根据数据要求来设定的,即根据不同的拓扑容限要求设置不同的公差。二、选项可以选择“自动”或“交互式”,这里选择“自动”是为了更快的完成拓扑错误的修改。但是,自动修改有可能带来图斑线细微移动等问题,这些问题在这里不进行深入的讨论。当然,除了“自动”也可以选择 “交互式”,“交互式”可以根据拓扑错误,在AutoCAD图形当中用不同形状的快来表示不同的错误。
图1
图2
3、图形清理后,在AutoCAD的命令行中,会出现如图3所示的提示。重复第二部工作直到提示“创建的对象”与“删除的对象”都为0时为止。因为只有“创建的对象”与“删除的对象”都为0时,才能说明图中没有对象改动,即图形中不存在错误。
图3
4、在AutoCADMap3D中使用创建拓扑功能(命令为MapTopoCreate),在弹出的对话框中直接选择“多边形”点击完成即可。如果此时,图形中仍有错误,AutoCADMap3D会在图形中提示错误,如图4。将错误修改再创建拓扑,直到AutoCADMap3D提示拓扑创建成功,如图 5。
图4
图5
5、将DLBM层、QLR层文字拷贝到图斑处理后的图形中,将文字对齐方式改为“左对齐”(非“左对齐”情况,ArcGIS进行空间查询时有可能出错)。粗查文字插入点是否在所对应的图斑范围内。
4. 图形转换的实现
本文所用到的ArcGIS版本为ArcGIS9.2版本。软件开发环境为MicrosoftVisualStudio2005,开发语言为C#。
4.1一般的数据转换方法
ArcGIS的ArcToolbox软件,提供用户强大的地理信息处理功能,为不同类型的任务提供解决的途径。主要工具有:数据管理工具、分析工具、转换工具和定制工具(MyTools)。在ArcToolBox中,先将DWG转为Geodatabase数据格式。选择 “ConversionTools(转换工具)->ImportfromCAD”;再把Geodatabase转换为Shapefile格式,“ConversionTools(转换工具)->FeatureClassToShapefile(multiple)”。这种转换只是单纯的把AutoCADDWG格式文件转换为:点、线、面,不能实现分类、分层提取的目的,不能满足数据库要求。
4.2利用ArcEngine编写快速录入、转换程序
4.2.1程序流程
首先,先通过交互选择需要转换的AutoCADDWG文件。然后,用DWG图形中多段线进行构造面(Polygon)。接下来,用DWG图形中文字进行空间查询,查询包含它的面。最后,把文字写入面的对应字段。如图6。
图6
4.2.2程序主要代码及说明
(1)读入DWG文件
stringmFileName;//DWG文件名
stringmPath;//DWG文件路径
stringmShpName;//生成的Shape文件名
OpenFileDialogmOpenFD=newOpenFileDialog();
mOpenFD.Multiselect=false;
mOpenFD.Filter="DWG文件(*.dwg)|*.dwg";
mOpenFD.FilterIndex=1;
if(mOpenFD.ShowDialog()==DialogResult.OK)
{
mFileName=System.IO.Path.GetFileName(mOpenFD.FileName);
mPath=mOpenFD.FileName.Substring(0,mOpenFD.FileName.Length-FileName.Length-1);
mShpName=mPath+""+System.IO.Path.GetFileNameWithoutExtension(mOpenFD.FileName)+".shp";
}
(2)用读入的DWG文件中的线,进行构造面并生成Shape文件
ESRI.ArcGIS.Geoprocessor.GeoprocessormGP=newESRI.ArcGIS.Geoprocessor.Geoprocessor();
mGP.OverwriteOutput=true;//允许覆盖
ESRI.ArcGIS.DataManagementTools.FeatureToPolygonmFeaToPol=newFeatureToPolygon(mOpenFD.FileName+@"Polyline",mShpName);
IGeoProcessorResultmResult=mGP.Execute(mFeaToPol,null)asIGeoProcessorResult;//执行GP
IFeatureClasspFC=mGP.Open(mResult.ReturnValue)asIFeatureClass;
//返回结果
(3)按照数据库的要求添加字段
//添加字段ZDH(宗地号)
IFieldpField0=newFieldClass();
IFieldEditpFieldEdit0=pField0asIFieldEdit;
pFieldEdit0.Name_2="ZDH";
pFieldEdit0.Type_2=esriFieldType.esriFieldTypeString;
pFieldEdit0.Length_2=19;
pFC.AddField(pField0);
//添加字段QLRMC(权利人名称)
IFieldpField1=newFieldClass();
IFieldEditpFieldEdit1=pField1asIFieldEdit;
pFieldEdit1.Name_2="QLRMC";
pFieldEdit1.Type_2=esriFieldType.esriFieldTypeString;
pFieldEdit1.Length_2=100;
pFC.AddField(pField1);
……
//添加字段SYTY(实际用途即地类编码)
IFieldpField3=newFieldClass();
IFieldEditpFieldEdit3=pField3asIFieldEdit;
pFieldEdit3.Name_2="SJYT";
pFieldEdit3.Type_2=esriFieldType.esriFieldTypeString;
pFieldEdit3.Length_2=4;
pFC.AddField(pField3);
……
(4)将DWG中的文字与构造好的面进行空间查询
//将DWG中文字作为FeatureClass读入
IWorkspaceFactorypCADWF=newCadWorkspaceFactory();
IFeatureWorkspacepFW=pCADWF.OpenFromFile(mPath,0)asIFeatureWorkspace;
IFeatureClasspCadTxtFC=pFW.OpenFeatureClass(mFileName+:annotation");
ISpatialFilterpSFilter=newSpatialFilterClass();//监理空间过滤器
inttxtNum=pCadTxtFC.FindField("Text");//文本内容索引
intlyrNum=pCadTxtFC.FindField("Layer");//图层索引
IFeatureCursorpFeatureCur=pCadTxtFC.Search(null,false);
IFeaturepFeature=pFeatureCur.NextFeature();
while(pFeature!=null)
{
stringtxt=pFeature.get_Value(txtNum)asstring;//文字内容
stringlayer=pFeature.get_Value(lyrNum)asstring;//文字图层
if(layer.ToUpper()=="DLBM")//文字是“DLBM”层
{
/////
pSFilter.SpatialRelDescription="Unknown";
pSFilter.Geometry=pFeature.Shape;
pSFilter.GeometryField=pFC.ShapeFieldName;
pSFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelWithin;
IQueryFilterpQFilter=pSFilterasIQueryFilter;
IFeatureCursorpFC_FCur=pFC.Search(pSFilter,false);
IFeaturepFC_Feature=pFC_FCur.NextFeature();//包含文字的polygon
if(pFC_Feature==null)
{
pFeature=pFeatureCur.NextFeature();System.Runtime.InteropServices.Marshal.ReleaseComObject(pFC_FCur);
//释放com资源
continue;
}
if(pFC_Feature.get_Value(5).ToString()!=txt)
//第五项为SJYT项
{
if(pFC_Feature.get_Value(5).ToString()=="")
{
pFC_Feature.set_Value(5,txt);
pFC_Feature.Store();//保存
}
else
{
pFC_Feature.set_Value(8,pFC_Feature.get_Value(8)+";"+txt);
//get_Value(5)为备注项,目的是如果“SJYT”中已经有内容,即已经有文字通过查询找到过该Polygon,那么查询文字写入备注中,以便转换后检查问题。
pFC_Feature.Store();
}
}
pFC_FCur.UpdateFeature(pFC_Feature);//更新字段
pFeature=pFeatureCur.NextFeature();System.Runtime.InteropServices.Marshal.ReleaseComObject(pFC_FCur);
//释放com资源
}
elseif(layer.ToUpper()=="QLR")//文字是“QLR”层
{
……
//这里过程与文字是“DLBM”层情况基本一致,所以省略掉。
}
}
5. 结论
AutoCADMap3D是专业的GIS软件,它不仅涵盖AutoCAD所有的功能,而且还具备专业GIS软件关系查询、拓扑查询等功能。它为 AutoCAD在土木工程、测绘工程等领域的运用,作出很好的补充。利用AutoCADMap3D我们可以轻松的做出清晰、整洁的图形。结合 ArcEngine强大的GIS扩展、开发能力,本文轻松的实现了从基础AutoCAD图形到ArcGIS数据库的转换。
参考文献
1AutoDesk,AutoCADMap3D3D2010用户手册[Z].2009
2贾文涛,朱德海,浅谈AutoCADMap3D的拓扑分析功能及其在土地利用规划中的应用[M],中国地理信息系统协会第五届年会论文集.1998.8
3Zeiler,Michael,ExploringArcObjects[M].ESRIPress.2001.7
4蒋波涛,插件式GIS应用框架的设计与实现[M].电子工业出版社.2008.10
5天津市国土资源和房屋管理局,天津市城镇地籍调查区县核查工作细则.2009.11
《利用AutoCAD Map 3D、ArcEngine实现图斑快速入库》
本文由职称驿站首发,您身边的高端学术顾问
扫码关注公众号
微信扫码加好友
职称驿站 www.zhichengyz.com 版权所有 仿冒必究 冀ICP备16002873号-3