摘 要:介绍了利用VB脚本、python脚本和ArcGIS的arcpy类库编写的批处理程序,实现对地理数据点转换成面的矢量图层的批量转换,并且对矢量图层进行图层属性的批量操作。极大提高了数据处理效率,降低了重复处理造成数据错误的可能性,并且为以后海洋数据管理中海量数据的批处理功能实现以及数据可视化和空间分析奠定技术基础。
关键词:ArcGIS Python 批量转换 矢量图层
地理数据处理是 G I S用户应用的重要处理部分, ArcGIS的ArcToolBox工具箱[1-2]为GIS用户提供了数百个地理处理功能,这些功能模块在操作界面上只能针对单个数据集处理,而处理数据人员往往需要处理海量的数据。这是就需要用到数据建模功能或者使用脚本语言进行批处理。
数据建模功能,虽然也是批处理手段之一,但是比使用脚本语言来处理批量数据,对数据进行分析,数据转换,格式修改等处理手段来说,数据建模功能显得局限,不灵活。本文选择使用VB脚本处理EXCEL数据[3-4]和 Python语言[5-6]实现地理数据的批处理,可以显著提高工作效率。
本文是将需要处理的海洋类型保护区和滨海湿地的坐标提取出来,整理成ArcGIS的点的格式化文本,并对这些点数据图层转换成为面数据图层[7-8]。
1 VB和python数据处理流程图
本文利用VB脚本和Python脚本语言来批处理数据,首先需要把Excel数据整理成有格式的数据工作表,用VB语言生成批量生成TXT文本,生产的TXT文本是按照ArcGIS 的ArcToolbox工具箱要求文本格式,由于VB生成的TXT文本,产生的空格符不符合格式要求,本文用Python脚本去处理空格符格式问题,处理完成后,生成格式化的TXT文本。最后用Python脚本语言去调用arcpy包的函数,去把一个个坐标点转换成面的数据图层,如果业务需要,还是调用其他arcpy的函数去对图层进行操作,如图1所示。
2 关键代码
2.1 vb处理经纬度坐标
(1)需要将海洋类型保护区和滨海湿地的坐标换成度,按照程序设计,填入表格模板,安装Excel API 函数库,处理数据,将中文名称转为拼音,因为ArcGIS无法识别中文名称文件,导致程序出错。
表格模板如表1,表2所示。
(2)对填入数据的模板进行处理,需要将研究区域的坐标点生成arcgis点转面的文本格式,因此,使用EXCEL中的 VB脚本语言进行处理,脚本语言和生成文本格式,部分关键代码如下:
x1 = Sheets(oldname).Cells(i,3) #获取工作表的经纬度值赋值给变量x1,x2,y1,y2
x2 = Sheets(oldname).Cells(k,3)
y1 = Sheets(oldname).Cells(i,4)
y2 = Sheets(oldname).Cells(k,4)
Worksheets.Add().Name = Sheets(oldname).Cells(i, 2) #获取字段的名字为工作表的名字
shtname = Sheets(oldname).Cells(i, 2)
Sheets(shtname).Cells(1, 1) = "Polygon" #按照 Arcpy要求的文本格式填写
Sheets(shtname).Cells(2, 1) = 0
Sheets(shtname).Cells(2, 2) = 0
Sheets(shtname).Cells(3, 1) = 0
Sheets(shtname).Cells(3, 2) = x1
Sheets(shtname).Cells(3, 3) = y1
Sheets(shtname).Cells(3, 4) = "1.#QNAN"
Sheets(shtname).Cells(3, 5) = "1.#QNAN"
(省略其他重复的代码)
Sheets(shtname).Cells(7, 5) = "END "
ActiveWorkbook.SaveAs Filename:="C:\txt\newdir\" + shtname + ".txt", _
FileFormat:=xlText, CreateBackup:=False #导出TXT 到指定路径,文件名为工作表的名字
(3)使用VB脚本语言生成的文本格式,依然无法直接用于arcpy要求的格式,需要处理文本中的中文空格,将中文空格换成英文空格。这里使用python语言进行数据处理。
for file in files: #遍历文件列表
lines = open(file).readlines() #打开文件,读入每一行
newfile=file+".txt" fp = open(newfile, 'w') #打开处理的txt文件
for s in lines: #读取文件每一行 fp.write(s.replace(' ', ' ')) #对文件中空格字符进行替换
2.2 Python语言关键代码
(1)建立一个fileList=[]数组,把文件夹下面的原始数据文件读入,保存。
for f in files: # 把点文件遍历一次
fileList.append(f) # 把文件添加进入数组fileList
(2)设置输入目录和输出目录,不同调用arcpy中的函数 CreateFeaturesFromTextFile,实现点转化成面的功能。
filename2 = ('龙头湾','练江口','莱芜中国龙虾','莱芜中华白海豚','南澳赤屿','南澳岛','南澳平屿','南澎列岛','江门台山中华白海豚','乌猪岛','镇海湾红树林','雷州湾中华白海豚');
rm = r"C:\txt\newdir\outdir\/"
sm = r"C:\txt\newdir\out2\/"
gp1 = arcgisscripting.create()
#创建地理处理对象
for i in range(0, 12): #遍历点文件
inTxt1 = rm.replace('/', '') + fileList[i]
inSep1 = "."
strms1 = sm.replace('/', '') + filename2[i]
gp1.CreateFeaturesFromTextFile(inTxt1, inSep1, strms1, "#")
#把点转成面的arcpy包函数
(3)对生成的shp点文件,添加字段属性,调用AddField_ management函数,添加字段。
a rc py.Add Field _ ma na gement(fileList[i],"名称 ","TEXT",80) (4)shp文件添加的字段,赋值。获取shp的行游标rows,对row赋值。
for i in range(0,12):
fileList [i] #把文件名赋值到名称字段的值里
rows = arcpy.UpdateCursor("C:/海滨湿地-2017/temp/ test.gdb/"+ fileList [i])
for row in rows:
row.setValue("名称", fileList [i])
rows.updateRow(row)
推荐阅读:编程语言在计算机应用中如何选择
3 结语
地理处理是GIS工作者处理数据的重要部分,简单的地理数据,可以通过GIS工具进行处理,但是复杂的,海量的地理数据,就很难高效的实现,因此结合ArcGIS强大的平台处理能力,丰富的类库处理资源和脚本语言的可编程性,可以使工作通过ArcGIS的批量操作,大大提升制图工作者的工作效率,为制图工作提供更好的准确性。不仅如此,还能掌握并熟悉Python语言操作ArcGIS资源包,为以后制图批处理技术,提供了技术基础。
转载请注明来自:http://www.lunwencheng.com/lunwen/dzi/15269.html