基于Python的ArcGIS林业专题图批量生成方法

2018-04-14 03:20杨明星徐天蜀施锐平岳彩荣
中南林业调查规划 2018年4期
关键词:格网批量天然林

杨明星,徐天蜀,施锐平,岳彩荣

(1.西南林业大学 林学院,昆明650224; 2.屏边县林业局,云南 屏边661200)

引言

在林业建设中,经常需要批量生成林相图、森林资源分布图、林地征占用图等林业专题图,以便直观的显示森林面积、林种、龄级等多项林分因子的空间分布状况,体现规划设计的思想,它们是林业生产、科研和经营管理不可或缺的基础资料,也是各类森林资源调查、林业规划设计成果的重要图面材料[1-2]。ArcGIS提供了丰富的地理处理工具,经常用于林业专题图的生产制作。有时由于工作需要,一次要制作成百上千幅的林业专题图,如何借助ArcGIS软件,实现批量生产,对于从事GIS和林业工作的相关工作者而言,具有重要意义。本文以天然林停伐保护实施方案专题图制作为例,介绍基于Python语言来批量生成林地专题图的方法。

1 Python和Arcpy简介

1.1 Python

Python是1989年由荷兰人Guido van Rossum开发的,1991年发布第一版Python,现在已经发展到3.7版本。目前,Python开源社区具有大量活跃的用户,一起参与到Python的维护与发展之中。Python是一种具有:简单易学、免费开源、可移植性,以及跨平台、可扩展、面向对象等特点的解释性程序语言,凭借其独有特点日渐成为程序设计领域时下最流行的编程语言[3]。据IEEE Spectrum杂志发布的2018年年度顶级编程语言交互排行榜,Python高居首位,连续两年位于榜单榜首。随着人工智能、大数据等领域的崛起,Python会更加的火爆。

1.2 ArcPy

Python的诸多特点也促使它被选择作为ArcGIS主要支持的脚本语言,在ArcGIS地理处理框架中占据重要地位,与ArcGIS平台达到了完美的融合与集成,用它来编写脚本程序将大大提升数据处理效率,更好的解决批量生产、实现地理处理自动化[4]。Python具有丰富的库和站点包,用于开展不同的工作。ArcGIS自从9.0版本后,集成了基于Python语言的ArcPy模块包,它提供了大量类和函数,支持栅格数值计算和几何图形编辑,以简洁高效的方式实现地理数据管理、转换、分析和地图自动化创建等地理数据处理功能。利用ArcPy可调用地理处理工具以及其他函数、类和模块,从而创建简单或复杂空间数据处理工具[5]。

ArcPy由数据访问模块(arcpy.da)、制图模块(arcpy.mapping)、网络分析模块(arcpy.na)及空间分析模块(arcpy.sa)等一系列模块支持,几乎可以完成ArcGIS工具箱中所有的地理处理(Geoprocessing)工具的功能。制图模块主要用于对地图文档(.mxd)和图层文件(.lyr)进行相关处理。

2 林地专题图制作流程与步骤

2017年,云南省开展天然商品林停伐保护工作,着手编制县级实施方案。方案中需要制作大量的专题图件,比例尺要求1:25000。对于一个林业大县,方案专题图的数量可以达到上百幅,这将带来巨大的工作量,借助ArcGIS软件,将其功能灵活的组合应用,能够提高地图编制的效率,节省出图时间,实现快速制图[6]。

天然林停伐保护专题图有4类,即天然林停伐保护规划图、天然林资源分布图、天然林管护责任区示意图和天然林管护设计图,都需保存工程和导出地图。每幅图都应有详细的地图要素,如图名、比例尺、指北针及各项绘图因子;地图注记要清晰、整洁,线条粗细均匀、着墨饱满、无断线;整图设计须规范美观,内容布设协调,着色和标注要美观大方实用,具体要求见操作细则[7]。

2.1 数据准备

数据准备阶段包括收集空间数据和属性数据。空间数据分为栅格数据和矢量数据,栅格数据主要收集高清影像图、地形图、森林资源专题图等;矢量数据包括点线面三类要素。点要素:省、市、县、乡等政府所在地、居民点、以及需用点标注的其它地理要素(山峰、高程点、瞭望台等);线要素:行政区界线、铁路、公路、一般道路以及河流沟渠、防火线等以线为主要特征构造的地物;面要素:生态区位、公益林划定区、林业产业规划区、责任保护区、林场、林班、小班等封闭面要素(湖泊、水库等)。

收集的空间数据要与属性数据进行连接,确保一一对应,要素之间应当建立拓扑规则检查,保证图形之间不存在冲突关系。

2.2 地图符号化

