【Python&GIS】Arcpy中常用出图函数详解


        出图是每个GISer都要经历的事,但有时候会有许多重复且多且无聊的出图任务,这个时候我们肯定想能不能自动化出图。ArcGIS中的模型创建就可以实现,但是我的数据大部分是在Python中处理的,所以就想能不能使用Python进行批量出图,正好今天跟大家分享一下。这里使用的mxd作为模板,然后替换/新加图层的方案。

 原创作者:RS迷途小书童

 

博客地址:https://blog.csdn.net/m0_56729804?type=blog

前提: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等常见格式的,但是我工作中没用到所以就没看,感兴趣可以自己看看官方的函数文件。

# -*- 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 修改布局要素

        这里的布局函数指的是标题、图例等,可以通过这个函数修改它的样式、值等。毕竟批量出图的标题不可能一模一样吧。

# -*- 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']"""
posted @ 2024-08-05 17:07  RS迷途小书童  阅读(71)  评论(0编辑  收藏  举报