简介:面向CAD与SHP数据互转的带属性转换插件,专为需要在CAD2008环境下完成图形与Shapefile双向转换的测绘、规划及GIS技术人员设计。无需安装其他运行环境,通过XDATA、XDATAEDIT、LOADSHP、EXPSHP四条命令即可实现CAD图形扩展属性的查看、编辑以及SHP数据的导入导出,解决传统转换中属性容易丢失的痛点。压缩包共12个文件,以7个dll动态库为核心,配以3个xml配置文件、1个pdb调试文件及1个txt使用说明,整体仅877KB,轻量易部署。目前已有4522人学习下载,适合具备一定CAD与GIS基础、希望提升数据处理效率的读者使用。借助附带的命令说明与依赖组件,用户可直接在CAD2008中加载插件,按需完成带属性数据转换与校验。
1. CAD转SHP,最怕的是“图转对了,属性却是空的”
干GIS入库的人基本都有过这种经历:外协单位交来一版DWG,图面上清清楚楚标着地块编号、权属单位、地类代码,可拿默认转换工具转成SHP后,几何图形倒是分毫不差,打开属性表一查,字段全是空值,只剩图形干巴巴躺在坐标里。CAD图纸里的文字信息,对CAD软件来说只是给人看的注记,对GIS来说却是入库必需的属性字段,这两者之间没有自动桥接。这个CAD转SHP(带属性)插件.zip,解决的就是“图形保得住、属性留不下来”这个断点问题。它适合测绘、规划、市政行业里常年面对DWG存量数据的从业者,也适合正在批量整理CAD图纸建GIS库的作业组。下面从转换原理、安装步骤、参数调法、踩坑记录一直写到收工验收,整体走一遍。
2. 为什么默认转换会丢属性:CAD三类信息载体与GIS属性表的错位
2.1 CAD图纸里的属性信息,通常分布在三个地方
CAD和GIS最底层的思维差异是什么?CAD没有严格意义上的“属性表”概念,图纸上的编号、名称、代码,都是以图形方式依附在图面上的。具体到一份DWG,你会发现属性信息其实藏在三类完全不同的载体里。
第一类是纯文字注记(TEXT和MTEXT)。最常见。规划图上每个地块中间飘着一行“A-03-12”,这类文字没有任何绑定关系,它只是打印时显示在某个坐标点上的字符。对CAD而言这完全正常,因为在设计阶段它就是给人看的,属性归属性,显示归显示,两者互不干扰。
第二类是块属性(ATTRIB和ATTDEF)。带属性的块在CAD里算是“结构化程度”比较高的载体,块内部可以预定义多个键值字段。比如界址点块里可以定义“点号”“等级”“X坐标”“Y坐标”,每次插入块时填写对应值。块属性自带字段名,理论上最容易转换,但默认转换工具照样不读。
第三类是扩展数据(XData / Extended Entity Data)。这类数据藏得更深,要通过注册应用名才能访问。一些做过GIS接口开发的单位,会把要素代码、图幅号、甚至权属单位名称全部写进XData,普通转换工具连看都不看一眼。
我拆这个插件时做的第一件事,就是把这三种载体分别做了测试样例。测试结果很直观:默认转换工具对注记的处理是生成独立注记类,对块属性的处理是拆成一条条散装键值记录,对扩展数据则是完全忽略。三个样例测试下来,属性表里能用的字段,一个都没有。
2.2 三个错位,解释了为什么转换出来的属性表是空的
错位一:注记没有字段位置。TEXT文字在CAD里只是一段显示字符,不具有“字段名”这个属性。ArcGIS自带的CAD转地理数据库工具,会把注记归入独立的注记类或点要素类,而不是把它当作某个地块的属性。从SHP的角度看,就是属性表里多了一堆没有文本关联的空几何对象。
错位二:块属性被拆成散装记录。默认转换会识别带属性的块,但它把每个属性键值拆成了单独一条记录,相当于一个块产生好几行,和几何要素还是松耦合关系。想在SHP里恢复“每个点一行、每个属性占一列”的结构,还得自己写代码去关联。
错位三:扩展数据根本不进属性表。XData在CAD中是为二次开发预留的存储空间,GIS默认转换只读公开展示的图形,XData里的关键信息,在这次转换里等于不存在。
这三个错位合起来,就是你拿到“图形对、属性空”成果的全部原因。这不是某一家软件的问题,而是CAD与GIS底层数据模型不同。默认转换工具做的是几何翻译,不是属性对话。
2.3 插件解决思路:三步解析、一层映射
这个插件的设计逻辑,把“带属性”拆成了三个可执行步骤。
第一步是实体分类。对DWG里的每一个实体,先判断它的几何类型(点、线、面),并记录实体句柄(Handle)、图层名、坐标范围。实体句柄是CAD里每个实体的唯一ID,后续做属性关联全靠它,相当于人的身份证号。
第二步是属性读取。按配置好的“属性来源”去抓数据。来源是注记时,用空间位置匹配,在指定图层里找坐标最接近的文字;来源是块属性时,用实体句柄反向查块引用,把ATTRIB键值集合全部读出来;来源是扩展数据时,按注册应用名加键名,从XData里取值。这里要注意,匹配半径、图层名、实体句柄三者要配合使用,缺一个都容易错配。
第三步是字段映射。把抓到的文本按映射规则写到目标SHP字段。映射规则是一行一条,比如“地块编号 ← 图层'地号注记'的文字内容”。映射表可以导出成配置文件,下一份图纸如果图层命名一致,直接复用,不用重配。
我实际用下来的感受是:图纸规矩的时候,整个转换就是配置一次、反复使用;图纸混乱的时候,属性读取阶段就是用来磨耐心的,比如文字放在边界外面、文字被压盖、图层命名有空格,这些细节会在第4章逐条展开说。
3. 加载插件并跑通带属性转换:工具箱安装、参数设置、结果检查
3.1 环境准备与工具箱加载
这个插件的运行环境是ArcGIS,我在ArcMap 10.8和ArcGIS Pro 2.9两套环境里都跑过,没有遇到版本兼容问题。解压插件压缩包后,会看到三个内容:一个是工具箱文件(.tbx或.atbx),一个是说明文档,还有几个示例DWG和样例映射表。安装不复杂,核心就是把工具箱路径交给ArcGIS。
在ArcMap里的操作是:打开目录面板,右键“连接到文件夹”,指向插件解压目录,连接成功后展开工具箱,就能看到“CAD带属性转换”工具组,里面包含转换主工具和几个辅助脚本工具。
在ArcGIS Pro里是:插入菜单下选择“工具箱”,直接选中那个.atbx文件,工具就会出现在目录中。需要注意的是,如果插件的Python脚本依赖第三方库,ArcGIS自带的Python环境一般已经包含,不需要额外安装;但如果运行时报错提示缺模块,先看脚本头部的import列表,再去对应Python环境里排查。
提示:装了ArcGIS Pro 3.x之后再接旧版.tbx,工具能显示但运行可能报错。碰到这种情况,优先用Pro自带的Python重写一次脚本入口,或者直接改用.atbx版本。
3.2 工具参数详解
主工具面板上大约有七个参数,每一个都直接影响转换结果。我把它们整理成一张表,省得翻说明书。
| 参数名 | 类型/取值 | 说明 |
|---|---|---|
| 输入CAD文件 | DWG/DXF路径 | 只支持单个文件,批量转换走辅助脚本 |
| 输出要素类 | SHP路径或要素类路径 | 建议先输出到文件地理数据库,再导出SHP |
| 几何类型 | 点/线/面 | 按需要选一种,全部转会把图形结构弄乱 |
| 图层过滤 | 逗号分隔的CAD图层名 | 只处理指定图层实体,能大幅减少干扰匹配 |
| 属性来源 | 注记/块属性/扩展数据/全部 | 对应第2章讲的三类信息载体 |
| 匹配半径 | 数字,单位同地图单位 | 注记匹配时检索附近文字的半径,一般0.1到2米 |
| 映射规则文件 | CSV/TXT | 关键文件,说明哪个来源字段写到哪个目标字段 |
映射规则文件的结构一般长这样,和插件自带的模板保持一致:
source_layer,source_attr,source_type,target_field 地号注记,IGNORED,TEXT,地块编号 界址点块,点号,ATTRIB,界址点号 图幅信息,_ENTITYID,XDATA,源实体ID每一行代表一条映射:第一列是CAD里的图层名,第二列是CAD侧的属性名(注记类型时忽略该列),第三列是属性来源类型,第四列是SHP侧的目标字段名。写文件时用英文逗号分隔,目标字段名不要用数字开头,尽量用英文字母或下划线,避免后面的计算和关联操作踩坑。
3.3 第一次转换实操:从DWG到带属性SHP
实际执行时,我习惯分两步走:先在ArcToolbox里跑一次图形转换预检,再跑插件的正式转换。这样能快速区分问题是出在几何侧还是属性解析侧。
用脚本调用的方式可以这么写,方便把参数留档:
import arcpy # 加载插件工具箱,路径换成你解压后的实际位置 toolbox_path = r"D:\tools\CAD转SHP带属性.tbx" arcpy.ImportToolbox(toolbox_path) # 调用转换主工具,七个参数按顺序填写 result = arcpy.CAD_With_Attributes( in_cad_file=r"D:\data\咬合版_地块.dwg", # 输入DWG out_shp=r"D:\out\地块.shp", # 输出SHP geom_type="POLYGON", # 只转面要素 layer_filter="地块边界,地号注记", # 图层白名单 attr_source="ANNOTATION", # 读取注记属性 match_radius="1.5", # 匹配半径1.5米 mapping_file=r"D:\conf\mapping_land.csv" # 映射规则文件 ) # 打印运行状态,检查工具是否正常执行完 print(result.getOutput(0))这段脚本的意图是:只把“地块边界”和“地号注记”两个图层放进转换范围,几何类型限定为面,属性读取通道选注记,然后在离边界1.5米的范围内找文字,把文字内容写入输出SHP的字段。
参数里最需要调试的是match_radius。这个值设太大会把隔壁地块的编号错配到当前地块上,设太小则大量字段为空。我的习惯是先取0.5米试跑,统计字段非空率,低于80%就按0.5米步长往上加,直到非空率不再明显上涨。第一次跑完后,打开SHP属性表看“地块编号”字段有没有值,再随机点两个地块核对编号是否落在对应地块内部。这两步没问题,转换链路就算通了。
4. 避坑/常见问题:属性转换翻车的五个典型场景与对应解法
4.1 现象一:转换后属性字段全是空的
现象:SHP几何图形完整,但“地块编号”字段全为NULL或空字符串。
原因:最常见有三种。一是图层过滤设置里漏掉了注记所在图层,注记实体根本没进匹配范围;二是匹配半径太小,文字离边界超过检索范围;三是映射文件里的source_layer写错了,比如图上明明叫“DZ_LAND”,你写的是“地号注记”。
解决:先在CAD里用图层列表命令确认注记文字的实际图层名,把准确图层名填进过滤参数。匹配半径按0.5米步长递增测试,加到5米还全空,基本判定是映射源图层名或source_type写错。这种时候不要再加半径,半径过大会出现全图错配,非空率上去了,但属性内容全是隔壁地块的。
4.2 现象二:中文注记转换出来是乱码
现象:属性表里看到“锟斤拷”或“鍦板潡”一类乱码,英文和数字正常。
原因:CAD图档的字符编码大多为GBK/ANSI,和ArcGIS当前代码页不一致。MTEXT多行文字内部还会包含编辑器控制符,解析时会混入不可见字符。
解决:分两层处理。第一层是读取阶段,在插件的属性解析脚本里把解码方式改成GBK,不要用默认的Unicode,具体看说明文档里有没有提供编码配置项,没有的话就要改脚本里的decode行。第二层更省事:转换前在CAD里用“分解”命令把MTEXT炸成单行TEXT,保存后再转换,插件读到的就是干净纯文本,不会再混入控制符。
4.3 现象三:一个多边形被转出多个重复要素
现象:SHP里出现大量完全重叠、坐标几乎相同的多边形,要素个数比原图纸的地块数量多出好几倍。
原因:CAD图里经常存在多图层叠加的情况,比如“道路红线”和“地块线”在同一个位置重合;还有一个常见来源是,同一个实体被手动复制后堆在同一坐标上,CAD里肉眼看不出来,转换后就全部暴露出来了。
解决:转换参数里带“去重开关”,按实体句柄加坐标范围双重去重。如果去重后仍然有重复,就在转换前到CAD里执行一次OVERKILL命令,清理重复实体。转换完成后还能用SHP的“删除相同项”功能兜底一次。我处理过的一版图,去重后要素数量从1600多个降到了920多个,差的那些全是重复堆积。
4.4 现象四:块属性的值分离成独立点,合不进要素属性
现象:界址点属性转换后变成了一个个独立点要素,属性表里每行只有一个键值,你要的是一行一个界址点、每个属性占一列。
原因:默认转换工具分不清“块的引用”和“块内部的属性”,它把每个属性键单独生成了记录。要恢复行级结构,需要把同一个块引用下的所有属性合并。
解决:在插件的属性读取参数里选择“按块引用合并属性”,插件会把同一个块引用下的所有ATTRIB合并为一行,再对应到输出SHP的一个要素行。如果插件版本不支持这个选项,备选方案是转换后手动做关联,用块插入点坐标做连接键。从效率角度,我强烈建议下载前先确认版本,能支持块引用合并的才是完整版。
4.5 现象五:面积字段算出来全是0
现象:SHP里用“计算几何”加面积字段后,发现值全是0,或者数值异常偏小。
原因:CAD里的“地块边界”多段线,在CAD里看着是封闭的,实际上首尾点并没有真正闭合,只是视觉上重合。ArcGIS判定面要素依赖闭合线和节点,不闭合就认成退化面或线,面积自然算不出。
解决:转换配置里勾选“实体闭合补全”,插件会把首尾端点距离小于匹配半径的线自动闭合。转换后还要用ArcToolbox里的“修复几何”工具再跑一遍,清理多部件和空几何问题。我经手的一版图中,约8%的边界线不闭合,修复后面积字段才恢复正常。如果你转换后面积还是有问题,先检查输出要素类的几何类型是不是真成了面,有时候转出来是线,面积字段当然没有意义。
5. 把转换标准化:映射规则复用、批量处理与逻辑校验
5.1 把映射规则做成配置文件,减少重复劳动
跑过几个项目就会发现,很多映射规则是重复的。给管线入库时,“管径”“材质”“埋深”永远来自那几个固定图层;做地类图斑时,“地类编码”“权属单位”也总在同一批图层里。这时候把一套映射CSV保存下来,下一个项目只要图层命名规则一致,直接换路径就能跑,不用在面板里重新点一遍。
我电脑里长期维护三个模板:管线模板、地类模板、控制点模板。每次拿到新图,先花两分钟看DWG里实际图层名,再只微调图层过滤参数,映射文件基本不动。这样处理下来,一个100多张DWG的项目,转换阶段的效率可以拉满。
映射规则最容易出问题的地方是source_layer的命名精确匹配。某个项目里,两个注记图层名字从外观上看一模一样,其中一个在末尾带了个空格,结果整个图层一个文字都没匹配上。排查了很久才发现是这个原因。所以拿到新图,先看图层的原始名称,用带引号的精确名填进CSV。
5.2 多个DWG的批量转换:用脚本循环
批量转换是这个插件最实用的场景。方式是在ArcGIS Pro的Python窗口里写循环,遍历文件夹下所有DWG,逐个调用工具。
import arcpy, os folder = r"D:\data\dwg_all" out_gdb = r"D:\data\out.gdb" mapping_template = r"D:\conf\template_land.csv" # 允许覆盖已有输出,防止二次运行时被跳过 arcpy.env.overwriteOutput = True for name in os.listdir(folder): if not name.lower().endswith(".dwg"): continue cad_path = os.path.join(folder, name) out_fc = os.path.join(out_gdb, os.path.splitext(name)[0]) # 同一映射模板、同一个图层白名单复用 arcpy.CAD_With_Attributes( in_cad_file=cad_path, out_shp=out_fc, geom_type="POLYGON", layer_filter="地块边界,地号注记", attr_source="ANNOTATION", match_radius="1", mapping_file=mapping_template ) print(f"完成 {name} -> {out_fc}")批量跑的时候,少数文件会异常报错,常见提示是某图层找不到实体,或者输出路径冲突。循环里设置overwriteOutput为True能避免同名跳过;输出文件名我习惯加上日期后缀,避免第二次大批量时覆盖前一天的成果。这里有个真实的教训,某项目连续跑了两天批量转换,脚本第二天循环时把第一天的结果全覆盖了,又重新花了一天才补回来。
5.3 转换完的SHP还要过一次逻辑校验
转换完成不等于可以直接入库。我强烈建议单独预留一个校验步骤,重点看两件事。
第一件是要素数量统计。打开SHP属性表,记录要素类数量,和CAD里实体列表的数量做对比。差异超过15%就要细分是漏转换还是多余重复。如果CAD文件里有大量被冻结或关闭的图层,默认转换会漏掉这些实体,而插件如果不做图层过滤也只会处理可见实体。这种情况我会在转换前先执行一次“全部解冻并打开所有图层”。
第二件是字段合规检查。运行一段小脚本,统计每个字段的非空率和值域,特别关注编号字段和面积字段:
import arcpy fc = r"D:\data\out.gdb\地块" fields = ["地块编号", "地类代码"] with arcpy.da.SearchCursor(fc, fields) as cursor: total = 0 non_null = 0 for row in cursor: total += 1 if row[0] and str(row[0]).strip(): non_null += 1 print(f"地块编号非空率: {non_null}/{total}") total, non_null = 0, 0非空率是个快速预警,真正的风险在“错配”,就是文字内容和所在的地块对不上。这个只能靠抽样人工判断,具体抽查流程在第6章展开。另外,字段类型也要提前看,地类代码如果转出来是文本型,要确保没有空格或全角字符混入,否则后续做连接关联时怎么都连不上。
5.4 和通用ETL工具的分工定位
有人会问,FME这类通用ETL工具不是也能做吗?确实能,FME做CAD到SHP的转换非常灵活,尤其是复杂映射和多格式互转优势明显。但这个插件在两点上更省心:一是它直接在ArcGIS环境内运行,产物直接进地理数据库,不用单独搭建转换工程;二是它针对国内常见图纸做了处理,比如GMTEXT的编码修复、块引用合并、不闭合线补全,这些在通用工具里都要自己攒流程。反过来,如果你面对的是极度混乱的图纸,属性来源东一块西一块,FME的可视化映射更直观,可以项目里两者配合,不要互踩。
6. 收工前给SHP做体检:三招验证成果再入库
转换了一批SHP之后,在正式入库前,我至少会做三件验证。每件都是从实际项目里踩坑踩出来的。
第一招是坐标点位抽查。在CAD里打开原始图纸,随机选中三个实体,记下坐标值;再到ArcGIS里用“定位”工具或通过“源实体ID”字段反查对应SHP要素,对比坐标。差异超过0.001,说明坐标变换环节可能没配好。之前某项目就出过一次转换后整体平移几十米的情况,原因不是插件问题,而是DWG本身在CAD里做过旋转,没有在转换配置里做坐标修正。
第二招是属性非空率加极值复核。和第5章的脚本一样,统计每个字段的非空率和数值极值。面积字段出现负数或超大数值,大概率是几何退化导致的计算异常,直接删掉重转。编号字段出现连续空白,优先检查图层过滤和匹配半径。
第三招是实地字段抽查。随机选20个地块,逐个把SHP属性表里的编号和CAD原图上的注记文字比对一遍。这不是复杂操作,但要真的做。有一次抽查发现错配率超过10%,回去检查就是匹配半径设太大,把相邻地块的编号抓进来了,调小半径重新转换后恢复正常。从那以后我每次转完CAD,都强制自己走完这三步才敢说“可以入库”。步骤很老套,但每一条都是真金白银换来的省事经验。希望这个插件和这套流程能帮到你。
本文还有配套的精品资源,点击获取