摘要
通过 GraduatedSymbolsSymbology 类,可以访问用于更改图层分级符号系统外观的各种属性。
讨论
通过 GraduatedSymbolsSymbology 类,可访问用于在地图文档 (.mxd) 或图层文件 (.lyr) 中自动完成图层符号操作的某些属性和方法。一些诸如更改类的数量、修改分类间隔值与标注或更改符号系统所基于的字段的基本操作都是其中一些可以修改的属性。要访问图层符号系统的所有属性和设置,例如更改个别类的单个符号,首先需要在 ArcMap 用户界面中进行这些更改,然后将它们保存到图层文件中。随后可使用 UpdateLayer 函数将这些自定义设置应用于现有图层。
图层可以使用任意数量的符号系统,但并非所有符号系统都能进行修改。并非所有图层都能使用 GraduatedSymbolsSymbology 类,因此在对图层属性进行修改之前,需要先测试图层是否可以使用该符号系统类。为此,可以使用 Layer 类中的 symbologyType 属性。先测试图层的 symbologyType 是否为分级符号,(if lyr.symbologyType == "GRADUATED_SYMBOLS":),然后为该图层创建 GraduatedSymbolsSymbology 类的变量参考 (lyrSymbolClass = lyr.symbology)。
Layer 对象中的 symbologyType 为只读属性。换言之,无法将分级符号系统更改为分级色带或唯一值符号系统。只能更改图层中特定符号系统类的属性。更改符号系统类型的唯一方法是向图层文件发送所需结果并使用 UpdateLayer 函数。
无法更改分类方法。如果要使用不同的分类方法,需要预先创建图层文件并使用它们更新图层,然后再修改能够更改的属性。这个规则的唯一一种例外情况是在设置 classBreakValues 时。与 ArcMap 用户界面相似,明确设置 classBreakValues 后,分类方法将自动设为手动。同样与 ArcMap 用户界面相似,一旦分类方法设为手动,便无法更改 numClasses 参数。
与 ArcMap 用户界面不同的是,设置 classBreakValues 参数时可以设置一个最小值。classBreakValues 列表中的第一个值是最小值。所有其他值是出现在 ArcMap 用户界面中的分类间隔值。因此,classBreakValues 列表中的值总比 classBreakLabels 和 classBreakDescriptions 列表中多一个。
classBreakValues 列表、classBreakLabels 列表和 classBreakDescriptions 列表必须始终按由最小值到最大值的顺序排序。这也适用于按倒序创建的图层。
一个参数的设置往往会导致其他参数自动发生更改。例如,设置 numClasses、normalization 或 valueField 参数时,classBreakValues、classBreakLabels 和 classBreakDescriptions 属性将根据当前分类方法自动进行调整。因此,属性的修改顺序十分重要。
reclassify 方法可基于基础数据源更改图层符号系统的属性。对存储在另一个图层或图层文件 (.lyr) 中的符号系统使用 UpdateLayer 函数来更新图层的符号系统时,此方法非常有用。例如,假设您希望使用图层文件中存储的符号系统来更新地图文档中图层符号系统的颜色属性。而地图文档和图层文件中的图层具有不同的数据源。图层文件中的最小值和最大值以及分类间隔可能与地图文档中图层的值不同。使用图层文件中存储的符号系统来更新地图文档中图层的符号系统时,可能会产生一些意想不到的结果(例如,分类间隔值与图层文件中的数据源统计匹配,但却与地图文档中的数据源统计不符。)但是,如果在 UpdateLayer 之后使用 reclassify() 方法,则最终结果将与使用图层文件符号系统中的颜色属性时一样,但其他特征将基于地图文档中图层的基础源数据。
如果正通过 Python 窗口对这些符号系统进行修改并通过 CURRENT 引用地图文档,则可能无法立即查看 ArcMap 应用程序中的更改。要刷新地图文档,请尝试使用 RefreshActiveView 和 RefreshTOC 函数。
属性
属性 | 说明 | 数据类型 |
classBreakDescriptions (可读写) | 用于表示各个类别明细值描述(可有选择性地出现在地图文档图例中)的字符串的排序列表。只能在 ArcMap 用户界面中通过右键单击图层属性对话框的符号系统选项卡中显示的符号,然后选择编辑描述来访问这些值。排序列表中描述的数量必须始终比 classBreakValues 的数量少一个。这是因为 classBreakValues 列表还包括在用户界面中看不到的最小值。几乎对于其他所有类属性的更改均会影响这些值,因此最佳做法是最后设置这些值。 | List |
classBreakLabels (可读写) | 用于表示各个类别明细标注(显示在地图文档的内容列表和图例项目中)的字符串的排序列表。排序列表中标注的数量必须始终比 classBreakValues 的数量少一个。这是因为 classBreakValues 列表还包括在用户界面中看不到的最小值。几乎对于其他所有类别属性的更改均会影响这些值,因此最佳做法是最后设置这些值。 | List |
classBreakValues (可读写) | 包括表示类别明细的最小值和最大值的双精度值的排序列表。设置 classBreakValues 时,将自动设置 numClasses 属性,并将分类方法设置为手动,同时更新其他属性(如 classBreakLabels)。与 ArcMap 用户界面不同,您可以设置最小值。排序列表中的第一个值代表最小值,其余值是在用户界面中显示的类别明细;因此,classBreakValues 列表始终比 classBreakLabels 列表和 classBreakDescriptions 列表多一个项目。更改这个值将自动根据新信息调整其他符号系统属性。 | List |
normalization (可读写) | 表示用于归一化的有效数据集字段名称的字符串。更改这个值将自动根据新信息调整其他符号系统属性。可通过将值设置为 None(例如,lyr.symbology.normalization = None)来移除归一化字段。 | String |
numClasses (可读写) | 表示当前分类方法将要使用的类别数量的长整型值。更改此值将覆盖其他符号属性(如 classBreakValues 和 classBreakLabels)。如果分类方法是手动,则无法设置此值;因此,不应在 classBreakValues 属性之后调用 numClasses,因为该属性会将分类方法自动设置为手动。更改这个值将自动根据新信息调整其他符号系统属性。 | Long |
valueField (可读写) | 表示用于图层分类符号系统的有效数据集字段名称的字符串。更改这个值将自动根据新信息调整其他符号系统属性。 | String |
方法概述
方法 | 说明 |
reclassify () | 将图层符号系统重置为图层数据源信息和统计数据。 |
方法
reclassify ()
reclassify 方法可基于基础数据源更新图层的符号系统属性。对存储在另一个图层或图层文件 (.lyr) 中的符号系统使用 UpdateLayer 函数来更新图层的符号系统时,此方法非常有用。此方法将基于图层的实际数据源信息和统计数据而不是图层文件中保留的信息来自动更新符号系统属性。使用此方法时需要格外小心,因为它可能会覆盖其他符号系统属性。reclassify 方法将重新生成 classBreakValues、classBreakLabels 和 classBreakDescriptions。它不影响 numClasses 或 normalization。reclassify 方法对手动分类也没有影响。
代码示例
GraduatedSymbolsSymbology 示例 1
以下脚本修改了地图文档中所有图层的符号系统。它遍历每个图层,更改字段值和类的数量并保存地图文档。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
for lyr in arcpy.mapping.ListLayers(mxd):
if lyr.symbologyType == "GRADUATED_SYMBOLS":
lyr.symbology.valueField = "POP2007"
lyr.symbology.numClasses = 5
del mxd
GraduatedSymbolsSymbology 示例 2
以下脚本修改了地图文档中某个图层的符号系统。首先,它通过 UpdateLayer 函数,使用磁盘中的图层文件更新图层的符号系统。然后,验证图层是否具有分级符号系统。最后,利用此脚本修改 GraduatedSymbolsSymbology 类中的各种属性,并将结果导出到 PDF 中。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Census")[0]
lyr = arcpy.mapping.ListLayers(mxd, "StatePopulation", df)[0]
lyrFile = arcpy.mapping.Layer(r"C:\Project\LYRs\Population.lyr")
arcpy.mapping.UpdateLayer(df, lyr, lyrFile, True)
if lyr.symbologyType == "GRADUATED_SYMBOLS":
lyr.symbology.valueField = "POP2000"
lyr.symbology.classBreakValues = [250000, 999999, 4999999, 9999999, 35000000]
lyr.symbology.classBreakLabels = ["250,000 to 999,999", "1,000,000 to 4,999,999",
"5,000,000 to 9,999,999", "10,000,000 to 35,000,000"]
arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Output\StatePopulation.pdf")
del mxd, lyrFile