利用python代码执行地理信息数据处理,提高工作效率(二)

引言

本文通过ArcPy代码脚本实自动化修改ArcGIS地图文档(MXD)布局中的文本内容,或者进行更新图层属性和符号系统,实现大批量文件内容的修改。

1.1 利用ArcPy修改 ArcGIS MXD 文件中的文本元素颜色:

import os  # 导入os模块,用于处理文件和目录路径  
import arcpy  # 导入arcpy模块,用于ArcGIS的自动化处理  
  
# 设置工作空间  
workspace = ur"F:\汉字路径\宗地图工程"  
# 使用原始字符串r前缀来避免在路径中的反斜杠\被解释为转义字符  
  
# 遍历文件夹内所有 MXD 文件  
for filename in os.listdir(workspace):  # 列出工作空间中的所有文件和文件夹  
    if filename.endswith(".mxd"):  # 检查文件名是否以.mxd结尾  
        mxd_path = os.path.join(workspace, filename)  # 将工作空间路径和文件名组合成完整的MXD文件路径  
        mxd = arcpy.mapping.MapDocument(mxd_path)  # 使用完整的MXD文件路径创建MapDocument对象  
  
        # 获取地图文档中的所有文本元素  
        text_elements = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT")  # 列出MXD中的所有文本元素  
  
        # 遍历每个文本元素,并尝试修改文字颜色为红色  
        # 注意:ArcPy中直接修改文本内容来改变颜色(如使用HTML标签)通常不起作用  
        # 这里修改text_element.text尝试用HTML标签改变颜色,但这在ArcGIS中不被支持  
        # 正确的做法是直接设置text_element.elementColor  
        for text_element in text_elements:  
            # 下面这行代码试图通过修改文本内容来改变颜色,但这是不正确的  
            # text_element.text = "<CLR red=\"255\">{}</CLR>".format(text_element.text)  
            # 正确设置文本元素颜色的方法  
            text_element.elementColor = (255, 0, 0)  # 设置文本元素的颜色为红色(RGB格式)  
  
        # 保存修改后的 MXD 文件  
        mxd.save()  # 保存对MXD文件所做的更改  
  
# 注意:在原始代码中,尝试通过修改text_element.text来改变颜色的部分是不必要的,  
# 并且可能导致错误或不符合预期的行为。只需设置text_element.elementColor即可。

1.2 利用ArcPy替换图层的数据源和修改布局中的文本元素。:

import arcpy  
import glob  
import os  
import sys  
  
# 尝试设置Python的默认编码为UTF-8
defaultencoding = 'utf-8'  
if sys.getdefaultencoding() != defaultencoding:  
    reload(sys)  # reload() 函数在 Python 3 中已移除,应使用 importlib.reload()  
    sys.setdefaultencoding(defaultencoding)  # 这在Python 3中不再有效  
  
# 地图文件夹路径  
DTWJJ ="H:\\制图\\**区\\制图空间\\**镇"  
  
# 要被替换的文本  
BTHWB ="2018年11月2日"  
  
# 替换后的文本  
THWB ="2019年5月17日"  
  
# 使用glob模块查找指定文件夹下的所有MXD文件  
Mxdfiles = glob.glob(DTWJJ+"\\*.mxd")  
  
# 遍历找到的MXD文件  
for mxd in Mxdfiles:  
    # 打开MXD文件  
    Mxd = arcpy.mapping.MapDocument(mxd)  
      
    # 尝试获取名为"GHYT"的图层,但这里假设每个MXD文件中都有且仅有一个名为"GHYT"的图层  
    # 如果不存在或存在多个,这可能会引发错误  
    lyr = arcpy.mapping.ListLayers(Mxd, "GHYT")[0]  
      
    # 替换图层的数据源  
    lyr.findAndReplaceWorkspacePath(r"H:\制图\**区\矢量数据\**数据.gdb\dateset\GHYT",  
                                    r"H:\制图\**区\矢量数据\**数据.gdb\dateset新\GHYT1",  
                                    True)  
      
    # 遍历MXD中的所有文本元素  
    for elm in arcpy.mapping.ListLayoutElements(Mxd, "TEXT_ELEMENT"):  
        # 如果文本元素的文本与BTHWB匹配,则替换为THWB  
        if elm.text == BTHWB:  
            elm.text = THWB  
            # 取消注释可以修改文本大小,但目前不执行此操作  
            # elm.fontSize = 15  
      
    # 保存修改后的MXD文件  
    Mxd.save()  
      
    # 清理,删除Mxd对象以释放资源  
    del Mxd  

1.3 利用ArcPy读取所有的MXD(ArcGIS地图文档)文件,并将它们逐一导出为PDF文件,存储在另一个指定的文件夹中。

