描述
正是通过 Symbology 类,您可以访问要素图层的渲染器或栅格图层的着色器。
讨论
典型的工作流是参考图层的 symbology,进行更改,然后将更改应用回图层。
重要的是,应首先确保图层支持渲染器或着色器并在对其进行更新之前了解其类型。此时,可使用 hasattr 函数。
目前,arcpy.mp 中支持以下要素图层渲染器:SimpleRenderer、GraduatedColorsRenderer、GraduatedSymbolsRenderer、UnclassedColorsRenderer 和 UniqueValueRenderer。
支持以下栅格着色器:RasterClassifyColorizer、RasterStretchColorizer 和 RasterUniqueValueColorizer。
注:
受支持的渲染器和着色器仅显示基本属性。可以使用 CIM 访问其他属性。有关详细信息以及以下代码示例,请参阅 Python CIM 访问帮助主题。属性
属性 | 说明 | 数据类型 |
colorizer (只读) | 获取栅格图层的着色器对象。支持的类型为:RasterClassifyColorizer 和 RasterUniqueValueColorizer。 | Object |
renderer (只读) | 获取要素图层的渲染器对象。支持的类型为:GraduatedColorsRenderer、GraduatedSymbolsRenderer、SimpleRenderer 或 UniqueValueRenderer。 | Object |
方法概述
方法 | 说明 |
updateColorizer (colorizer_name) | 该 updateColorizer 方法用于更改栅格图层的着色器。 |
updateRenderer (renderer_name) | updateRenderer 方法用于更改图层渲染器。 |
方法
updateColorizer (colorizer_name)
参数 | 说明 | 数据类型 |
colorizer_name | 支持的渲染器如下:
| String |
您仅可以将支持的着色器更新为支持的着色器。例如,您可以将栅格分类着色器更新指栅格唯一值着色器(反之亦然),但您无法将其更新为栅格拉伸着色器,因为该着色器当前不受支持。
updateRenderer (renderer_name)
参数 | 说明 | 数据类型 |
renderer_name | 支持的渲染器如下:
| String |
SimpleRenderer 和您在应用程序中所见的单一符号渲染器相同。此名称用于与 .NET API 保持一致。
代码示例
以下脚本会遍历每个要素图层并使用 hasattr 函数测试其 symbology 是否支持 renderer 属性。接下来,如果渲染器 type 是 SimpleRenderer,则脚本将会使用 updateRenderer 方法将其更改为 GraduatedColorsRenderer,然后将其 breakCount 值设置为 6。最后,脚本会在保存结果之前将符号系统应用回图层。
import arcpy, os, sys
relpath = os.path.dirname(sys.argv[0])
p = arcpy.mp.ArcGISProject(relpath + r'\\Symbol.aprx')
m = p.listMaps('Map')[0]
for lyr in m.listLayers():
if lyr.isFeatureLayer:
sym = lyr.symbology
if hasattr(sym, 'renderer'):
if sym.renderer.type == 'SimpleRenderer':
sym.updateRenderer('GraduatedColorsRenderer')
sym.renderer.breakCount = 6
lyr.symbology = sym
p.saveACopy(relpath + r"\\SavedOutput.aprx")
以下脚本首先测试图层的符号系统是否支持 colorizer 属性,然后确认渲染器是否为 RasterClassifyColorizer。接下来,将更改 classificationField 和 breakCount。最后,将 ColorRamp 更改为名为青色到紫色的色带。
import arcpy
import os
import sys
relpath = os.path.dirname(sys.argv[0])
p = arcpy.mp.ArcGISProject(relpath + r'\\RasterClassify.aprx')
m = p.listMaps('Map')[0]
l = m.listLayers('Raster1')[0]
sym = l.symbology
if hasattr(sym, 'colorizer'):
if sym.colorizer.type == 'RasterClassifyColorizer':
sym.colorizer.classificationField = 'Value'
sym.colorizer.breakCount = 7
sym.colorizer.colorRamp = p.listColorRamps('Cyan to Purple')[0]
l.symbology = sym
p.saveACopy(relpath + r'\\SavedOutput.aprx')
以下脚本演示了如何使用 Python CIM 访问来修改未在 arcpy.mp API 中显示的其他符号系统设置。该脚本将为面符号的轮廓符号图层添加虚线效果。该脚本将先获取图层的 CIM 定义。随后,该脚本将获取该图层的第一个符号图层,即轮廓符号。如果不存在图层效果,则该脚本将创建一个效果,然后修改虚线效果。最后,将 CIM 更改内容推送回该图层。有关 CIM 的详细信息,请参阅 Python CIM 访问帮助主题。
p = arcpy.mp.ArcGISProject('current')
m = p.listMaps('Symbology')[0]
l = m.listLayers('States_SingleSymbol')[0]
l_cim = l.getDefinition('V2') #Get the Layer's CIM definition
#Symbol Level 1 (Solid Stroke)
symLvl1 = l_cim.renderer.symbol.symbol.symbolLayers[0]
#If a dashed effect does not exist, create one
if len(symLvl1.effects) == 0:
newDash = arcpy.cim.CreateCIMObjectFromClassName('CIMGeometricEffectDashes', 'V2')
newDash.dashTemplate = [5, 5]
symLvl1.effects = [newDash]
#If a dashed effects does exist, modify it
else:
dash = symLvl1.effects[0]
dash.dashTemplate = [10, 10]
l.setDefinition(l_cim) #Set the Layer's CIM definition