出图是每个GISer都要经历的事,但有时候会有许多重复且多且无聊的出图任务,这个时候我们肯定想能不能自动化出图。ArcGIS中的模型创建就可以实现,但是我的数据大部分是在Python中处理的,所以就想能不能使用Python进行批量出图,正好今天跟大家分享一下。这里使用的mxd作为模板,然后替换/新加图层的方案。
前提:Arcpy使用的前提是安装了ArcGIS才有Python2.7的环境,才有Arcpy这个库!!!
1 添加新图层至mxd
这里提供两种方案,一种是直接添加图层,一种是从另一个mxd加载图层再添加至当前mxd中。这样添加的图层需要额外进行样式设置,我这里就不介绍了。
# -*- coding: utf-8 -*-
"""
@Time : 2024/3/11 10:25
@Auth : RS迷途小书童
@File :MXD Processing.py
@IDE :PyCharm
@Purpose :arcpy中mxd出图相关函数
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import sys
import arcpy.mapping as mapping# 添加新的图层至mxd中
def add_layer_to_mxd():# --------------------------------------添加新图层至mxd中--------------------------------------mxd = arcpy.mapping.MapDocument(r"C:\RS迷途小书童\Project.mxd")# 使用mapping模块中的MapDocument函数打开MXD文件df = arcpy.mapping.ListDataFrames(mxd, "New Data Frame")[0]# df = arcpy.mapping.ListDataFrames(mxd)[0]# 获取MXD文档中的第一个数据框,并将其对象赋值给变量dfnew_layer = arcpy.mapping.Layer(r"C:\RS迷途小书童\Data\Orthophoto.lyr")# 加载新的图层arcpy.mapping.AddLayer(df, new_layer, "BOTTOM")# 将新的图层加入数据框的底层中,"AUTO_ARRANGE"自动放置图层,类似于添加数据按钮在 ArcMap 中的工作原理,"TOP"在数据框顶部放置图层mxd.saveACopy(r"C:\RS迷途小书童\Project2.mxd")# 保存mxd文件del new_layer, mxd# -------------------------------从另一个mxd中的图层添加至这个mxd中-------------------------------mxd2 = arcpy.mapping.MapDocument(r"C:\RS迷途小书童\ProjectTemplate.mxd")df2 = arcpy.mapping.ListDataFrames(mxd2, "Layers")[0]# 获取MXD文档中的第一个数据框,并将其对象赋值给变量dfnew_layer = arcpy.mapping.ListLayers(mxd2, "NE_Layers", df2)[0]# 根据图层名称在MXD文档的数据框中查找图层,并获取其对象mxd = arcpy.mapping.MapDocument(r"C:\RS迷途小书童\Project.mxd")df = arcpy.mapping.ListDataFrames(mxd, "New Data Frame")[0]arcpy.mapping.AddLayer(df, new_layer, "AUTO_ARRANGE")mxd.saveACopy(r"C:\RS迷途小书童\Project2.mxd")del mxd2, mxd

2 替换mxd中的图层
这个替换方案使用于栅格数据、矢量数据等,这个会保存原有格式,如mxd该图层是空心、边线是红色加粗,那么替换后还是如此,简单来说就是会保存样式。
# -*- coding: utf-8 -*-
"""
@Time : 2024/3/11 10:25
@Auth : RS迷途小书童
@File :MXD Processing.py
@IDE :PyCharm
@Purpose :arcpy中mxd出图相关函数
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import sys
import arcpy.mapping as mapping# 替换mxd中的某个图层
def replace_layer_from_mxd():mxd_path = r"G:/彭俊喜/old.mxd"# mxd路径及名称(只需要设置mxd模板)folder_path = r"G:/彭俊喜/"image = r"1.tif"mxd = mapping.MapDocument(mxd_path)# 使用mapping模块中的MapDocument函数打开MXD文件,并将其对象赋值给变量mxddf = mapping.ListDataFrames(mxd)[0]# 获取MXD文档中的第一个数据框,并将其对象赋值给变量dflyr_name = "1=quick_dom.tif"# 定义了一个图层名称,这通常应该是图层在MXD文档中的实际名称(即需要被替换的图层名称)lyr = mapping.ListLayers(mxd, lyr_name, df)[0]# 根据图层名称在MXD文档的数据框中查找图层,并获取其对象lyr.replaceDataSource(folder_path, "RASTER_WORKSPACE", image)# 替换图层的数据源为当前遍历到的TIFF文件。("替换数据的父路径", 存储方式, 替换数据的名称)mxd.saveACopy(r"G:/RS迷途小书童/new.mxd")# 保存mxd文件del new_layer, mxd

