摘要
GraduatedColorsSymbology 类可访问用于更改图层分级色彩符号系统外观的各种属性。
讨论
通过 GraduatedColorsSymbology 类,可访问用于在地图文档 (.mxd) 或图层文件 (.lyr) 中自动完成图层符号系统操作的某些属性和方法。一些基本操作(如更改类的数量、修改分类间隔值与标注或更改符号系统所基于的字段)可以对属性进行修改。要访问图层符号系统的所有属性和设置,例如更改单个类的单个符号,需要在 ArcMap 用户界面中进行操作,并将它们保存到图层文件中。随后可使用 UpdateLayer 函数将这些自定义更改应用于现有图层。
图层可以使用任意数量的符号系统,但并非所有符号系统都能进行修改。并非所有图层都使用 GraduatedColorsSymbology 类,因此在对图层属性进行修改之前,需要先测试该图层是否使用了该符号系统类。为此,可以使用 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 之后使用 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 方法对手动分类也没有影响。
代码实例
GraduatedColorsSymbology 示例 1
以下脚本修改了地图文档中所有分级色彩图层的符号系统。它遍历每个图层、更改值字段和类数量,并保存地图文档。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
for lyr in arcpy.mapping.ListLayers(mxd):
if lyr.symbologyType == "GRADUATED_COLORS":
lyr.symbology.valueField = "POP2007"
lyr.symbology.numClasses = 5
mxd.save()
del mxd
GraduatedColorsSymbology 示例 2
以下脚本修改了地图文档中某个图层的符号系统。首先,它通过 UpdateLayer 函数,使用磁盘中的某个图层文件更新当前图层的符号系统。图层文件包含应用于图层的自定义色带。然后,它将验证图层是否具有分级色彩符号系统。最后,修改 GraduatedColorsSymbology 类中的各种属性,并将结果导出至 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_COLORS":
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