博主主要从事国土地理信息行业,经常遇到需要大批量出图的任务,刚好Pyhton可以控制ARCGIS进行后台出图,大大提高工作效率。
在开始运行程序之前,需要将出图模板制作好,完善出图矢量的注记以及图面整饰等工作,最重要的是给布局界面的元素命名,方便出图程序调用,比如出图标题及图例等。
准备好制图模板之后,就可以利用下面的Python代码在IDLE里面行多进程批量出图了。话不多说,源码奉上。
# -*- coding: cp936 -*-
import os
import arcpy
import arcpy.da as da
import multiprocessing
from multiprocessing import Pool
def chutu(variable):
xmmc = variable.encode('gbk') #由于python2.7的特殊性,需要将字段内容进行编码转换
mxd_path = r'C:\Users\Administrator\Desktop\出图模板.mxd'
save_path = r'C:\Users\Administrator\Desktop\出图'
layer = '范围线'
feild = 'XMMC'
base_scale = 5000 #给定一个基础的出图比例尺,避免矢量过小导致出图比例尺过大,需根据自己的页面尺寸自己调试。
mxd = arcpy.mapping.MapDocument(mxd_path) #获取出图文档
df = arcpy.mapping.ListDataFrames(mxd,'图层')[0] #获取数据框
layer = arcpy.mapping.ListLayers(mxd, layer,df)[0] #获取图层
datasource = layer.dataSource #获取数据源
'''数据源不同,定义查询的写法不同'''
if os.path.basename(datasource)[-3:] == 'shp':
query = "\"{0}\" = '{1}'".format(feild,xmmc)
elif os.path.dirname(datasource)[-3:] == 'gdb':
query = "{0} = '{1}'".format(feild, xmmc)
elif os.path.dirname(datasource)[-3:] == 'mdb':
query = "[{0}] = '{1}'".format(feild, xmmc)
layer.definitionQuery = query #定义查询出需出图矢量
df.extent = layer.getExtent() #缩放至定义查询后的要素
scale = df.scale #获取当前比例尺
if scale < base_scale:
df.scale = base_scale
else:
df.scale = df.scale*1.5 #适当缩小比例尺,使出图内容更饱满,依据情况自己调试
title = arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', '标题')[0] #获取标题,元素名称需在MXD里自定义。
title.text = '%s影像套合图' % (xmmc) # 修改标题内容
arcpy.mapping.ExportToJPEG(mxd, os.path.join(save_path,'%s影像套合图.jpg' % (xmmc)),resolution=300) #导出300分辨率的JPG图片
arcpy.mapping.ExportToPDF(mxd, os.path.join(save_path, %s影像套合图.pdf' %(xmmc)),resolution=300) #导出300分辨率的PDF文件
arcpy.mapping.ExportToPNG(mxd, os.path.join(save_path, %s影像套合图.png' %
(xmmc)),resolution=300,background_color= "255,255,255",transparent_color= "255,255,255")
#导出300分辨率且背景透明的PNG图片
mxd.saveACopy(os.path.join(save_path, '%s影像套合图.mxd'% (xmmc)))#出图模板另存
if __name__ == "__main__":
f1 = r'C:\Users\Administrator\Desktop\新建文件地理数据库.gdb\范围线' #出图矢量
variable_list = []
with arcpy.da.SearchCursor(f1,['XMMC']) as cursor: #以XMMC字段为例,构建出图的循环列表
for row in cursor:
if row[0] not in variable_list:
variable_list.append(row[0])
pool = Pool(processes=6) #创建进程池
pool.map(chutu,sorted(variable_list,reverse=False)) #多进程进行出图
pool.close()
pool.join()