问题在于有弧线段的hatch,弧线段信息是由圆心、半径、两个角度一起组成的,而GIS中没有找到arcpy生成弧线段的方法,所以路径中断了。
然后就是方法2,
读取polyline信息在GIS生成面,
CAD得预先处理一下,把所有的填充面生成一个边界。
有同学会说生成闭合边界之后直接将polygon拉到GIS里就是面了,
对的,只是GIS就是会存在某些读不出来的polygon,所以这里选择用polyline生成面,不管闭合没有,即使开口pl线均可以生成面。
1读取dwg的polyline
dwg文件在GIS的python2.7中是无法直接读取的,需要通过arcpy读取
采用arcpy的da.SearchCursor游标的方式读取折点坐标
代码如下:
import arcpy
def read_cad_pl(cadfile):
cadfile += '\\Polyline'
# 获取所有线
datas = []
with arcpy.da.SearchCursor(cadfile,['SHAPE@JSON','Layer','Color','Linetype','Elevation','lineWt']) as cursor:
for row in cursor:
datas.append(list(row))
datas[-1][0] = eval(datas[-1][0])['paths'][0]
#第一个就是'SHAPE@JSON'形状数据,字符串格式,eval()转成字典,获取里面的坐标点
datas.append([eval(row[0])['paths'][0],row[1],row[2],row[3],row[4],row[5]])
return datas
row里的格式如下
附带说下
pl线从cad到GIS就只带了这几个信息,[‘Layer’,‘Color’,‘Linetype’,‘Elevation’,‘lineWt’]
layer是图层信息,通常就是用地类型
color是CAD色号,哪怕是RGB的颜色,出来也是cad色号,坑爹的
然后还有三个字段可以携带某些信息从cad到GIS里,可以自行定义
2曲线的表达问题
画了一根曲线,这里读取一下的坐标,出现了28个折点,难道GIS储存曲线是靠折线?
3创建面
看代码
#判断路径
def out_path(save_path,newname):
if save_path[-3:] == u'gdb' or save_path[-3:] == u'mdb':
return '%s\\%s'%(save_path,newname)
else:
return '%s\\%s.shp'%(save_path,newname)
#创建空的面文件
def create_polygon(save_path,save_name):
#创建有坐标系的面有两种方式
#读图层坐标系
#cr= arcpy.Describe(layername).spatialReference
#直接指定如 CGCS2000_3_Degree_GK_Zone_40 WKID为 4528
#cr = arcpy.SpatialReference(4528)
#有坐标信息的
#arcpy.CreateFeatureclass_management (save_path, save_name,"POLYGON", "", "","", cr )
arcpy.CreateFeatureclass_management (save_path, save_name,"POLYGON") #无坐标信息的面
#添加字段
fields=[["Layer","TEXT"],["Color","TEXT"],["Linetype","TEXT"],["Elevation","DOUBLE"],["LineWt","SHORT"],["RefName","TEXT"]]
for name,f_type in fields:
arcpy.AddField_management(save_file, name, f_type)#添加字段
cadfile = u'xx\\xx\\xx.dwg'
save_path = u'xx\\xx\\xx.gdb'
save_name = u'name'
#保存路径
save_file = out_path(save_path,save_name)
#读取CAD数据
datas = read_cad_pl(cadfile)
#创建面图层
create_polygon(save_path,save_name)
#坐标列表转换成面几何数据
for i in range(len(datas)):
datas[i][0] = arcpy.Polygon(arcpy.Array([arcpy.Point(*coords) for coords in datas[i][0]]))
#用游标给图层添加数据,比新建面文件再添加数据方便
with arcpy.da.InsertCursor(save_file, ['SHAPE@','Layer','Color','Linetype','Elevation','lineWt','RefName']) as cursor:
for row in datas:
cursor.insertRow(row)
曲线面看着圆滑其实是很多个折线组成
属性表中添加了pl的其他属性