11 地图脚本 map scripting

11.1 介绍

本章介绍 ArcPy 映射模块,也称为 arcpy.mp。该模块的主要目的是操作现有项目 (.aprx) 和图层文件 (.lyrx) 的内容。这包括使用地图、图层和表格;应用符号学;和管理布局。
注意:尽管该模块被称为“映射”模块,但这个名称可能会造成混淆。 ArcGIS Desktop 10.x 中 ArcPy 中的模块称为 arcpy.mapping,但 ArcGIS Pro 的功能变化很大,该模块被替换为 arcpy.mp 模块。然而,更一般地说,该模块的目的是相同的——即自动化映射任务。因此,它仍然被称为“映射”模块,尽管实际名称是 arcpy.mp。
映射模块包含许多函数和类。需要非常熟悉 ArcGIS Pro 中与地图相关的任务才能利用 Python 的地图模块,因为许多函数和类复制了 ArcGIS Pro 应用程序中的典型工作流。

11.2 使用 ArcPy mapping模块

ArcPy 制图模块自动化 ArcGIS Pro 工作流以加快重复性任务。 ArcPy 映射模块的一些典型使用示例如下:

查找具有特定数据源的图层并将其替换为另一个数据源

在多个地图中修改特定图层的显示属性

生成描述项目内容的报告,包括地图、图层、表格和布局

搜索和替换文本项目中多个布局中的字符串

高度可视化的 ArcGIS Pro 环境是用于创建新工程以及在工程中创建地图、图层和布局的推荐应用程序。但是,一旦创建它们,ArcPy 映射模块就可以自动执行某些映射任务,尤其是跨多个元素的重复性任务。
ArcPy 制图模块允许您自动执行通常使用 ArcGIS Pro 执行的许多任务。
使用 ArcPy 制图模块遵循 ArcGIS Pro 会话中使用的工作流。
例如,典型的工作流程包括打开项目、修改地图属性、添加图层、修改该图层的属性、更改布局的多个元素,然后将该布局导出到 PDF 文件。使用 ArcPy 映射模块的函数和类的脚本会自动执行这些步骤。

11.3 参考项目

ArcGIS Pro 中的工程以 .aprx 文件的形式存储在磁盘上,例如 C:\Mapping\Study.aprx。除了包含单个图层属性的图层文件 (.lyrx) 之外,ArcPy 映射模块还允许您引用和操作 .aprx 文件。
使用 ArcPy 映射模块开始处理工程的方法有两种:(1) 引用存储在磁盘上的现有 .aprx 文件,或 (2) 使用当前 ArcGIS Pro 会话中的工程。 arcpy.mp.ArcGISProject() 函数实现了这两者。这个函数的语法是:

arcpy.mp.ArcGISProject(aprx_path)

aprx_path 参数是一个字符串,表示磁盘上 .aprx 文件的完整路径。以下代码引用了一个 ArcGIS Pro 工程:

aprx = arcpy.mp.ArcGISProject("C:/Mapping/Study.aprx")

此处选择的变量名与文件扩展名相同,但不需要这种命名方式。你可以给它起任何其他的名字(例如,project 或 myproject),但是 aprx 简短而清晰,因此你会在许多示例脚本中看到它,包括在本书中。

这种方法是通用的,因为它既适用于 ArcGIS Pro 应用程序,也适用于独立脚本。因此,这种语法是最广泛使用和推荐的方法。

要在 ArcGIS Pro 中使用当前工程,请使用关键字 CURRENT(全部大写):

aprx = arcpy.mp.ArcGISProject("CURRENT")

要使用 CURRENT 关键字,ArcGIS Pro 必须正在运行,并且此方法只能在 ArcGIS Pro 应用程序中使用。这包括在 ArcGIS Pro 的 Python 窗口中运行代码或运行脚本工具。 CURRENT 关键字不适用于独立脚本,因为 ArcGIS Pro 应用程序在运行时无法识别。
使用现有 .aprx 文件时,脚本可以独立于 ArcGIS Pro 运行。建议使用系统路径打开 ArcGIS Pro 工程,因为它可以使您的代码更加通用,并且可以更好地控制脚本的运行方式。尽管如此,使用 CURRENT 关键字对于在 Python 窗口中快速测试代码很有用。每当您看到示例脚本中使用的 CURRENT 关键字时,通常可以将其替换为 .aprx 文件的完整路径。

