摘要:工作中常遇到增减挂钩实施方案项目,在进行系统报备时,需要分地块上传标准格式的txt坐标文件,有时会遇到一个实施方案中涉及上千个地块,需要制作上千个txt坐标文件,会耗费大量时间,本文研究利用ArcPy批量生成报备坐标文件的方法,能使工作效率得到极大的提高。
关键词:ArcGIS;ArcPy;Python;坐标文件
1、概述
增减挂钩项目报备中,坐标文件是一项重要的基础资料,必须按照国土资源部要求的坐标交换格式上报。其模板如下:
[属性描述]
格式版本号=1.01版本
数据产生单位=XX公司
数据产生日期=2018-11-10
坐标系=2000国家大地坐标系
几度分带=3
投影类型=高斯克吕格
计量单位=米
带号=37
精度=0.01
转换参数=0,0,0,0,0,0,0
[地块坐标]
界址点数,地块面积,地块编号,地块名称,面(点、线),图幅号,地块用途,地类编码,@
点号,地块圈号,X坐标,Y坐标
……
点号,地块圈号,X坐标,Y坐标
如果带有挖空的地块,则外圈的圈号为1,挖空的内圈圈号依次为2,3,4……。圈号不能重复。
传统坐标文件生成方式复杂繁琐,当项目中涉及地块越多,浪费的人力、时间越多。在工作中曾碰到过一个增减挂钩项目中涉及拆旧地块上千个的情况,需要制作上千个txt坐标文件,用传统方式会耗费大量的时间,通过ArcGIS,利用Python与ArcPy编写一个批量导出坐标文件的脚本,能极大的提高工作效率。
2、批量生成坐标文件的脚本实现
2.1 ArcPy简介
ArcPy是一个以成功的arcgisscripting模块为基础并继承arcgisscripting功能进而构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。使用Python和ArcPy,可以很方便的通过脚本调用ArcGIS的各种函数和功能,可以直接在ArcMap中使用命令行,也可以创建Python脚本,更能在ArcGIS中通过Python创建脚本工具。Python作为一种高级编程语言,它简单易懂,适合编程基础比较薄弱的人学习,短短几行代码就能实现一个小功能。非常容易入门。
2.2 ArcPy中的面对象
ArcPy中的面对象简单来说是指由一系列相连的 x,y 坐标对定义的闭合形状。具体来说面对象是由一个或多个环对象的有序集合,如果一个多边形内包含空洞,那表示这个多边形包含很多环:一个外环和若干内环。环是定义在二维平面上的闭合路径,路径由一系列点构成,其中起始点和终止点的坐标相同。外环是顺时针定义的路径,内环是逆时针定义的路径,在读取面对象时,外环总是先返回,接着是内环,环之间以一个空的点对象作为分隔符。
2.3 实现批量导出坐标文件
通过分析坐标文件模板文件,很容易看出,对于同一个项目来说,文件头部分是一致的,即[属性描述]至[地块坐标]之间的内容。[地块坐标]之后是一行地块的相关属性信息,接下来才是地块的坐标。那么实现批量导出坐标文件的思路就很清晰了:首先利用ArcPy中的搜索游标和for循环遍历地块图层中的每一个地块;然后利用Python中的open()函数,创建一个以地块编号为名称的txt文件,利用write()函数将坐标文件头内容写入创建的txt文件中;最后利用ArcPy与Python读取地块属性与坐标,并以坐标文件模板的格式写入txt文件中,需要注意的是,ArcGIS中的X、Y坐标与测量坐标的X、Y相反。
期刊文章分类查询,尽在期刊图书馆具体实现如下:
# -*- coding:utf-8 -*-
import ArcPy
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
path = r"E:\try" #指定坐标文件存放的路径
fc = r"E:\try\CJDK.shp" #指定地块范围图层
cursor = ArcPy.da.SearchCursor(fc,["SHAPE@","SHAPE@AREA",
"DKBH","DKMC","TFH"])
for row in cursor:
jzd = 1
filename =path+"\\"+str(row[2])+".txt"
output = open(filename,"w")
output.write("[属性描述]"+'\n')
output.write("格式版本号=1.01版本"+'\n')
output.write("数据产生单位=XX国土资源局"+'\n')
output.write("数据产生日期=2018-11-12"'\n')
output.write("坐标系=2000国家大地坐标系"+'\n')
output.write("几度分带=3"+'\n')
output.write("投影类型=高斯克吕格"+'\n')
output.write("计量单位=米"+'\n')
output.write("带号=37"+'\n')
output.write("精度=0.01"+'\n')
output.write("转换参数=0,0,0,0,0,0,0"+'\n')
output.write("[地块坐标]"+'\n')
output.write(str(row[0].pointCount)+","+
str(round(row[1]/10000,4))+","+row[2]+","+row[3]+
","+u"面"+","+row[4]+",,,@"+'\n')
ringh = 1
for point in row[0].getPart(0):
if point:
output.write("J"+str(jzd)+","+str(ringh)+","+
str(point.Y)+","+str(point.X)+'\n')
else:
ringh += 1
jzd += 1
output.close()
3、结束语
通过此脚本导出某县增减挂钩1700个拆旧地块坐标,一共用时8.36秒。极大的提高了工作效率,降低了人工劳动,且通过脚本导出的坐标文件标准、准确,极大的降低了人工失误。用于其他地区的坐标导出时,只需更改脚本中坐标文件存放路径、地块范围图层、文件头部分内容即可。也可将此脚本在ArcGIS中制作成工具箱,更方便使用。
参考文献:
[1]ArcGIS10.2 帮助文档
[2](美)Paul A.Zandbergen著;李明巨,刘昱君,陶旸,张磊译.面向ArcGIS的Python脚本编程[M].北京:人民邮电出版社,2014:143-150
论文作者:洪紫亮,付妮嘉
论文发表刊物:《基层建设》2019年第5期
论文发表时间:2019/4/30
标签:坐标论文; 地块论文; 文件论文; 脚本论文; 增减论文; 报备论文; 批量论文; 《基层建设》2019年第5期论文;