需求
遥感反演的多项水质指标,虽然有模板,但一个个打开mxd文件替换源,整饰出图,还是挺麻烦的,于是学了下arcpy,简单用一下,省时间。
数据列表
- 水质指标tif
- 行政区划shp
- 地名shp
- 水系名shp
- 影像底图tif
环境搭建
由于arcgis在安装时默认就安装了python2.7,用pycharm设置一下环境就可以
模板文件制作
首先利用arcgis制作一个模板,图层按顺序放置,其他的坐标系、图例、标题等正常放置即可,达到能够正常出图的标准,将mxd文件保存。
读取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
- 根据官方文档的说法,替换后的图片应该会与替换前图片的最长边对齐。
替换其他要素
总体思路就是利用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的地球调查组