ArcGISProject() 函数返回一个 ArcGISProject 对象。换句话说,ArcGISProject 既是 arcpy.mp 模块的一个函数,也是一个类。 ArcGISProject 类提供对项目的许多不同属性和方法的访问。该类还提供对项目中其他对象的访问。例如,要获取地图、图层或布局,您必须首先引用 ArcGISProject 对象。因此,ArcGISProject 对象通常是在映射脚本中创建的第一个对象引用。

一旦创建了 ArcGISProject 对象,就可以读取和修改项目的属性。在查看这些更改是如何进行的之前,首先要考虑它们是如何保存的。如果您在 ArcGIS Pro 中处理工程并进行更改(例如添加图层),则有两种方法可以保存 .aprx 文件:保存和另存为。使用 Save 时,更改将保存到同一个 .aprx 文件;当使用另存为时,更改将保存到您指定的新 .aprx 文件中。在脚本环境中,ArcGISProject 对象使用 save() 和 saveACopy() 方法。 saveACopy() 方法的作用与 ArcGIS Pro 应用程序中的另存为选项相同。

在脚本中引用 ArcGISProject 对象时,.aprx 文件将被锁定。此锁可防止其他应用程序对文件进行更改。因此,当脚本中不再需要对项目的引用时,最好使用 Python del 语句删除对项目的引用。此语句不会删除实际的 .aprx 文件,只会删除对内存中对象的引用。因此,映射脚本通常具有如下结构:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Study.aprx")
<code that modifies project properties>
aprx.save()
del aprx

当脚本完成运行时,Python 会自动删除对对象的引用,因此 del 语句不是必需的,但仍会减少不必要的锁定的可能性。
本章中的大多数示例代码都引用了磁盘上的 .aprx 文件,而不是使用 CURRENT 关键字。尽管如此,大多数示例也可以使用 CURRENT 关键字在 Python 窗口中运行。

要引用磁盘上的 .aprx 文件,您必须提供完整路径,例如 C:\Mapping\Study.aprx。
与使用数据集和其他文件相反,为 .aprx 文件设置工作区是不够的。
考虑以下代码:

import arcpy
arcpy.env.workspace = "C:/Mapping"
aprx = arcpy.mp.ArcGISProject("Study.aprx")

除非脚本与 .aprx 文件位于同一文件夹中,否则设置工作区无效并产生错误。换句话说,诸如 arcpy.mp.ArcGISProject("Study .aprx") 之类的引用仅在脚本和 .aprx 文件位于同一文件夹中时才有效。否则,您必须提供完整路径。但是,许多脚本出于其他原因使用工作区。如果 .aprx 文件位于同一工作区中,您可以使用以下代码来引用完整路径:

import arcpy
import os
ws = "C:/Mapping"
arcpy.env.workspace = ws
aprxpath = os.path.join(ws, "Study.aprx")
aprx = arcpy.mp.ArcGISProject(aprxpath)

本章中的示例通常对完整路径进行硬编码

11.4 访问项目属性和方法

ArcGISProject 对象的属性包括基本的描述性属性,例如 activeMap(与焦点视图关联的地图)、dateSaved(上次保存项目的日期)、documentVersion(上次保存时的文档版本)和 filePath (完整的项目路径和文件名)。
这些属性都是只读的。其他几个属性是可读写的,包括 defaultGeodatabase(项目的默认地理数据库位置)、defaultToolbox(项目的默认工具箱)和 homeFolder(项目的主文件夹位置)。
例如,以下代码打印一些只读属性:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
print(aprx.documentVersion)
print(aprx.filePath)
del aprx