在ArcGIS软件中添加县级基础数据,如停伐小班、地形图、影像图等,按编制方案的要求定义各图层的符号、样式,进行图层渲染,包括颜色、线型等。有时要求使用的符号在ArcGIS提供的标准符号库中没有现成的,这时应当按照符号要求手动编辑配置符号样式。

2.3 标注信息

标注信息多包含地类、优势树种、面积等属性信息,规范的标注信息可以使得地图所表达的信息一目了然,多会涉及分子式标注方法,具体使用时,按照标注要求选择字段,标注表达式示例如表1。

2.4 小班注记表

1)如果安装了工厂化制图扩展模块(Esri Production Mapping),可以插入动态表格(Graphic Table Element)进行设置,生成的表格标注随驱动页面的变化而动态变化。

2)手动插入表格,这需要在保存好MXD工程后依次打开对应贴入。根据网格索引选择对应范围内的小班信息,在Excel中设置适宜的行高、列宽、字体大小等,选中复制即可在ArcGIS布局视图下粘贴。

小班注记表在页面中放置的位置应尽量不覆盖林地图斑,可根据实际情况进行大小、位置的调整,保持整图的美观性。

表1 标注表达式标注类型VBScript标注表达式示例二分式int([小班号]) & "---" & int([小班面积]) & vbnewline & "----------" & vbnewline & [地类] & "-" & [优势树种]32—70纯林-云南松三分式[国有面积] & "亩"& vbnewline & [乡名] &"-------" & vbnewline & [集体面积] & "亩"XX乡1313亩35631亩上标round ([area],0)& "m"& "" & "2" & ""667 m2下标round ([area],0)& "m"& "" & "2" & ""667 m2

2.5 添加地图整饰要素

在布局视图下进行合理图面配置,插入下列地图要素:

1)图名:,图名为动态文本,按照索引图层中选择的名称字段动态改变,可在前后自行添加固定文本。

2)比例尺:1:25000(设置出图比例,设置数据框固定比例为1:25000)。

3)指北针:多放在地图右上角,设置背景为白色。

4)插入图例应大小适宜,布局合理。

5)图幅编号:选择数据驱动页面文本参数,添加动态文本

6)制图单位、制图日期等信息,可在视图中添加参考线,插入文本。

3 专题图批量生成

3.1 构造出图模板

依照不同的行政区域来进行页面设置,具体设计出图版面的图幅大小、方向和布局,达到数据展示清晰、视觉美观的效果(如图1),保证同一专题图具有相同的出图风格。

图1 出图模板

3.2 制作索引图层

点、线、面要素图层都可以作为索引图层。通常,索引格网多为矩形,在制作时可根据实际调整多边形作为索引要素。在实际生产中,手动创建多边形格网效率不高,为使得格网一致,多使用地理处理工具自动创建格网要素,常用的创建工具有:创建渔网工具和数据驱动页面下的创建格网索引要素工具。

查看创建好的格网是否符合出图要求,如是否超出天然林停伐小班范围(因为行政边界通常是不规则的,自动创建的格网为矩形,特别注意在边缘处格网会超出林地边界),进行格网的适当编辑修改,在创建好的索引要素的属性中应当填入乡镇、村委会、编号等基本属性信息,基本信息可以作为出图图名,编号可作为页码,常使用字段计算器建立公式“[ FID ]+1”顺序编号,也可以使用Python语句自动递增编号。自动编号有两种方法:

1)按照格网从左往右、自上而下自动编号,打开属性表,添加两个浮点型字段:xmin和ymax,在字段计算器中,解译程序选择Python,输入表达式xmin=!shape.extent.XMin!和ymax=!shape.extent.YMax!,分别计算索引格网外包矩形最北最西的坐标值,xmin是最小X范围坐标(西坐标),ymax是最大Y范围坐标(北坐标)。然后根据xmin字段升序排列,ymax字段降序排列,就可以得到索引格网按自上而下、从左至右次序编号。同理,这种方法也可用于计算林地斑块四至。

2)执行Python循环语句,使用UpdateCursor函数按照属性表顺序编号(bh为创建的字段名)。

cur=arcpy.UpdateCursor("索引格网","","","","分区 A") #按“分区”字段顺序编号,A为升序,D为降序

i=1

for row in cur:

row.bh=i

i+=1

cur.updateRow(row)

del cur,row

3.3 设置数据驱动页面参数

启动数据驱动页面,索引图层选择格网索引图层,排序字段选择编号,勾选升序排列,在范围选项卡中选择居中并保持当前比例,设置所有导出的图片都具有相同的比例大小。对小班面层、管护区图层分别进行页面定义查询设置,使索引格网内的天然林停伐图斑随着驱动页面的变化而呈动态显示,范围之外的要素图层则不显示,使得图面整洁,重点突出。

3.4 批量保存工程文档

