ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CAD转GIS全流程指南:从DWG到ArcGIS数据标准化的实战方法

CAD转GIS全流程指南:从DWG到ArcGIS数据标准化的实战方法 这周接了个活儿甲方扔来一张总平面图DWG要求把里面的地块、道路、设备点全部弄成GIS数据后续要做面积统计和空间分析。看起来很简单对吧结果第一步就翻车直接把DWG拖进ArcMap图形是都显示了可属性表一片空白所谓地块全是没闭合的线坐标数值大得离谱面积算出来更是没法看。这就是典型的CAD数据转GIS数据问题——CAD擅长画图GIS擅长管数据两者之间的转换从来不是另存为一下就能解决的事。这篇文章我打算按自己这几年摸爬滚打总结的一套流程来写从CAD数据体检、坐标系处理开始到导入GDB、按图层符号化、线转面再到用空间连接把属性补全最后汇总成一个可以反复用的标准工作流。内容适合刚接触ArcGIS、被CAD转GIS折磨过的同学也适合想系统梳理一遍转换流程的从业者。1. CAD图纸和GIS数据差的不是格式是思维模型1.1 CAD画的是图GIS存的是数据很多人不理解为什么CAD转GIS这么麻烦明明都是点线面ArcGIS也能直接打开DWG啊。问题就出在能打开和能用是两码事。CAD文件里的每个图形实体本质上是几何信息加显示样式这条线是红色的、虚线、宽度0.3那个圆在3号图层、颜色7号。它所有的信息都长在图形上你问它这栋楼的用途是什么CAD答不上来因为它只有一堆线没有字段没有属性表没有拓扑关系。而GIS数据模型从根上就不一样。一个面要素除了几何形状还挂着一行属性记录地块编号、用地性质、面积、权属单位。GIS能做面积统计、按条件查询、空间分析靠的就是几何属性这套结构。类比一下CAD是设计院用来画蓝图的它关心的是这条线画得对不对、好不好看GIS是国土局用来记账的它关心的是这块地是谁的、多大、什么用途。从CAD到GIS本质上不是格式转换而是把图纸语言翻译成数据语言。1.2 不转换直接用的三个坑我在项目里见过不少人图省事直接把DWG当GIS数据加载然后开始做分析结果通常会在三个地方栽跟头第一个是单位坑。建筑施工图普遍用毫米单位而GIS默认是米。如果你直接基于DWG图层量面积一个100平方米的房间会显示成100,000,000平方毫米虽然数值上你除以1,000,000也能得到平方米但一旦参与投影变换、叠加分析单位不一致就会全线崩溃。第二个是几何坑。CAD里看起来是个闭合矩形的地块实际上可能由四条独立线段组成端点之间还有肉眼看不见的缝隙。在CAD里这无所谓打印出来依然是封闭图形。但在GIS里这不叫面面要素必须是一个完整的、闭合的、单一部分的几何对象。第三个是属性坑。CAD图形没有属性表就算有扩展数据XDataArcGIS默认也不读。这意味着你无法按地块编号查询、无法做专题图、无法把业务数据挂接上来。这种数据在GIS项目里基本等于废品。所以别嫌麻烦转换这一步省不掉。2. 转换前先给DWG做体检坐标系、图层与单位2.1 拿到DWG后的第一件事不是打开ArcGIS我的习惯是先在CAD环境里做一次体检。别急着导入先打开图纸敲几个命令UNITS命令查看图形单位确认到底是毫米、厘米还是米用ID命令点几个特征点看坐标范围判断图纸是否有明确的坐标系比如是测量坐标还是施工相对坐标打开图层管理器看图层命名规范不规范有没有大量GWL、DOTE之类的莫名图层按CtrlA全选后查看属性看有没有大量重复图元、散碎文字、多余的填充块。这一套操作花不了五分钟但能帮你判断后面的路怎么走。我遇到过一份DWG单位是毫米坐标系是自定义施工坐标结果甲方还非要和天地图叠加这就是明摆着要先配准、后投影的活儿。如果不在源头搞清楚后面每一步都像蒙着眼走路。2.2 导入GDB而不是直接读DWGArcGIS可以直接读取DWG在Catalog里展开它能看到Annotation、Point、Polyline、Polygon、MultiPatch这几个要素类。但我不建议直接把DWG拖进Map里干活更推荐先导入到地理数据库GDB里转成原生的要素类。原因有三一是直接读取DWG时ArcGIS每访问一次都要解析一遍CAD文件图层一多就卡二是DWG要素类的字段类型和GDB原生要素类不一样比如CAD的Entity、Layer字段在某些操作里会有限制三是拓扑编辑、属性关联、版本管理这些GIS核心操作都必须建立在GDB要素类上。具体操作很简单在ArcToolbox里搜Feature Class to Feature Class输入要素选择DWG下的Polyline或Polygon要素类输出位置选一个GDB指定新的要素类名称如果要全部类型一起转也可以右键DWG文件选择Export但注意点、线、面、注记会分散在不同的要素类里。补充一个兼容性经验如果甲方发来的DWG是CAD 2018以上版本建议先让CAD里另存为2013或2010版本ArcGIS对老版本DWG的兼容性更稳定不然偶尔会出现无法读取或打开失败的诡异问题。2.3 坐标系问题定义投影和投影转换不是一回事CAD图纸导入ArcGIS后默认是未知坐标系。这时候最重要的一步是搞明白这份图纸到底是什么坐标系有两种常见情况图纸已经有明确的坐标系比如测绘单位基于CGCS2000或西安80做的地形图。这时你只需要用定义投影Define Projection工具给要素类标记一个坐标系。注意定义投影只是给数据打一个坐标系标签不会改变坐标数值。图纸是施工相对坐标或地方独立坐标没有任何投影信息。那定义投影也没用因为坐标本身和真实地理空间没有对应关系。这时要先通过已知控制点做地理配准Georeferencing或空间校正Spatial Adjustment把图纸挪到真实的经纬度/投影坐标上再谈其他。很多人混淆定义投影和投影Project这两个工具。我打个比方定义投影相当于给一个人贴了个北京人的标签但他实际站在上海投影变换才相当于真的把他从上海挪到北京。CAD导入GIS时90%的坐标错乱都源于把贴标签当成了挪位置。如果图纸需要配准我的操作路径是在ArcMap里加载DWG的Polyline要素类和已知参照数据比如天地图或已有矢量打开地理配准工具条选至少4个均匀分布的控制点一一点对用一阶多项式校正。控制点越多越均匀越好尤其是图纸边缘否则校正完中间没问题、边缘飘掉就麻烦了。3. 符号化显示把CAD的样式语言翻译成GIS的符号规则3.1 为什么CAD样式导入后会丢CAD转GIS后很多人第一反应是怎么颜色全变了、线型也没了。这不是数据丢了而是显示机制完全不同。CAD的样式是实体自带的每条线的颜色、线型、线宽跟着图形走你选中它属性面板里清清楚楚。而GIS的符号化是规则驱动的一个图层的所有要素默认用一种符号除非你告诉它按字段分类显示。所以导入GDB后所有要素都挤在一个图层里统一变成默认的黄色实线看起来就像样式丢光了。实际上DWG里的颜色值在Color字段里还留着图层名也在Layer字段里只是ArcGIS默认没有按照这些字段去渲染而已。3.2 按Layer字段符号化几分钟恢复八成视觉效果最快的还原方式是按图层符号化打开要素图层的属性切到符号系统选择类别在值字段里选Layer点击添加所有值让ArcGIS把图层里出现过的所有CAD图层名列出来逐个给每个类别设置颜色、线宽或填充样式。这一套下来大部分有条理的CAD图纸能恢复个七八成的视觉辨识度。如果还需要更精细的线型比如虚线、点划线可以从样式库里选或者自定义线型符号。还有个进阶技巧为颜色赋值时尽量选按图片色带之类的配色方案而不是每个都手动挑不然几十个图层点下来手都酸。我一般先按图层显示再用按属性选择把同类型的图元选出来统一调色效率高很多。3.3 文字与注记别让CAD文字变成乱码重叠DWG里的文字在ArcGIS里对应的是Annotation要素类。导入时最大的问题是中文乱码原因是CAD里用了SHX字体比如txt.shx、hztxt.shx而ArcGIS不认识这些字体映射。我的建议分两条路走如果只是出图需要文字干脆把CAD文字导入后当背景关掉显示再用ArcGIS的标注功能重新生成一份。标注样式可控、不重叠、也方便按字段动态更新。如果非得保留CAD原文字内容那就要在CAD端提前处理把SHX字体替换成TrueType字体比如宋体、黑体保存后重新导入。实测下来这个方法能解决大部分乱码问题。文字重叠是另一个常见问题。CAD图纸里文字密密麻麻导入GIS后因为符号比例尺不同挤成一团根本没法看。我一般会先关掉Annotation把核心的地块编号、设备编号用要素转点转成点再用标注功能只显示需要的字段。3.4 我的符号化经验别太迷恋还原在项目里我踩过最大的坑是把大量时间花在让GIS显示效果和CAD一模一样上结果甲方后来要的是按用地性质的专题图而不是彩色的CAD。所以我现在对符号化的态度是够用就行。第一步先按Layer区分出要素类别第二步把和业务相关的字段比如用地代码、道路等级作为分类依据第三步调整透明度、轮廓色、注记字体大小保证打印/截图清晰即可。CAD里那些花花绿绿的装饰性颜色真的没必要一一还原。4. 线转面让看起来是地块变成真的是面要素4.1 闭合线不等于面要素这是CAD转GIS过程里最核心、也最容易卡住的一步。CAD里的地块通常是一圈多段线围起来的视觉上是个闭合多边形但ArcGIS读进来之后它依然是Polyline要素类不是Polygon。哪怕你用肉眼看着它封口了只要在GIS里用要素转面工具跑一遍就会发现生成的面缺一块、碎一块。原因无外乎三种线段端点有微小缝隙、存在多余的重叠线、或者闭合区域的出入口被一条线切断了。只要不是面要素后面所有空间分析都做不了。你不能统计面积不能做空间连接出图也无法按照地块填充颜色。所以线转面是CAD转GIS绕不开的一步。4.2 转面前先处理线闭合、合并、清理直接拿原始DWG的线去转面十有八九会翻车。我的标准操作是先做预处理用要素转线Feature To Line把输入线要素统一转成单部件线这一步能消除一些多重部件线造成的诡异行为用融合Dissolve把所有同级别的线合并成一个要素类字段选择空或选一个统一值这样能把同一条边界上的多段线先串成一条打开编辑器启用捕捉缩放检查闭合点把没接上的端点拖到一起如果线之间有交叉但没有打断用高级编辑工具条里的打断相交线Planarize Lines处理把交点处断开。这套流程走完你再去要素转面Feature To Polygon生成的面就干净得多。注意要素转面位于工具箱的数据管理工具 → 要素下它的原理是基于输入线的拓扑封闭区域构建面只要线之间围出封闭区域就能生成对应的面。4.3 Feature To Polygon 的参数选择与实操打开要素转面工具输入要素选你准备好的线图层输出要素类指定到一个GDB里。剩下的参数里有一个标签要素Label Features这个很多人不知道是干嘛用的。标签要素的作用是当多个封闭区域交织在一起时用一组点来控制哪些区域要生成面。如果你不设置标签要素工具会把所有封闭区域都转成面这在处理道路和地块相交时容易多出一堆不想用的碎片面。设置标签点后只有包含标签点的封闭区域才会生成面。实操里我常把DWG中表示地块编号的文字转成点作为标签要素这样转出来的面正好对应每一个有编号的地块。转完之后第一件事是看属性表里Shape_Area字段检查面积分布是否合理。如果出现大量面积小于0.01平方米的碎面说明原始线的问题没清理干净返回上一步重新处理而不是一个个手动删。4.4 转完后的常见质量问题就算严格走了预处理线转面后依然可能出现两个顽疾碎面Sliver两块相邻面之间因为线不重合产生一条细长的带状面。这种面通常面积很小可以用按属性选择选中所有面积小于阈值的要素批量删除但要注意阈值不能设太大否则把真正的小斑块也删了。属性丢失要素转面生成的只是一个新的面要素类它不会自动继承原始线的属性。也就是说转出来的地块面虽然几何正确但地块编号、用地性质这些信息全没了。这也是为什么下一步需要空间连接来补属性。我自己在实操时还会顺手用拓扑工具建一个规则面要素不能重叠、不能有缝隙。拓扑检查能直接暴露出哪些边界线没对齐。虽然创建拓扑、修复拓扑听着麻烦但对比在Excel里手工核对面积总和这点时间花得值。5. 空间连接给转出的面要素补上户口本5.1 空间连接解决什么问题线转面成功之后面前是一个几何上完美的面图层但属性表清汤寡水。而业务上我们往往需要把原始CAD里的各种标记挂到这些面上地块编号、建筑名称、设备型号、权属单位等等。空间连接Spatial Join干的就是这件事。它根据两个图层的空间位置关系把连接要素的属性写入目标要素的属性表。不需要两个图层之间有共同的字段ID只要离得近、包含在里面、相交就行这在两个数据集之间没有唯一标识时特别有用。工具位置分析工具 → 叠加分析 → 空间连接。5.2 参数怎么选目标要素、连接要素、匹配选项空间连接的关键参数有三个目标要素Target Features、连接要素Join Features、匹配选项Match Option。目标要素你最终要用的那个图层比如线转面生成的地块面。连接要素提供属性的图层比如CAD里的注记点、设备点或者原始的线图层。匹配选项INTERSECT相交、CONTAINS包含、WITHIN在内部、CLOSEST最近等。我遇到最多的场景是把地块编号挂到面上。DWG里地块编号通常是一个文字标注导入后变成Annotation要素类先要素转点转成点然后做空间连接目标要素是地块面连接要素是编号点匹配选项选INTERSECT或CLOSEST。这里有个细节如果编号点刚好落在面边界线上INTERSECT可能匹配不上点与线边界在ArcGIS里虽然也算相交但在某些情况下会有缝所以我一般直接用CLOSEST并设置一个搜索半径比如10米。这样哪怕点有一点点偏差也能挂到最近的地块上。5.3 实操案例把CAD设备编号挂到地块面上拿一个真实项目举例图纸上每个地块里有一个井字的文字注记表示设备井每个井有自己唯一的编号。甲方要求把井编号写进对应地块的属性表。我的操作步骤把DWG里的Annotation导入GDB属性筛选出包含井字的注记用要素转点把注记转成点要素用空间连接目标要素地块面连接要素编号点匹配选项CLOSEST搜索半径5米在字段映射里只保留需要的字段比如编号字段把不需要的字段全删掉避免输出属性表字段太多看不过来执行后输出一个新面图层属性表里多了一列设备编号。跑完别急着收工要用按位置选择或直接查看Join_Count字段检查有多少地块没匹配上、有多少匹配了多个点。没匹配上的多半是编号点刚好在两个地块的交界处需要手动调整或重新选搜索半径。5.4 一对多、多对一和CLOSEST的坑空间连接看着简单用多了就会发现几个经常踩的坑一个面里有多个点比如地块里有多口井如果连接操作选JOIN_ONE_TO_ONE默认只会保留第一条匹配记录其他井的编号就丢了。想保留全部记录要选JOIN_ONE_TO_MANY这样输出面会复制成多行每一行对应一个井。如果只是想统计每个地块里有几个设备不需要知道具体编号那在字段映射里把某字段的合并规则设置为CountArcGIS会自动生成一个数量字段比JOIN_ONE_TO_MANY后再聚合省事得多。CLOSEST匹配在点密度高的区域有误挂风险。比如一排井点紧挨着地块边界又曲折系统可能把井挂到隔壁地块。解决方法是执行后在输出结果里加一个 距离 字段检查或者把搜索半径设小一点。如果搜索半径太小匹配不上宁可先提高半径后面再抽查。6. 从DWG到GIS的标准流水线顺序、效率与避坑汇总6.1 一套经过验证的标准流程上面每步拆开来看都不难但组合在一起的时候很多人会迷失在工具和参数里。我把自己常跑的流程整理成标准流水线新项目直接照做在CAD里用PURGE清理图纸删除多余的图元、图层、块定义另存为低版本DWG2010或2013避免版本兼容问题在ArcCatalog中把DWG的要素类导入GDB点、线、面、注记分别导入根据图纸来源定义投影独立坐标则先地理配准按Layer字段符号化快速检查图纸内容分布合并需要的线图层做要素转线和融合预处理用要素转面生成面要素用空间连接补属性运行拓扑检查重叠和缝隙人工复核面积和属性成果另存为GDB备份再根据需求出图或出数据。这套流程我从第一版做到现在基本没大改过只是工具的版本从ArcMap换到了ArcGIS Pro。6.2 批量化处理模型构建器和ArcPy如果每次都是重复的转换工作建议把流水线固化下来。ArcGIS的模型构建器ModelBuilder可以把要素转面、空间连接、定义投影串成一个模型每次拿到新数据只改输入和输出路径一健跑完。更进一步直接用Python脚本。下面是一段核心流程的简化写法import arcpy gdb rC:\project\data.gdb line gdb r\clean_line polygon gdb r\land_parcel # 要素转面 arcpy.FeatureToPolygon_conversion(line, polygon) # 空间连接把编号点挂到面上 points gdb r\house_number_points output gdb r\land_parcel_with_no arcpy.SpatialJoin_analysis(polygon, points, output, JOIN_ONE_TO_ONE, KEEP_ALL, None, CLOSEST, 5 Meters)这段代码对应前面讲的步骤线下环境里配合arcpy.da还能做批量字段计算和质量检查。对于手上有几十个DWG要处理的场景脚本比手动点工具省出几个小时。6.3 几个容易翻车的细节最后把最容易翻车的几个细节单独再强调一遍每一个我都自己踩过中文路径和中文图层名ArcGIS对中文路径支持得还行但一旦叠加上CAD的编码问题很容易出现图层名显示正常、属性值乱码的情况。我现在的习惯是转进GDB的图层全部重命名成英文或拼音字段名也尽量用英文。空间连接输出的字段截断GDB字段名最长64字符如果连接要素里字段名太长输出时会自动截断导致后续引用找不到字段。所以在字段映射那一步就把不需要的字段删掉别偷懒。面重叠问题线转面时如果原始线存在重叠段转出来的面也会互相重叠。这种问题靠肉眼很难发现用拓扑规则不能重叠一查就现原形。备份习惯线转面是不可逆操作转之前在GDB里把原始线要素复制一份改名_bak别问我是怎么想到这一条的问就是我曾经把一份原始数据转坏了、又找甲方重新要过。CAD转GIS这活儿说难不难说简单也不简单。难就难在它不在任何一本教材的某一章里完整讲过全要靠项目一个个坑填出来。我写这篇的目的也是希望你在拿到DWG时能有一套清晰的路径不用像我当年那样对着要素转面工具发半天的呆。最后再分享一个小技巧如果你不确定一个CAD图层到底该不该转成面先把所有图层按Layer字段符号化然后在ArcMap里来回缩放看一遍。那些图层设计得混乱不堪的图纸符号化之后一眼就能看出来——该合并的合并该扔的扔别让垃圾图层败坏你后面所有分析的质量。
返回列表