del 语句确保删除项目锁定。
脚本的打印输出如下:

2.5.0
C:/Mapping/Demo.aprx

要更改其中一个读写属性,必须为该属性分配一个新值,并且必须保存项目,如下所示:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
aprx.defaultGeodatabase = "C:/Mapping/Data.gdb"
aprx.save()
del aprx

尽管第三行代码看起来像一个简单的赋值语句,但该代码验证了地理数据库的完整路径和文件名。如果地理数据库不存在,则赋值语句会导致错误。
当您查看这些示例时,请记住它们可用于自动化更复杂的任务,例如更改多个项目而不仅仅是一个项目。

除了属性之外,ArcGISProject 对象还提供了几个方法,包括已经提到的 save() 和 saveACopy() 方法,以及处理项目内容的方法
这些方法在这里进行了一些详细的回顾。

importDocument() 方法可以将地图文档(.mxd 文件)、globe 文档(.3dd 文件)和场景文档 (.sxd) 导入到工程中。 ArcGIS Desktop 10.x 使用单独的应用程序来处理这些文档,即分别为 ArcMap、ArcGlobe 和 ArcScene。这些应用程序的功能已集成到 ArcGIS Pro。您还可以导入地图文件 (.mapx)、布局文件 (.pagx) 和报告文件 (.rptx) 的内容。该方法的语法如下:

ArcGISProject.importDocument(document_path, {include_layout},
                                    {reuse_existing_maps})

document_path 变量由一个字符串组成,该字符串表示文档的完整路径和名称。
您一次只能导入一个文档,因此要导入多个文档,您必须重复该方法。地图文档始终包含布局,而globe 文档和场景文档不包含。可选的 include_layout 参数是一个布尔值,用于指示是否要导入布局。默认值为真。如果此参数设置为 False,则仅将地图文档的数据框导入为地图,而不是布局。可选的reuse_existing_maps 参数是一个布尔值,以避免在导入布局文件(.pagx) 时复制地图。以下示例说明了如何导入地图文档:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
aprx.importDocument("C:/Mapping/Austin.mxd")
aprx.saveACopy("C:/Mapping/Demo_copy.aprx")
del aprx

地图文档由一个或多个数据框和一种布局组成。原始数据框和布局将转换为 ArcGIS Pro 地图和布局格式。在 Python 中使用此方法导入地图文档类似于在 ArcGIS Pro 中执行相同的任务。在 ArcGIS Pro 的目录窗格中,导航到 .mxd 文件,单击鼠标右键,然后单击导入并打开。 arcpy.mp 模块尝试在 ArcGIS Pro 中复制其中一些映射工作流,但存在差异。在这种情况下,importDocument() 方法为您提供排除布局的选项(在 ArcGIS Pro 中使用 Import and Open 是不可能的),而在 ArcGIS Pro 中使用 Import and Open 会打开其中一个地图或视图中的布局(这 importDocument() 不这样做)。

导入地图文档时,识别您正在导入的内容非常重要。 .mxd 文件中的每个数据框都成为 .aprx 文件中的地图。此地图包括所有图层及其符号系统。 .mxd 文件中的唯一布局成为 .aprx 文件中的布局。此布局包括所有布局元素,包括比例尺、图例等。您没有导入任何数据文件。图层继续引用相同的数据源,并且不会复制任何数据文件。

ArcGISProject 类包括两种处理损坏数据源的方法:
listBrokenDataSources()updateConnectionProperties()。 ArcGISProject 类的其余方法用于列出项目的内容。这些方法包括以下内容:
listColorRamps()—返回 ColorRamp 对象列表
listLayouts()—返回 Layout 对象列表
listMaps()—返回 Map 对象列表
listReports()—返回 Report 对象列表

这些方法返回一个对象列表,因此其工作方式类似于 ArcPy 中的列表函数。但是,它们不是 arcpy.mp 的函数,而是 ArcGISProject 对象的方法。这些方法返回一个对象列表,每种类型的对象对应于 arcpy.mp 模块的一个类。以下部分介绍如何使用这些方法和生成的对象。

