您的当前位置:首页正文

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

2024-01-30 来源:好走旅游网
基于ArcPy的批量土地利用现状分幅图的制作

发表时间:2019-05-13T09:40:38.097Z 来源:《基层建设》2019年第4期 作者: 蒋利 洪紫亮

[导读] 摘要:在国土行业的工作中,制图是非常常见的任务,有的项目中甚至会出上百张图片,所以批量出图很有必要。 湖北众易伟业土地勘测规划有限公司 湖北武汉 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

因篇幅问题不能全部显示,请点此查看更多更全内容