基于ArcPy的批量土地利用现状分幅图的制作论文_蒋利,洪紫亮

基于ArcPy的批量土地利用现状分幅图的制作论文_蒋利,洪紫亮

湖北众易伟业土地勘测规划有限公司 湖北武汉 430000

摘要:在国土行业的工作中,制图是非常常见的任务,有的项目中甚至会出上百张图片,所以批量出图很有必要。本文研究了利用ArcPy实现在ArcGIS中批量制作土地利用现状分幅图的过程。

关键词:ArcGIS,ArcPy,Python,分幅图

1 概述

近年来随着ArcGIS系统软件在规划、国土、林业等部门的应用,越来越多的用户对基于ArcGIS的地图图件要求也越来越多。Python最早集成于ArcGIS9.0版本中,此后被视为可供地理处理用户选择的脚本语言,并得到了不断发展,在ArcGIS10及10以上版本中采用了ArcPy(通常称为ArcPy站点包),并提供了多种有用的函数和类,以用于处理和访问GIS数据。Python作为一种高级编程语言,它简单易懂,非常适合初学者,也特别适合专家使用,其可伸缩程度高,可移植,跨平台,用户社区规模大。Python已延伸到ArcGIS中,成为了一种用于进行数据分析、数据转换、数据管理、和地图自动化的语言。

在ArcGIS10.2中,Arcpy包含5个模块,分别为数据访问模块(arcpy.da),制图模块(arcpy.mapping),网络分析模块(arcpy.na),空间分析模块(arcpy.sa)以及时间模块(arcpy.time)。且使用ArcPy,能通过Python调用ArcGIS工具箱中的所有工具。在利用ArcPy进行批量土地利用现状分幅图制作过程中,一般用到数据访问模块以及制图模块。数据访问模块是一个用于处理数据的Python模块。通过它可以控制编辑会话、编辑操作、改进的游标支持(包括更快的性能)、表和要素类与 NumPy 数组之间相互转换的函数以及对版本化、复本、属性域和子类型工作流的支持。制图模块主要是用于操作现有的地图文档(.mxd)和图层文件(.lyr)的内容。此外,还提供自动执行导出和打印的函数。

2 基于ArcPy的批量土地利用现状分幅图的制作流程

基于ArcPy批量土地利用现状图件制作的流程一般包含以下几个步骤:(1)数据准备;(2)地图模板制作;(3)批量地图文档生成;(4)批量图件输出。

2.1 数据准备

在进行批量出图前需要收集出图所用的数据,土地利用现状图主要包括基础地理要素如行政区界线、行政区注记等,还包括现状要素如地类图斑、线状地物、零星地物等,将收集到的数据在ArcMap中进行标准化处理,然后利用ArcGIS中的渔网工具创建接合图表图层。所有数据准备好后,将其导入mdb中,作为出图所用的源数据库。

利用ArcPy根据接合图表图层对源数据库进行批量裁剪,将每个图幅的数据分别存放在对应的分幅mdb中。此操作主要使用数据访问模块和分析工具箱中的裁剪工具。主要思路:通过搜索游标遍历接合图表图层要素,创建以图幅号为名的mdb存放每个分幅的数据,利用接合图表要素裁剪源数据库中所有要素类,将裁剪出来的要素类以源要素类名存放到每个对应的分幅mdb中。实现方式如下:

import os

import arcpy

floder=r"G\BZTF" #定义文件夹用于存放分幅mdb

datasource=r"G:\ XSS.mdb" #定义源数据库

bztf= r"G:\ XSS.mdb\BZTF" #定义接合图表图层

cursor = arcpy.da.SearchCursor(bztf,["SHAPE@","TFH"]) #定义一个搜索游标

for row in cursor:

arcpy.CreatePersonalGDB_management(floder,row[1],"10.0")

for dirpath,dirnames,filenames in arcpy.da.Walk(datasource,datatype="FeatureClass"): #遍历源数据库中要素类

for filename in filenames:

in_features=os.path.join(dirpath,filename)

out_features=floder+"\\"+row[1]+".mdb"+"\\"+filename

arcpy.Clip_analysis(in_features,row[0],out_features,"0.001")

print "OK!"

2.2 地图模板制作

(1)制作图层文件。打开ArcMap,加载基础库中的地类图斑、线状地物、零星地物、行政区界线图层,制作标准符号库,对每个图层进行符号化,将每个图层导出一个lyr图层,lyr图层用来保存其符号化信息,用在接下来的分幅图中。