arcpy.mp 模块的限制之一是它不能用于从头开始创作新项目,您只能使用现有项目。同样,您不能创建项目的许多其他典型元素,包括地图、布局和布局元素。一个例外是 GraphicElement 和 TextElement 对象都有一个 clone() 方法来在布局上创建这些元素的副本。 arcpy.mp 模块的设计原则是使用 ArcGIS Pro 应用程序创作项目及其内容,然后使用 arcpy.mp 自动执行重复性任务,例如修改地图属性、添加图层、应用符号系统和导出布局.

如果您需要在脚本中从头开始一个新工程,一种解决方法是在 ArcGIS Pro 中创作一个基本模板工程。该项目将仅包含最少的元素,即至少一张地图和一种布局,然后您可以使用 arcpy.mp 操作内容。

11.5 Working with maps

ArcGIS Pro 中的地图表示符号化地理数据图层和表格数据的集合。一个项目包含一个或多个地图,每个地图通常包含一个或多个图层和或表格。
地图、图层和表格是在列表中使用的完美对象,可以帮助自动执行任务。
要在 ArcGIS Pro 中可视化地图的内容,请打开地图视图或将地图框添加到布局中。
同一张地图可以显示在多个地图视图或地图框中。更改地图的图层也会更改引用该地图的所有地图视图和地图框。使用 ArcGISProject 类的 listMaps() 方法访问地图。此方法返回项目中的 Map 对象列表。语法是:

ArcGISProject.listMaps({wild_card})

该方法可以简称为 listMaps() 而不是 ArcGISProject.listMaps()。
但是,映射模块有几个类,每个类都有几个方法。其中一些方法具有相同的名称,而另一些则非常相似。为避免混淆,本章中对方法的引用在解释语法时使用 . 表示法以明确该方法属于哪个对象。
在项目中获得地图列表后,您可以检查它们或修改它们的属性。运行以下代码会打印项目中所有地图的列表:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
maps = aprx.listMaps()
for m in maps:
    print(m.name)
del aprx

关于变量命名的注释是有序的。前面的示例代码将变量名 maps 用于映射列表,但此列表可以称为其他任何名称,例如 mymaps 或 maplist。在示例脚本中迭代映射列表时,使用变量名 m。直观地说, map 将是一个很好的变量名。然而,map() 是 Python 的内置函数之一。它将一个函数应用于一个可迭代对象的所有元素,并返回一个映射对象。此函数及其返回的对象与 ArcGIS Pro 中的地图完全不同。在您的代码中使用变量 map 会与能够使用 map() 函数发生冲突,并且通常,使用内置函数和关键字作为变量名是一种糟糕的编码习惯。因此,无论变量名称映射看起来多么直观,都不应该在您的脚本中使用它。本章中的示例大多使用变量名 m 来代替,但好的替代品是 mymap、map1、newmap 等。另一种选择是使用 mp,但这个名称可能会导致混淆,因为这是映射模块本身的名称。

在 ArcGIS Pro 中,可以有多个使用相同名称的地图。尝试在 Python 中引用地图时,相同的名称会变得令人困惑,因此为每个地图命名非常重要,以便可以使用 name 属性来引用它们。

如果您只想使用其中一张地图,可以使用其索引号,如下所示:

m = aprx.listMaps()[2]

地图列表的顺序与 ArcGIS Pro 中使用的顺序相同,即按字母顺序。您还可以使用 ArcGISProject.listMaps() 方法的可选 wild_card 属性根据地图名称过滤结果列表。但是请记住,ArcGISProject.listMaps() 始终返回 Map 对象的列表,即使该列表仅包含一个地图。因此,即使在过滤列表获取单个地图时,仍必须使用索引从列表中获取地图。例如,以下代码获取一个名为 Parks 的 Map 对象:

m_parks = aprx.listMaps("Parks")[0]

