首页 > 编程语言 >【Python&GIS】Arcpy中常用出图函数详解

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

时间:2024-08-05 17:05:48浏览次数:15  
标签:GIS Python mapping 出图 WORKSPACE MXD 图层 arcpy mxd


        出图是每个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文档中的第一个数据框,并将其对象赋值给变量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']"""

标签:GIS,Python,mapping,出图,WORKSPACE,MXD,图层,arcpy,mxd
From: https://www.cnblogs.com/RSran/p/18343610

相关文章

  • 使用Python 和 Selenium 抓取 酷狗 音乐专辑 附源码
    在这篇博客中,我将分享如何使用Python和Selenium抓取酷狗音乐网站上的歌曲信息。我们将使用BeautifulSoup解析HTML内容,并提取歌曲和专辑信息。依赖库requestsbeautifulsoup4selenium准备工作首先,我们需要安装一些必要的库:pipinstallrequestsbeautifulsoup4selenium......
  • 使用 Python和PyQt5 打造 你的专属文件查询工具! 附源码
    本文将介绍如何使用Python和PyQt5创建一个简单的文件查询工具。该工具允许用户选择一个目录,并在该目录中搜索特定的文件。依赖库首先,确保你已经安装了PyQt5库:pipinstallPyQt5步骤第一步:导入库我们需要导入必要的库,包括sys、os和PyQt5。importsysimportosfromP......
  • 用Python和PyQt5打造你的专属音乐播放器!轻松创建带封面的音乐列表
    在本文中,我们将介绍如何使用Python的PyQt5库创建一个简单的音乐播放器。这个音乐播放器可以显示歌曲的封面,并且点击封面就可以播放对应的歌曲。依赖库首先,我们需要安装PyQt5库。可以使用以下命令进行安装:pipinstallPyQt5功能如下:显示歌曲列表:程序会在指定的目录(在......
  • 了解 Databricks 文件系统 (DBFS) 中的文件访问与使用 Python 和 Spark 的卷的比较
    我当前正在尝试从Databricks文件系统(DBFS)读取和显示文件,但遇到了问题。这是我使用的代码:file_path="/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log"withopen(file_path,'r')asfile:......
  • 机器学习用python还是R,哪个更好?
    选择使用Python还是R进行机器学习取决于多个因素,包括您的具体需求、项目要求、个人偏好以及团队的技能水平。以下是一些关键点,可以帮助您做出决定:Python的优势广泛使用:Python是目前最流行的编程语言之一,特别是在数据科学和机器学习领域。它有一个庞大的社区和丰富的资源。......
  • python 元类:在调用“__set_name__”方法后编辑命名空间?
    假设我们用元类定义一个类。在类主体中,分配了对象,这些对象实现__set_name__以在类的数据结构中注册自身。是否可以在运行方法之后编辑命名空间?比如,分离填充的数据结构,将其分成两部分,然后在新属性下添加部分?__set_name__问题在于,在元类中调用之......
  • 无法加入进程,只能终止[Python 3.11,多处理]
    我有一个问题要问对Python的多处理库有更​​多经验的人,此时我几乎迷失了方向。我目前正在构建一个应该在Windows11和Windows11上运行的图像处理应用程序装有DebianLinux的OrangePi5。我的设置是,除了主程序之外,还有另外两个进程,一个用于处理不间断的......
  • Python 将Word转换为JPG、PNG、SVG图片
    将Word文档以图片形式导出,既能方便信息的分享,也能保护数据安全,避免被二次编辑。文本将介绍如何使用 Spire.DocforPython 库在Python程序中实现Word到图片的批量转换。Python将Word转换为JPG、JPEG、PNG、BMP等图片格式Python将Word文档转换为SVG格式 Python库安装: ......
  • C 和 Python 代码的函数的不同十六进制转储值
    这是我的示例C代码,用于从user32.dll中转储MessageBoxA:#include<windows.h>#include<stdio.h>voidDumpFun(HANDLEprocess,LPVOIDaddress,SIZE_Tdump_size){BYTE*buffer=(BYTE*)malloc(dump_size);if(buffer==NULL){pri......
  • 是否有对数累积分布函数 (CDF) 和分位数函数的数值稳定的 Python 实现?
    我正在寻找以下函数的数值稳定实现。由于我的应用涉及t分布,所以我这里以t分布为例。LogCDF#NaivePythonimplementationofthefunctionIneedimportscipyimportnumpyasnpdeft_log_cdf(x,df):p=scipy.stats.t.cdf(x,df=df)returnnp.log(......