(2)制作现状分幅图模板。打开ArcMap,加载任一分幅mdb中的数据,将各要素图层根据(1)中制作的图层文件进行符号化,根据制图标准制作一幅现状分幅图,将地图文档保存,作为地图模板。

2.3 批量地图文档生成

利用ArcPy批量生成所有分幅的mxd文档,并将其中要素图层符号化。主要思路:利用ArcPy中的制图模块,替换上一步制作的地图模板中的数据源,生成新的分幅mxd,并符号化要素图层。

期刊文章分类查询,尽在期刊图书馆实现方式如下:

import arcpy,os

import arcpy.mapping as mapping

path=r"G:\BZTF" #指定分幅mdb所在路径

oldfullpath=r"G:\BZTF\H50G035020.mdb" #指定地图模板引用的要素路径

template=r"G:\Template.mxd" #指定地图模板

for root,dirs,files in os.walk(path):

for filename in files:

basename,extension=os.path.splitext(filename)

if extension==".mdb":

mxd=mapping.MapDocument(template)

newfullpath=os.path.join(root,filename)

newmxd=path+"\\"+basename+".mxd"

mxd.findAndReplaceWorkspacePaths(oldfullpath,

newfullpath,True)

df=mapping.ListDataFrames(mxd)[0]

updataLayer=mapping.ListLayers(mxd,"",df)

for lyr in updataLayer: #更新图层符号信息

if lyr.name=="DLTB":

sourceLayer = mapping.Layer(r"G:\ DLTB.lyr")

mapping.UpdateLayer(df,lyr,sourceLayer,True)

elif lyr.name=="XZDW":

sourceLayer = mapping.Layer(r"G:\ XZDW.lyr")

mapping.UpdateLayer(df,lyr,sourceLayer,True)

elif lyr.name=="LXDW":

sourceLayer = mapping.Layer(r"G:\LXDW.lyr")

mapping.UpdateLayer(df,lyr,sourceLayer,True)

elif lyr.name=="XZQJX":

sourceLayer = mapping.Layer(r"G:\XZQJX.lyr")

mapping.UpdateLayer(df,lyr,sourceLayer,True)

mxd.saveACopy(newmxd)

print " OK!"

2.4 批量图件输出

在上一步生成批量工程文件后,需要对每个工程文件进行人工处理,如标注的位置,其他图廓外的整饰等。处理完后保存mxd文档,可利用ArcPy将图件批量导成jpg或pdf文件。下面以批量导出成jpg文件为例,我们使用ArcPy的制图模块中的ExportToJPEG函数,此函数包含10个参数,语法如下:

ExportToJPEG(map_document,out_jpeg,{data_frame},{df_export_width},{df_export_height},{resolution},{world_file},{color_mode},{jpeg_quality},{progressive})

其中第一个和第二个为必选参数,其他为可选参数。具体实现如下:

import arcpy

import os

path=r"G:\ BZTF" #指定mxd文档所在路径

for root,dirs,files in os.walk(path):

for filename in files:

basename,extension=os.path.splitext(filename)

if extension==".mxd":

mxdfullpath=os.path.join(root,filename)

mxd = arcpy.mapping.MapDocument(mxdfullpath)

jpgfullpath=path+"\\"+basename+".jpg"

arcpy.mapping.ExportToJPEG(mxd,jpgfullpath,resolution=300,jpeg_quality=70) #设置分辨率为300,图片质量为70

del mxd

print "OK!"

需要注意的是,ExportToJPEG函数默认的分辨率为96,达不到我们出图的要求,一般出图分辨率都是要求300或300以上,所以将其设置为300;默认的图片质量为100,当图片质量默认为100时,导出来的图片比较大,非常占用硬盘空间,因此将其设置为70,此时导出来的图片既符合出图要求,也能减少空间占用情况。

3 结束语

图件制作是一个非常繁琐的过程,没有办法做到完全自动化,但是将一些共性的操作,利用编程,进行分类批量处理,可以达到节约人力和时间的目的,并且利用编程,还能提高图件的准确性,减少人工失误。

参考文献:

[1]ArcGIS10.2 帮助文档

[2]宋香平,段动宾,张桥梁.基于Arcpy专题地图批量制作方法[J].黑龙江工程学院学报,2017,31(2):36-40

[3]刘桂英.基于Python的ArcGIS批量地图输出方法[J].科技与企业,2016(09):94-94

论文作者:蒋利,洪紫亮

论文发表刊物:《基层建设》2019年第4期

论文发表时间:2019/5/13

标签:;  ;  ;  ;  ;  ;  ;  ;  

基于ArcPy的批量土地利用现状分幅图的制作论文_蒋利,洪紫亮
下载Doc文档

猜你喜欢