索引零 [0] 从列表中获取第一个(也是唯一一个)映射。
通配符不区分大小写,您可以使用星号和字符的组合来限制结果。例如,“parks”与“Parks”相同,而“Park*”会将结果限制为以字符“Park”开头的地图,包括“Park”、“Parks”、“Park Management”等.

访问地图的另一种方法是使用 MapFrame 对象。地图框是布局中用于显示地图内容的元素。您可以列出布局中的所有地图框,然后通过 MapFrame 对象的属性访问与地图框关联的地图。因此,获取 Map 对象的两种方法是 ArcGISProject.listMaps() 方法和 MapFrame.map 属性。前者返回地图列表,而后者返回单个地图。第 11.11 和 11.12 节提供了有关使用布局和地图框的更多信息。您可以使用 arcpy.mp 处理工程中的地图和地图框,但无法访问地图视图。 arcpy.mp 模块包含一个 MapView 类,但它打印或访问不包含页面布局元素且独立于保存到项目中的任何地图视图的 web 地图。

一个 Map 对象有几个属性。您已经看到了 name 属性,它是可读写的。
其他重要的属性包括 mapType、mapUnits 和 referenceScale。 mapType 属性是只读的,对于 2D 地图返回字符串值 MAP,对于 3D 地图返回 SCENE。地图类型很重要,因为类型会影响如何在地图上使用相机。相机控制显示属性,例如 2D 地图的比例和范围以及 3D 地图的查看位置。 mapUnits 属性是只读的,并返回一个字符串,其中包含为地图设置的地图单位。 referenceScale 是可读写的,可以访问地图的参考比例。以下代码读取这些属性:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
print(m.mapType)
print(m.mapUnits)
print(m.referenceScale)
del aprx

一个典型的结果如下所示:

MAP
Foot_US
100000.0

Map 对象也有几个方法来管理它的内容。大多数这些方法分为两大类:添加、删除或重新排列图层和表格的方法,以及列出现有图层和表格的方法。操作地图中图层的最相关方法如下:
addBasemap() - 在地图中添加或替换底图图层
addDataFromPath() - 通过提供本地路径或 URL 将图层添加到地图
addLayer() - 使用基本放置选项将图层添加到地图
addTable() - 添加表格到地图
insertLayer() - 通过指定特定位置将图层添加到地图
moveLayer() - 将图层或图层组移动到图层堆栈中的特定位置
removeLayer() - 从地图中删除图层
removeTable() — 从地图中删除表格
关于使用图层的下一节将更详细地重新审视这些方法中最重要的方法。
列出地图内容的两种方法是 Map.listLayers()(返回 Layer 对象列表)和 Map.listTables()(返回 Table 对象列表)。
各种方法经常一起工作。例如,您可以使用 Map.listLayers() 获取地图中的特定图层,然后使用 Map.addLayer() 或 Map.insertLayer() 将此图层对象添加到同一项目中的不同地图中。
您可能还注意到 arcpy.mp 模块的工作方式。您创建一个对象(例如,ArcGISProject),然后使用对象的列表方法(例如,ArcGISProject .listMaps())来获取特定元素(例如,地图对象)。该方法返回一个对象列表,您可以使用另一个列表方法(例如 Map.listLayers())来获取下一个元素(例如 Layer 对象)。该组织为您的代码提供了面向对象的流程。此流程与 ArcPy 的其他方面有些不同,后者使用独立的列表函数(例如 ListFeatureClasses())而不是方法。

11.6 Working with layers

ArcGIS Pro 中的地图通常包含一个或多个图层。图层是对数据源(例如 shapefile、地理数据库要素类或栅格)的引用,用于定义数据在地图上的符号化方式。
arcpy.mp 中的两个类与图层一起使用:Layer 和 LayerFile。这两种类型的对象都用于管理图层,它们的许多属性和方法都相似。每个都反映了对参考层的略微不同的方法,本节将对此进行说明。
可以使用 Map.listLayers() 方法访问地图中的图层。语法是

Map.listLayers({wildcard})

