出图是每个GISer都要经历的事,但有时候会有许多重复且多且无聊的出图任务,这个时候我们肯定想能不能自动化出图。ArcGIS中的模型创建就可以实现,但是我的数据大部分是在Python中处理的,所以就想能不能使用Python进行批量出图,正好今天跟大家分享一下。这里使用的mxd作为模板,然后替换/新加图层的方案。
原创作者:RS迷途小书童
前提: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文档中的第一个数据框,并将其对象赋值给变量df
new_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文档中的第一个数据框,并将其对象赋值给变量df
new_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文件,并将其对象赋值给变量mxd
df = mapping.ListDataFrames(mxd)[0]
# 获取MXD文档中的第一个数据框,并将其对象赋值给变量df
lyr_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等常见格式的,但是我工作中没用到所以就没看,感兴趣可以自己看看官方的函数文件。这里输出PNG和PDF格式时可以选择分辨率参数。
# -*- 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文档中的第一个数据框,并将其对象赋值给变量df
mapping.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 修改布局要素
这里的布局函数指的是标题、图例等,可以通过这个函数修改它的样式、值等。毕竟批量出图的标题不可能一模一样吧。通过循环所有文字要素,如果文字等于Old String(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 Repair_Elements_from_mxd():
mxd_path = r"G:/彭俊喜/131.mxd"
# mxd路径及名称(只需要设置mxd模板)
mxd = mapping.MapDocument(mxd_path)
# 使用mapping模块中的MapDocument函数打开MXD文件,并将其对象赋值给变量mxd
for element in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
# 遍历数据框中的文本元素(标题/图例/文本)
if element.text == "Old String":
# 如果文本为Old String
element.text = "New String"
if element.name == "title":
# 如果元素的名称为title
element.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']"""
本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。