arcpy批量化出图浅试

arcpy批量化出图浅试

    • 需求
      • 数据列表
    • 环境搭建
    • 模板文件制作
    • 读取mxd文件
      • 替换指标文件
      • 替换文字要素
      • 替换图片要素
      • 替换其他要素
    • 保存为新mxd
    • 导出png图片

需求

遥感反演的多项水质指标,虽然有模板,但一个个打开mxd文件替换源,整饰出图,还是挺麻烦的,于是学了下arcpy,简单用一下,省时间。

数据列表

  • 水质指标tif
  • 行政区划shp
  • 地名shp
  • 水系名shp
  • 影像底图tif

环境搭建

由于arcgis在安装时默认就安装了python2.7,用pycharm设置一下环境就可以

arcpy批量化出图浅试_第1张图片

模板文件制作

首先利用arcgis制作一个模板,图层按顺序放置,其他的坐标系、图例、标题等正常放置即可,达到能够正常出图的标准,将mxd文件保存。
arcpy批量化出图浅试_第2张图片

读取mxd文件

# -*- coding:utf-8 -*-
import arcpy
import os
import sys
reload(sys)
# 添加中文支持
sys.setdefaultencoding('utf8') 
# 允许覆盖同名文件
arcpy.env.overwriteOutput = True

# 设定mxd路径
input_mxd = r'E:\Zph\Python\arcgis0907\input\muban\test.mxd'
# 读取mxd文档对象
mxd = arcpy.mapping.MapDocument(input_mxd)
# 数据框(图层),返回的是列表,取第一个
df = arcpy.mapping.ListDataFrames(mxd)[0]
# 数据框下的各个文件
lyr_list = arcpy.mapping.ListLayers(mxd)
lyr_names = []
for lyr in lyr_list:
    print lyr.name
	lyr_names.append(lyr.name)

C:\Python27\ArcGIS10.8\python.exe E:/Zph/Python/arcgis0907/test1.py
CODMn
行政区划
行政地名_Clip
水系名
底图

进程已结束,退出代码0
  • 这里就把数据框里所有的图层列出来了,根据需求,目前只需要将第一项水质指标替换成别的指标就可以了。

替换指标文件

# 替换指标tif
lyr_list[0].replaceDataSource(wq_filepath,'RASTER_WORKSPACE', wq_filename, True)
# 将拉伸更新一下
arcpy.mapping.UpdateLayer(df, lyr_list[0], lyr_list[0], True)
  • 我在mxd模板中设置的拉伸方式为最大最小值拉伸(并未修改最大最小值),替换后可以直接自动适应拉伸方式。
  • 但若在模板中修改了最大最小值,实测无法自动适应,还是会沿用mxd模型中设置的最大最小值进行拉伸。
  • 如替换底图,波段会与mxd文件中波段合成顺序对应。

替换文字要素

# 获取当前图层中的全部文字要素
element_list = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT")
# 如需更改
element_list[0].text = '修改后文字'
  • 替换之前,最好在mxd模板中设置好对齐方式,免得乱跑。

替换图片要素

# 获取当前图层中的全部图片要素
pic_list = arcpy.mapping.ListLayoutElements(mxd,"PICTURE_ELEMENT")
# 如需更改
pic_list[0].sourceImage = new_pic_path
  • 根据官方文档的说法,替换后的图片应该会与替换前图片的最长边对齐。

arcpy批量化出图浅试_第3张图片

替换其他要素

总体思路就是利用ListLayoutElements函数读取元素列表,再一一进行匹配修改。

DATAFRAME_ELEMENT —数据框元素
GRAPHIC_ELEMENT —图形元素
LEGEND_ELEMENT —图例元素
MAPSURROUND_ELEMENT —地图整饰要素元素
PICTURE_ELEMENT —图片元素
TEXT_ELEMENT —文本元素

保存为新mxd

mxd.saveACopy("new.mxd")

导出png图片

arcpy.mapping.ExportToPNG(mxd, "export.png", resolution=300)
  • 很需要arcgis中导出时“按图形范围裁剪输出结果”的功能,但翻了好久没找到相关接口,arcgis pro好像提供了,之后再试吧。

将上述功能写成函数,循环全部水质指标文件,每一份出一个png,保存一个mxd就完成了。半天的活3分钟完成,快乐~

欢迎关注VX:Hzz的地球调查组

你可能感兴趣的:(arcpy,arcgis)