没有必需的参数。可选通配符参数可用于限制结果。该方法返回具有属性和方法的图层对象列表。例如,以下代码遍历项目中的地图,然后打印每个地图中所有图层的名称:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
maps = aprx.listMaps()
for m in maps:
    print("Map: " + m.name)
    lyrs = m.listLayers()
    for lyr in lyrs:
        print(lyr.name)
del aprx

您可以使用索引和/或通配符参数来引用特定图层。例如,以下代码在名为 Parks 的地图中返回一个名为 city_parks 的图层,并打印该图层的数据源:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
parklyr = m.listLayers("city_parks")[0]
print(parklyr.dataSource)

因为列表方法返回 Python 列表,所以需要索引零 [0] 来返回地图对象和列表对象,而不是列表。地图中图层的索引号是根据内容列表中图层从上到下的顺序生成的。
结果数据源是

C:\Mapping\Data.gdb\city_parks

图层对象有很多属性,您已经看到了名称和数据源。但是,ArcGIS Pro 中有许多不同类型的图层代表不同类型的数据。 arcpy.mp 模块使用单个 Layer 对象来表示所有类型。 ArcGIS Pro 中的不同图层类型包括 3D 图层、底图图层、要素图层、图层组、网络分析图层、网络数据集图层、栅格图层和 web 图层。不是使用单个图层类型属性,而是使用 is* 属性确定图层的类型,即 is3DLayer、isBasemapLayer、isFeatureLayer 等。这些属性根据图层是否为该类型返回布尔值。由于缺少确定图层类型的单一属性,因此确定地图中图层的类型很麻烦,因为您必须使用一系列 if 语句检查每种类型。例如,考虑具有多个图层的地图。
11 地图脚本 map scripting_第1张图片
以下代码检查层的三种不同类型:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
lyrs = m.listLayers()
for lyr in lyrs:
    if lyr.isBasemapLayer:
        print(lyr.name + " is a basemap layer")
    if lyr.isFeatureLayer:
        print(lyr.name + " is a feature layer")
    if lyr.isRasterLayer:
        print(lyr.name + " is a raster layer")
del aprx

The result prints as follows:

historical_landmarks is a feature layer
city_parks is a feature layer
World Topographic Map is a basemap layer

该脚本仅考虑一些最常见的图层类型。图层类型很重要,因为并非所有图层都支持所有属性。例如,definitionQuery 属性(图层的定义查询)适用于要素图层,但不适用于栅格图层。因此,通常在使用某些属性之前检查图层的图层类型。
一些专门的图层类型没有 is* 属性,包括注记、尺寸要素、地形数据集、拓扑数据集等。因为您无法确定这些层的类型,您可能需要在尝试获取或设置其值之前检查特定层是否支持某个属性。
确定层类型的另一种方法是使用 Layer 对象上的 supports() 方法来测试层是否支持特定属性,然后再尝试将属性应用于该层。此测试比首先确定图层类型,然后确定属性是否适用于该类型更容易。 supports() 方法的语法是

Layer.supports(layer_property)

supports() 方法返回一个布尔值来指示图层是否支持该属性。
您一次只能测试一个属性。并非所有属性都必须使用 support() 进行测试。例如,如果该图层类型不支持该图层属性,则布尔属性返回 False 值,因此您可以直接检查该属性,而无需先使用 support()。
以下示例代码确定地图中的图层是否支持定义查询:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
lyrs = m.listLayers()
for lyr in lyrs:
    dq = str(lyr.supports("DEFINITIONQUERY"))
    print(lyr.name + " supports definition query: " + dq)
del aprx

The result prints as follows:

historical_landmarks supports definition query: True
city_parks supports definition query: True
World Topographic Map supports definition query: False

support() 方法的使用大大减少了错误捕获的需要,因为您可以提前确定特定属性是否适用于特定层。
图层对象的其他几个属性也很有趣,尤其是与显示和符号系统相关的属性:
亮度brightness - 介于 -100 和 100 之间的整数值
对比度contrast - 介于 -100 和 100 之间的整数值
showLabels - 用于绘制标注或不绘制符号的布尔值
symbology- 提供对图层符号系统的访问并返回符号系统
对象透明度transparency - 介于 0 和 10 之间的整数值100
visible - 用于绘制图层的布尔值