按要求设置好出图比例和标注填充符号等制图要素后,就可以借助Python语言批量保存MXD工程文件了,Python语言一般在安装ArcGIS时就已默认安装,不必再另行安装。

首先应当导入ArcPy库,导入方法是:import arcpy,调用ArcPy中的函数和工具包。代码如下:

#_*_ coding=utf8_*_

import arcpy,os,sys,time

reload(sys)

sys.setdefaultencoding(|utf-8|)

importPath = "D:专题图"

exportPath = r"D:专题图工程文档"

print |程序开始:|+str(time.ctime())

mxdPath=str(importPath).strip().decode(|utf-8|)

shpPath=r"D:专题图图层索引格网.shp"

mxd=arcpy.mapping.MapDocument(os.path.join(mxdPath,"出图模板.mxd"))

rows=arcpy.SearchCursor(shpPath)

for i in rows:

pageID=mxd.dataDrivenPages.getPageIDFromName(i.getValue("分区"))

mxd.dataDrivenPages.currentPageID =pageID

mxd.saveACopy(exportPath+"\"+i.getValue("分区") + ".mxd")

del mxd

print|程序结束:|+str(time.ctime())

利用4.1节中构造好的出图模板,通过索引格网及数据驱动页面设置,设定文件路径,使用getValue函数获取格网的属性字段值,作为工程名。调用数据驱动工具,按照一个索引格网来保存一个MXD工程,进行循环保存。

3.5 批量打印出图

导出地图时,在ArcGIS导出地图窗口中,选择PDF格式,可以全部页码导出为一个PDF,或者导出多个PDF,这种方式只能够批量导出PDF文件,其他图片格式不能实现批量。因此,要批量导出地图为图片格式,需要使用ArcPy脚本,可以批量导出JPG、PNG等常见图片格式。首先设置MXD文档的存放路径,输出图片的存放路径、文件名以及分辨率等。具体代码如下:

#_*_ coding=utf8_*_

import arcpy,os,sys,time

reload(sys)

sys.setdefaultencoding(|utf-8|)

mxdPath=str("D:专题图工程文档").strip().decode(|utf-8|)

picPath=r"D:专题图图片"

res=200

print|程序开始:|+str(time.ctime())

for afile in os.listdir(mxdPath):

if afile[-3:].lower() ==|mxd|:

filePath=str(os.path.join(mxdPath,afile)).strip().decode(|utf-8|)

mxd=arcpy.mapping.MapDocument(filePath)

arcpy.mapping.ExportToJPEG(mxd,picPath+"\"+afile[:-3]+|jpg|,resolution=res)

del mxd

print|'程序结束:|+str(time.ctime())

通过获取文件路径,对文件夹下的MXD工程文件进行遍历,使用ExportToJPEG函数导出文件夹内每一个MXD工程中布局视图界面为一个JPG图片,若要更改图片格式,只需更改ExportToJPEG函数,如替换为ExportToPNG或ExportToBMP,就可批量导出对应的PNG和BMP格式图片。

3.6 定制工具箱

对于大多数工作者而言,更倾向于使用ArcToolbox图形界面工具,而不是直接使用代码块。可以借助GetParameterAsText函数获取图层参数,将Python脚本做成工具的形式集成到ArcToolbox中(图2),方便不同专题图生产的快速调用。

(a)批量保存MXD工程

(b)批量导出图片

4 结语

在林业空间数据处理方面,ArcGIS提供了众多地理处理工具,通过Python这个粘合剂,可以将多个工具有机地组合起来使用,达到提高效率、保证质量的目的,满足林业生产实际需求。本文通过天然林停伐保护专题图批量生成的成功实践,验证了在ArcGIS平台下,使用Python语言在林业专题图制图方面的高效与准确,为大批量数据自动化处理提供解决思路。同时,本文提出的批量出图方法,在其他行业(如国土、环保)也具有重要应用价值。

Python语言在ArcGIS地理处理架构中有着重要的地位,结合Python语言和ArcGIS平台,针对不同的行业应用、依据特定的业务需求,定制适宜的空间数据处理解决方案,构造实现繁琐地理处理过程的批处理工具,简单高效地完成空间数据批量处理,提高数据处理整合速率和正确率,减少数据处理加工过程中的重复性劳动,减轻工作量,能够极大地提高空间数据生产加工的效率,今后将会得到越来越多的应用和推广。

猜你喜欢
格网批量天然林
批量精装房项目工程信息管理综述
山西省天然林保护工程二期建设成效与经验探讨
批量提交在配置分发中的应用
遥感数据即得即用(Ready To Use,RTU)地理格网产品规范
天津:全面停止天然林商业性采伐
云南地区GPS面膨胀格网异常动态变化与M≥5.0地震关系分析
实时电离层格网数据精度评估
天保工程:把天然林都保护起来
天然林保护任重而道远
格网内插法坐标转换①