import arcpy  
import os  
  
# 设置工作空间和存储路径  
# workspace 变量存储了包含MXD文件的文件夹路径  
workspace = ur'F:\观音河测试加四至\01宗地图mxd'  
# output_folder 变量存储了希望存储导出PDF文件的文件夹路径  
output_folder = ur'F:\观音河测试加四至\01宗地图mxd\pdf'  # 同样,ur 前缀是多余的。  
arcpy.env.workspace = workspace  # 设置ArcGIS的工作空间为MXD文件所在的文件夹  
  
# 查找所有的 MXD 文件  
# 使用arcpy.ListFiles列出指定文件夹下所有MXD文件(这里的模式匹配是'*.mxd')  
mxd_files = arcpy.ListFiles('*.mxd')  
  
# 遍历每个 MXD 文件并导出为 PDF  
# 对于在workspace中找到的每个MXD文件,执行以下操作  
for mxd_file in mxd_files:  
    # 构造完整的MXD文件路径  
    mxd_path = os.path.join(workspace, mxd_file)  
    # 使用arcpy.mapping.MapDocument打开MXD文件  
    mxd = arcpy.mapping.MapDocument(mxd_path)  
    # 构造PDF文件名(去除.mxd扩展名,并添加.pdf)  
    pdf_name = os.path.splitext(mxd_file)[0] + '.pdf'  
    # 构造完整的PDF文件存储路径  
    pdf_path = os.path.join(output_folder, pdf_name)  
    # 使用arcpy.mapping.ExportToPDF将MXD文件导出为PDF,设置分辨率为300DPI  
    # 可以根据需要调整resolution参数来改变导出PDF的分辨率  
    arcpy.mapping.ExportToPDF(mxd, pdf_path, resolution=300)  
    # 删除mxd对象以释放资源  
    del mxd  
  
# 输出完成信息  
print("PDF 导出完成")

1.4 利用ArcPy遍历指定文件夹中的所有MXD文件,并为每个MXD文件添加两个特定的图层文件

import os  
import arcpy  
  
# 设置工作空间,即包含MXD文件的文件夹路径  
# 注意:这里的 ur 前缀是多余的,Python 字符串前不需要这样的前缀  
workspace =ur"F:\观音河测试加四至\01宗地图mxd"  
  
# 遍历文件夹中的所有文件  
for filename in os.listdir(workspace):  
    # 检查文件名是否以 ".mxd" 结尾,以确认它是MXD文件  
    if filename.endswith(".mxd"):  
        # 构造完整的MXD文件路径,并打开MXD文件  
        mxd_path = os.path.join(workspace, filename)  
        mxd = arcpy.mapping.MapDocument(mxd_path)  
          
        # 获取MXD中的第一个数据框(ArcGIS中MXD可以包含多个数据框,但这里只处理第一个)  
        df = arcpy.mapping.ListDataFrames(mxd)[0]  
          
        # 加载第一个图层文件(.lyr),准备添加到MXD的数据框中  
        # 注意:这里的 ur 前缀是多余的  
        layer1_path = ur"F:\观音河测试加四至\01宗地图mxd\观音河本宗四至小短线.lyr"  
        layer1 = arcpy.mapping.Layer(layer1_path)  
        # 将第一个图层添加到数据框的底部  
        arcpy.mapping.AddLayer(df, layer1, "BOTTOM")  
          
        # 加载第二个图层文件(.lyr),准备添加到MXD的数据框中  
        layer2_path = ur"F:\观音河测试加四至\01宗地图mxd\观音河本宗相邻四至面状_标注用.lyr"  
        layer2 = arcpy.mapping.Layer(layer2_path)  
        # 将第二个图层也添加到数据框的底部(注意:这会使第二个图层位于第一个图层的下方)  
        # 如果希望第二个图层位于第一个图层的上方,应该使用不同的位置参数,如 "TOP" 或 "AFTER"  
        arcpy.mapping.AddLayer(df, layer2, "BOTTOM")  
          
        # 保存修改后的MXD文件  
        mxd.save()  
          
        # (可选)如果你想要释放资源,可以在这里删除mxd对象,但在这个循环的末尾,Python的垃圾回收机制会自动处理  
        # del mxd`

总结:
1、其实以上代码可以通过chatgpt3.5或者文心一言进行编写,然后通过ArcMap中的python工具进行调试,即使代码运行报错,也可以将报错问题在chatgpt3.5或者文心一言反馈,chatgpt3.5就会根据报错原因进行修改代码;
2、以上代码路径一定要考虑中文编码规则,建议路径不使用中文;
3、以上代码经过项目验证过的,完全可以运行。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

30岁一事无成

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值