水蚀野外调查单元底图批量制作技术研究
2017-12-27夏照华苏慧敏
夏照华,冯 阳,苏慧敏,丁 聪,王 红
(北京地拓科技发展有限公司,北京 100084)
水蚀野外调查单元底图批量制作技术研究
夏照华,冯 阳,苏慧敏,丁 聪,王 红
(北京地拓科技发展有限公司,北京 100084)
水蚀;调查单元;底图制作;批量制图;ArcGIS;Python
水力侵蚀普查是全国第一次水利普查水土保持情况普查的重要内容之一。野外调查单元是本次水力侵蚀普查抽样调查的基本单元,而调查底图作为野外调查的基础工作底图,在野外调查工作中有着十分重要的作用。本次水力侵蚀普查覆盖范围广,抽样调查单元的数量巨大,制图流程涉及的工序较多,采用传统人工制图较为繁杂,且容易出错。基于 ArcGIS与Python语言,详细介绍了水蚀野外调查单元底图批量制作技术,通过编写批处理脚本程序,自动实现制图模板分发、数据替换、制图输出等流程,极大减轻了制图工作量,对制图的质量保证也起到了一定的作用。
我国是世界上水土流失最严重的国家之一。为了掌握土壤侵蚀的强度及空间分布情况,全面考虑影响土壤侵蚀的因素,定量评价土壤侵蚀量,我国在2010—2012年开展了全国第一次水利普查水土保持情况普查[1-2]。普查中,采用抽样调查的方法来调查水蚀野外调查单元的土壤侵蚀影响因子。水蚀调查单元在平原区一般为1 km×1 km的网格,在丘陵区和山区为0.2~3.0 km2的小流域,全国范围内采用分层不等概系统空间抽样方法布设野外调查单元,共按照4%、1%、0.25%和0.062 5%四种密度抽样,最终在全国布设了32 364个水蚀野外调查单元[3]。按照全国统一要求,由省级普查机构确定调查单元边界,并按照规定格式输出 A4版面大小的野外调查底图,内容包括调查单元所在的行政区及编号、调查单元边界、等高线、经纬网格及标注、比例尺、制图人、填图人、复核人及日期等,同时保存其电子格式文件在规定的目录下,以便后期处理[3]。
本次抽样单元数量巨大,制图流程涉及的工序较多,采用传统人工制图较为繁杂,且容易出错。针对上述问题,张超等[4]运用C#语言、Visual Studio 2008开发工具和 ArcEngine组件式二次开发实现了土壤侵蚀抽样调查单元底图的自动制图,并在川西地区进行了有效性和实用性检验。考虑到全国各省份在实际操作时的差异性,单纯依靠一个工具型软件可能无法全面考虑各方需求,且后期使用者再次扩展时存在难度,因此本研究基于ArcGIS平台,采用Python脚本语言,对批量制图技术中的各工序编写批处理脚本来实现。该脚本语言的扩充性好,要求门槛较低,省级制图人员后期可根据需要灵活扩充。
1 野外调查单元存储形式
按照全国统一要求,水蚀野外调查单元的底图及以底图制作的各类电子数据最终要存储在规定的目录下,便于后期处理。本次普查调查单元及其各类文件采用四级目录的形式进行存储。
一级目录(文件夹)名称以省级行政区划代码前两位命名,一级目录(文件夹)下包含若干个二级目录(文件夹,名称按县级行政区划代码排序)和《土壤侵蚀普查野外调查单元分布地形图图幅号》(省级)、《野外调查单元水土保持措施汇总表》等。
二级目录(文件夹)名称以县级行政区划代码命名(6位县级行政区划代码),二级目录(文件夹)下包含三级目录(文件夹,名称按野外调查单元编号排序)和《土壤侵蚀普查野外调查单元分布地形图图幅号》(县区级)。
三级目录(文件夹)名称以县级行政区划代码+野外调查单元编号(10位调查单元编号)命名,三级目录(文件夹)下包含四级目录(文件夹)。
四级目录(文件夹)中含有两个子文件夹,分别命名为“basic”和“shp”。其中,basic文件夹中含有清绘底图(dt1.pdf)、扫描的野外调查清绘图(qht.jpg,调查后放入)、水蚀野外调查表(调查前空白,调查后填写)和野外调查照片(jpg格式,调查后放入)等。shp文件夹中含有制作清绘底图所需的矢量数据,包括调查单元边界线状图层(bjx、bjxp,其中文件名带“p”的为带投影信息的图层,下同)、调查单元边界面状图层(bjmp)、等高线线状图层(dgx、dgxp)、地块边界线状图层(dkx、dkxp)、地块边界面状图层(dkmp)、清绘底图制图模板(dt1.mxd),以及其他重要参考地物图层,如公路(glp)、居民地(jmdp)、水系(sxp)等。
2 传统调查单元制图流程
野外清绘底图是参考《水力侵蚀野外调查单元制图补充说明》和《水力侵蚀普查数据质量审核工作手册》中的要求制作的,需要保存制图模板文件dt1.mxd。
遥感底图是在清绘底图的基础上,叠加调查单元区域最新遥感数据制作而成的。由于从影像上可以获取居民地、道路、水系、地貌等信息,因此不再叠加等高线、居民地、道路、水系等图层。其余制图要求与清绘底图一致。
2.1 野外调查单元边界数据生成
布设完调查单元后,为确定调查单元的边界(调查单元边界面状图层,bjmp.shp),要进行面转线、投影转换、建立缓冲区等操作,生成等高线边界图层(dgxbj.shp)、调查单元线状边界图层(bjx.shp)等矢量数据。其数据处理的具体步骤和操作方法如下。
(1)将bjmp.shp图层转换为线图层,并命名为bjxp.shp(调查单元边界线状图层)。在ArcToolbox中选择polygon to line工具,在Input Features菜单中选择相应的调查单元边界面状图层文件,在Output Feature Class菜单中选择输出文件名(bjxp.shp)和存储路径,点击OK。
(2)将bjxp.shp转换投影方式,生成bjx.shp文件。在ArcToolbox中选择Data management tools->Projection and transformations->Project,然后在Input Dataset or Features Class菜单中选择输入文件bjxp.shp,在Output Dataset or Features Class中选择输出文件名(bjx.shp)和输出路径,在Output Coordinate System菜单中选择合适的投影方式。
2.2 等高线裁切
(1)建立缓冲区。在ArcToolbox中选择Analysis tools->Proximity->Buffer,再在Input Features菜单中选择bjmp.shp,在Output Feature Class菜单中选择输出文件名(dgxbj.shp)和输出路径。
(2)使用缓冲区dgxbj矢量数据对等高线进行裁切。先在ArcToolbox中选择Analysis tools->Extract->Clip,再在Input Features菜单中选择等高线矢量文件,在Clip Features菜单中选择dgxbj.shp,在Output Feature Class中选择输出文件名(dgxp.shp)和输出路径,点击OK,生成等高线线状图层。
(3)对dgxp矢量数据进行坐标转换,生成dgx矢量数据。
2.3 重要参考地物生成
在ArcGIS中添加公路、水系、居民地等矢量数据图层,根据需要对数据进行选择和导出。
(1)择取范围设定。按照比例尺1∶1万计算,图上1 cm相当于实际中的100 m,图幅宽度为21.0-4.5=16.5(cm),假设调查单元边界的宽度为图幅的1/3,也就是5.5 cm,那么只需要向外扩充5.5 cm就足够了,换算在图上也就是550 m。在这里,我们将择取范围定为600 m,已经可以满足需求了。
(2)数据选取。在图层中添加公路、水系、居民地和等高线边界图层,在工具栏中选择Selection->Select by location,将图层选择框中的公路、水系和居民地图层选中,在条件菜单中选择“are within a distance of”,在对象图层中选择等高线边界图层,将距离设定为600,单位选择“meters”。此时距离调查单元600 m范围内的公路、水系和居民地3个图层的数据都已经被挑选出来,只需要依次将数据导出即可。以公路图层为例,在图层上单击右键,选择Data->Export Data,在弹出的对话框中选择正确的数据存储路径和输出文件名(glp.shp),水系和居民地图层分别存储为sxp.shp、jmdp.shp即可。
2.4 底图模板设置
根据《水力侵蚀野外调查单元制图补充说明》和《水力侵蚀普查数据质量审核工作手册》中的要求,对dt1.pdf进行制作,并保存工程文件dt1.mxd。
(1)编辑图层显示标识,其要求分别为:等高线线状图层(dgxp.shp)选择浅灰色〔Gray 20%,RGB(204,204,204)〕,粗细选择“1磅”;调查单元边界线状图层(bjxp.shp)选择深灰色〔Gray 50%,RGB(130,130,130)〕,粗细选择“1.5磅”;公路图层(glp.shp)选择“Dash 6∶1”,颜色为黑色〔RGB(0,0,0)〕,粗细选择“1.5磅”;水系图层(sxp.shp)选择蓝色实线〔RGB(0,92,230)〕,粗细选择“1.5磅”;居民地图层(jmdp.shp)为面状文件,选择“500 year flood overlay”。
(2)等高线高程标注。等高线要求只标注计曲线的高程,高程标注在等高线上。根据该要求,对等高线线状图层的属性进行了设置。首先,在等高线线状图层的属性表中,添加DGX字段,类型为Float型,并通过运算将高程值赋给DGX字段。其次,右键单击等高线线状图层,选择properties,在弹出的Layer properties对话框中选择“Labels”菜单。再次,将字号设置为10磅,再点击Label Field后面的“Expression”按钮。最后,在弹出的对话框中,勾选Advanced选项框,在函数框中输入等高线函数,完成等高线高程标注。
(3)页面配置。底图幅面为A4。页边距为左边距2.5 cm,右边距2.0 cm,上边距2.5 cm,下边距2.0 cm。标题为宋体,18磅,格式居中,分两行,第一行为省名+县名,第二行为调查单元编号+“野外调查单元”。图幅经纬网格中的经纬度标注,经度一律标注在底部,纬度一律标注在左侧,上部和右侧不标注,字体采用“Arial narrow”,字号为8磅,标注的经纬度“秒”为偶数,并采用偶数间隔。指北针,符号类型采用“ESRI North 2”,符号大小设置为“60”。比例尺,一律为整千倍,大小以调查单元占图幅面积最大化为准。比例尺条,选择“Alternating Scale Bar 1”,总长5 cm,含5个间隔,每个间隔1 cm,数字字体字号采用“Arial 10磅”,同时将单位标签“米”设置为“宋体 10磅”(如果不用中文字体则打印出的图中可能不显示“米”这个单位)。制图人等信息,字体字号为“宋体 10磅”,“:”为中文标点,下划线为“_”,长度为20个空格,间距2个空格,“填图人”和“复核人”另起两行(注:如果采用横向模板,则下划线为37个空格,其他设置相同)。
(4)调查底图模板保存。为了方便后期大量作图,需要将模板工程文件的存储方式变更为相对路径存储。这样可以直接将dt1.mxd复制到其他调查单元文件夹中,不用再进行页面的配置,减少工作量和重复工作造成的误差。检查图幅中页面配置、图层显示、标题名称等信息无误后,将该工程文件保存到basic文件夹下。
2.5 底图输出
将工程文件输出为jpg与pdf格式,为了保证打印时比例尺不发生变化,实际打印时采用pdf格式的文件进行打印。
3 批量制图技术
传统调查单元制图流程从技术上没有任何难度,但涉及工序较多,且大多数属于重复工序,一旦调查单元的数量较多,采用传统工作流程会消耗大量的人力,且长时间从事此类简单枯燥的工作,作业人员容易疲倦,也不容易保证质量。因此,基于传统制图流程,充分应用 ArcGIS 平台功能,在相关环节引入批量处理方法,可提高工作效率,保证制图质量。
3.1 数据批量准备
在传统制图流程中,需要对野外调查单元边界、等高线及部分重要参考地物进行裁剪、选择等操作,以便准备好底图制作所需的相关文件。数据准备工作涉及的操作相对简单,但重复性较大,因此可以编写Python批处理脚本来进行处理。下面以裁剪等高线为例,介绍数据批量准备类脚本的实现,其余图层参照扩展即可。
一般来说,等高线数据存放于一个图层中,而调查单元边界为多个图层(每个调查单元边界单独为一个图层),所有调查单元边界图层统一存放于“调查单元”文件夹中。为避免出错,在数据准备时,相关成果以调查单元编号命名,统一存放于单独的文件夹中,后期通过数据分发脚本分发到四级目录中。具体实现步骤为:
(1)导入Python脚本语言需要的相关模块,如 sys、os及 ArcGIS 相关模块等;
(2)设置输入输出变量,用于存放输入数据与输出数据所在的文件夹;
(3)通过ArcGIS 中的ListFeatureClasses()循环列出调查单元文件夹下的每个调查单元的边界,依次调用Clip_analysis()函数,循环用每一个调查单元边界裁剪等高线。
具体程序见图1。
图1 数据批量准备程序示意
3.2 数据批量分发
数据准备过程中的等高线、公路、铁路、居民地图层等 GIS 数据以调查单元为单位,每个调查单元的数据为一个图层,图层以数据集类型+调查单元编号的形式命名。为便于制图,需按要求将相关数据分发到对应调查单元的 shp 文件夹中,同时将文件名修改为数据集的名称,如所有等高线图层在 shp 文件夹下均为dgxp.shp。具体程序见图2。具体实现流程如下:
(1)导入程序所需相关模块,设置文件夹所在的根目录,设置到一级目录即可,设置需要分发的数据集所在的文件夹;
(2)使用ListFeatureClasses()获取待分发数据集文件夹下的每一个图层,通过图层名称解析出调查单元编号、所在县代码,构造对应调查单元的详细路径;
图2 数据批量分发程序示意
(3)通过gp.exists()函数判断原四级目录下是否存在对应的数据集,若存在,则需要使用gp.delete_mamagement()函数删除;
(4)使用 gp.copy_management()函数将数据集复制到对应四级目录,复制文件的同时对数据集名称进行修改。
3.3 批量分发制图模板
由于四级目录中不同调查单元各类图层的名称均相同,因此只需要将底图制作所需的制图模板文件分发到四级目录中,制图模板打开时会自动调用对应的图层。由于模板采用的是相对路径,因此只需要通过程序更换路径、修改图名等基本信息即可。考虑到调查单元的大小不同,同样幅面对应的比例尺也不同。由于本次普查选定的调查单元的大小控制在3 km2以内,因此一般对于省级范围的制图可预先估算当地调查单元涉及的比例尺,可以准备1∶4 000,1∶5 000,…,1∶10 000等一系列比例尺的模板。具体程序见图3。具体实现思路如下:
图3 制图模板批量分发程序示意
(1)通过os.walk()函数遍历普查数据存放目录,查找到每个调查单元四级目录下的 basic 文件夹;
(2)使用 shutil.copy()复制底图模板到 basic文件夹;
(3)使用mxd.replaceWorkspaces()函数替换底图模板的相对路径,查找模板中的 bjxp 图层,并选中该图层;
(4)通过zoomToSelectedFeatures()函数放大到选中图层,计算当前合适的比例尺,比例尺一般为1 000的整数倍;
(5)根据初步计算的底图比例尺,从调查单元模板库中复制对应比例尺的模板到调查单元四级目录下的basic文件夹;
(6)使用arcpy.mapping.ListDataFrames()获取模板中的 Frame 对象,查找到 bjxp 图层,使用panToExtent()将图层平移到当前图幅中间位置;
(7)使用ListLayoutElements()查找模板中的图名对象,更改对象的 text 属性,从而完成底图名称的修改;
(8)使用mxd.save()函数对工程文件进行保存,完成模板的批量分发与信息更新。
3.4 底图输出
模板文件配置好后,需要将底图输出成pdf格式便于打印,输出结果可先存放在统一的文件夹中,后期再集中分发到四级目录中。底图输出过程首先通过os.walk()函数遍历普查数据存放目录,查找到 dt1.mxd 文件,然后使用arcpy.mapping.ExportToPDF()函数批量输出为pdf格式的文件,便于打印输出。
4 结 论
基于ArcGIS 平台与 Python脚本语言,与传统调查单元底图制作流程相结合,可以实现批量制图,大量节省重复工作时间,提高工作效率。此方法适用于大批量的野外调查单元底图制图。利用批量制图技术制作的调查单元底图质量要求与传统方法相同,但在规范性、一致性等方面均优于传统人工方法,在数据准备与数据分发环节通过批处理脚本实现,能大大提高处理环节的准确性,避免人工处理过程中因疏忽造成的错放、漏放等问题。
[1] 国务院第一次全国水利普查领导小组办公室.第一次全国水利普查总体方案[M].北京:中国水利水电出版社,2010:1-3.
[2] 李智广,符素华,刘宝元.我国水力侵蚀抽样调查方法[J].中国水土保持科学,2012,10(1):77-81.
[3] 刘宝元,郭索彦,李智广,等.中国水利侵蚀抽样调查[J].中国水土保持,2013(10):26-34.
[4] 张超,陶和平,高攀,等.基于 ArcEngine的土壤侵蚀抽样调查单元的底图制作[J].水土保持通报,2013,33(4):257-259.
S157;TP79
A
1000-0941(2017)12-0037-04
夏照华(1982—),男,湖北天门市人,工程师,硕士,研究方向为水土保持遥感监测与信息化。
2017-06-27
(责任编辑 李杨杨)