Symbology

摘要

正是通过 Symbology 类,您可以访问要素图层的渲染器或栅格图层的着色器。

说明

典型的工作流是参考图层的 symbology,进行更改,然后将更改应用回图层。

重要的是,应首先确保图层支持渲染器或着色器并在对其进行更新之前了解其类型。 为此,可使用内置 hasattr 函数。

arcpy.mp 中当前支持的要素图层渲染器如下:SimpleRendererGraduatedColorsRendererGraduatedSymbolsRendererUnclassedColorsRendererUniqueValueRenderer。 支持以下栅格着色器:RasterClassifyColorizerRasterStretchColorizerRasterUniqueValueColorizer

支持的渲染器和着色器仅显示一组基本属性。 可以使用 CIM 访问其他属性。 Layer 类具有 getSymbologyDefinitionsetSymbologyDefinition 方法。 这些方法可用于更新不受支持的 arcpy.mp 渲染器或着色器,方法为进行直接的 CIM 更改或交换出从 MapLayerFile 中的另一个图层引用的符号系统。 下面的第三个和第四个代码示例演示了这些工作流。

属性

属性说明数据类型
colorizer
(只读)

获取栅格图层的着色器对象。支持的类型为:RasterClassifyColorizerRasterUniqueValueColorizer

Object
renderer
(只读)

获取要素图层的渲染器对象。支持的类型为:GraduatedColorsRendererGraduatedSymbolsRendererSimpleRendererUniqueValueRenderer

Object

方法概述

方法说明
updateColorizer (colorizer_name)

updateColorizer 方法用于更改栅格图层的着色器。

updateRenderer (renderer_name)

updateRenderer 方法用于更改图层渲染器。

方法

updateColorizer (colorizer_name)
参数说明数据类型
colorizer_name

The supported renderers are as follows:

  • RasterClassifyColorizerA raster classify colorizer.
  • RasterStretchColorizerA raster stretch colorizer.
  • RasterUniqueValueColorizerA raster unique value colorizer.
String

您仅可以将支持的着色器更新为支持的着色器。 例如,您可以将栅格分类着色器更新为栅格唯一值着色器(反之亦然),但您无法将其更新为栅格离散着色器,因为该着色器当前不受支持。

updateRenderer (renderer_name)
参数说明数据类型
renderer_name

The supported renderers are as follows:

  • GraduatedColorsRendererA graduated colors renderer
  • GraduatedSymbolsRendererA graduated symbols renderer
  • SimpleRendererA single symbol renderer
  • UnclassedColorsRendererAn unclassed colors renderer
  • UniqueValueRendererA unique value renderer
String

SimpleRenderer 与您在应用程序中所见的单一符号渲染器相同。 此名称用于与 .NET API 保持一致。

代码示例

符号系统示例 1

以下脚本会遍历每个要素图层并使用 hasattr 函数测试其 symbology 是否支持 renderer 属性。 接下来,如果渲染器 typeSimpleRenderer,则脚本将会使用 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")
符号系统示例 2

以下脚本首先测试图层的符号系统是否支持 colorizer 属性,然后确认渲染器是否为 RasterClassifyColorizer。 接下来,将更改 classificationFieldbreakCount。 最后,将 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')
符号系统示例 3

以下脚本演示了如何使用 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
符号系统示例 4

以下脚本演示了如何使用 Python CIM 访问应用不受支持的渲染器。 图层文件中的饼图渲染器将通过 getSymbologyDefinitionsetSymbologyDefinition 方法应用于地图中的单一符号渲染器。

import os
p = arcpy.mp.ArcGISProject('current')
m = p.listMaps('Renderers')[0]

relpath = p.homeFolder

#Reference the two layers
l1 = m.listLayers('Counties_SingleSymbol')[0]
l2 = arcpy.mp.LayerFile(os.path.join(relpath, "LYRXs", "Counties_PieChart_MalesFemales.lyrx")).listLayers()[0]

#Set single symbol to Pie chart (from LYRX)
l1.setSymbologyDefinition(l2.getSymbologyDefinition('V3'))