01利用Arcpy进行CAD转shp面文件的批处理

2018-10-26

背景

拿到的原始数据是由CAD导出的用地边线文件,边线带有用地属性信息(存在“Layer”这个字段下),需要将该文件转换为shp面文件。由于有不少这样的CAD文件,因此采用Arcpy进行批处理,减少重复劳动。

目标

将从CAD导出的用地边线的文件,转为shp面图层,并且每个地块带有用地属性信息。以上步骤均通过调用各种Arcpy函数,批量完成。最后将代码打包成工具箱(toolbox),方便以后使用。

大致思路

  • 利用ArcGIS里面的Split By Attributes这个工具,将CAD文件按照Layer字段导出成不同线图层,每个图层将以它Layer属性里的值命名,比如“A1边框”;
  • 通过FeatureToPolygon_management这个函数将转出的线图层转为面图层,并添加Layer字段,填入对应的用地类型值;
  • 最后将所有的用地类型的面图层进行合并,完整代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import sys 
reload(sys)
sys.setdefaultencoding("utf-8")

import os
import arcpy
from arcpy import env

def mkdir(path):
folder = os.path.exists(path)
if not folder:
os.makedirs(path)

inputfile = arcpy.GetParameterAsText(0)
outputfile = arcpy.GetParameterAsText(1)

LinesOutputFile = outputfile+"\\Lines"
mkdir(LinesOutputFile)
LayerOutputFile = outputfile+"\\Layers"
mkdir(LayerOutputFile)

#按Layer这个字段提取cad文件,并转换为shp
fields = ['Layer']
arcpy.SplitByAttributes_analysis(inputfile, LinesOutputFile, fields)

env.workspace = LinesOutputFile
fcList = arcpy.ListFeatureClasses()
# Copy each file with a .csv extension to a dBASE file
for shapefile in fcList:
shp_name = os.path.splitext(shapefile)[0]
extended_name=shp_name[:-2]

outFeatureClass = os.path.join(LayerOutputFile,shapefile.strip())

#线转面
arcpy.FeatureToPolygon_management(shapefile, outFeatureClass,"", "NO_ATTRIBUTES","")
#添加Layer字段
arcpy.AddField_management(outFeatureClass+".shp", "Layer", "TEXT")
#计算字段
arcpy.CalculateField_management(outFeatureClass+".shp", "Layer", "\""+extended_name+"\"")

Layers = []
env.workspace = LayerOutputFile
LayerList = arcpy.ListFeatureClasses()
for Layershp in LayerList:
Layers.append(Layershp)

#合并所有的面文件
arcpy.Merge_management(Layers, outputfile+"\\merge")


在ArcGIS里面的Python脚本跟纯的Python还是有点区别,特别是在对字符的操作上,要在已有的字符变量基础上,再加上一层引号。比如,在计算字段函数这里(CalculateField_management),由于最后填入字段的值是字符类型(TEXT),因此在此基础上又加了一层引号(注意引号的转义)。