所有这些属性都是可读写的。整数属性是使用 supports() 方法检查的典型属性。以下示例代码测试图层是否支持透明度,如果支持,则将透明度属性设置为 50%:

 import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
lyr = m.listLayers("city_parks")[0]
if lyr.supports("TRANSPARENCY"):
    lyr.transparency = 50
aprx.save()
del aprx

回想一下,要使项目的更改生效,需要 save() 方法。您还可以使用 saveACopy() 并为新项目指定名称。
除了 support() 之外,Layer 对象还有其他几种方法。这些方法包括将图层保存到磁盘上的图层文件 (.lyrx) 的 saveACopy() 方法。保存图层的副本可以在不同的项目中使用图层。
如本节开头所述,还有另一个类可以处理图层:LayerFile。 arcpy.mp.LayerFile() 函数引用磁盘上的图层文件(.lyr 或 .lyrx)。这种方法类似于引用项目文件 (.aprx) 的方式。 LayerFile() 函数的语法是:

arcpy.mp.LayerFile(lyr_file_path)

LayerFile() 函数的参数是现有 .lyr 或 .lyrx 文件的完整路径和文件名。
例如:

lyrx = arcpy.mp.LayerFile("C:/Mapping/examplelyr.lyrx")

LayerFile() 函数返回一个LayerFile 对象,也就是说LayerFile 既是arcpy.mp 的一个函数又是一个类。 LayerFile 类包括属性和方法,以提供对图层文件中包含的各个图层的访问。
图层文件可以包含一个或多个图层。每个层还可以包括组层。这些特性使得使用图层文件相对复杂。本章中使用的大多数示例代码都假定图层文件仅包含一个单独的图层。有关在图层文件中使用多个图层和图层组的详细信息,请参阅 ArcGIS Pro 帮助页面的 LayerFile 类和函数。

ArcGIS Pro 可以读取 .lyr 和 .lyrx 文件。 .lyr 格式是 ArcGIS Desktop 10.x 的旧格式。 .lyr 和 .lyrx 文件之间存在显着差异,它们不能互换使用。因此,在 ArcGIS Pro 中,您只能保存 .lyrx 文件。因此,如果您要更改 .lyr 文件,则必须使用 LayerFile.saveACopy() 方法保存更改。另一方面,在 ArcGIS Pro 中使用旧的 .lyr 文件添加图层或为现有图层分配符号系统相对容易,并且可以将图层及其符号系统保存为工程的一部分,而无需将它们另存为.lyrx 文件。
图层名称可能会造成混淆。图层的名称显示在 ArcGIS Pro 的内容窗格中。此名称可能与图层的源数据集名称相同,也可能不同。默认情况下,将数据集添加到地图时,图层的名称与源数据集的名称相同,但可以更改图层名称。在任何情况下,图层的名称都没有文件扩展名。例如,要素类的名称可以是 Hospitals.shp,但作为 ArcGIS Pro 中的图层,默认情况下图层的名称是医院。

另请记住,字符串区分大小写。为了使您的语句不区分大小写,您可以使用基本的字符串运算符。例如:

if lyr.name.lower() == "hospitals":

其他几个图层属性涉及名称。 dataSource 属性返回图层源的完整路径,其中包括完整的工作空间路径和数据集的名称。例如,对于在内容窗格中显示为 Hospitals 的图层,name 属性将为 Hospitals,而 dataSource 属性可能为 C:\Data\hospitals.shp。 dataSource 属性是只读的,而 name 属性是可读写的。最后,还有 longName 属性,它对于描述图层组很有用,因为它包含图层组文件夹结构。

你可能感兴趣的:(Arcgis,Pro脚本学习,ArcPy,ArcGIS,Pro,python)