3 导出mxd为PDF/PNG
应该也是可以导出TIF等常见格式的,但是我工作中没用到所以就没看,感兴趣可以自己看看官方的函数文件。
# -*- coding: utf-8 -*-
"""
@Time : 2024/3/11 10:25
@Auth : RS迷途小书童
@File :MXD Processing.py
@IDE :PyCharm
@Purpose :arcpy中mxd出图相关函数
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import sys
import arcpy.mapping as mapping# 导出mxd为PNG/PDF
def Export_from_mxd():mxd_path = r"G:/彭俊喜/131.mxd"# mxd路径及名称(只需要设置mxd模板)out_path = r"G:/彭俊喜/1.png"out_path1 = r"G:/彭俊喜/1.pdf"mxd = mapping.MapDocument(mxd_path)# 使用mapping模块中的MapDocument函数打开MXD文件,并将其对象赋值给变量mxd# df = mapping.ListDataFrames(mxd)[0] # 获取MXD文档中的第一个数据框,并将其对象赋值给变量dfmapping.ExportToPNG(mxd, out_path, color_mode="24-BIT_TRUE_COLOR", resolution=1000, transparent_color="255,255,255")# 导出为PNG图像,设置为24位真彩色、分辨率为1000dpi、图像背景为透明mapping.ExportToPDF(mxd, out_path1, resolution=1500)# 导出为PDF影像,分辨率为1500

4 修改布局要素
这里的布局函数指的是标题、图例等,可以通过这个函数修改它的样式、值等。毕竟批量出图的标题不可能一模一样吧。
# -*- coding: utf-8 -*-
"""
@Time : 2024/3/11 10:25
@Auth : RS迷途小书童
@File :MXD Processing.py
@IDE :PyCharm
@Purpose :arcpy中mxd出图相关函数
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import sys
import arcpy.mapping as mapping# 修改mxd中的布局元素,如标题、图例等
def Repair_Elements_from_mxd():mxd_path = r"G:/彭俊喜/131.mxd"# mxd路径及名称(只需要设置mxd模板)mxd = mapping.MapDocument(mxd_path)# 使用mapping模块中的MapDocument函数打开MXD文件,并将其对象赋值给变量mxdfor element in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):# 遍历数据框中的文本元素(标题/图例/文本)if element.text == "Old String":# 如果文本为Old Stringelement.text = "New String"if element.name == "title":# 如果元素的名称为titleelement.text = "RSer\n你好!"mxd.save()del mxd

5 支持格式类型
这里是替换图层时,函数支持的格式类型。需要注意的是:替换栅格和要素时需要注意名称结构和路径要求!!!
"""['RASTER_WORKSPACE', 'VPF_WORKSPACE', 'TEXT_WORKSPACE', 'SDE_WORKSPACE', 'PCCOVERAGE_WORKSPACE','OLEDB_WORKSPACE', 'TIN_WORKSPACE', 'NONE', 'ACCESS_WORKSPACE', 'CAD_WORKSPACE', 'EXCEL_WORKSPACE','FILEGDB_WORKSPACE', 'SHAPEFILE_WORKSPACE', 'ARCINFO_WORKSPACE']"""
