Symbology

Краткая информация

С помощью класса Symbology вы можете получить доступ к способу отображения слоя или палитре растрового слоя.

Обсуждение

Типичный рабочий процесс: сослаться на symbology векторного слоя, выполнить изменения и затем применить эти изменения обратно к слою.

Важно сначала убедиться, что ваш слой поддерживает способ отображения или палитру, а также знать его тип перед выполнением обновлений. Для этой цели может быть использована встроенная функция hasattr.

Только следующие способы отображения векторного слоя поддерживаются на текущий момент в arcpy.mp: SimpleRenderer, GraduatedColorsRenderer, GraduatedSymbolsRenderer, UnclassedColorsRenderer и UniqueValueRenderer. Поддерживаются следующие палитры для растров: RasterClassifyColorizer, RasterStretchColorizer и RasterUniqueValueColorizer.

Поддерживаемые способы отображения и палитры предоставляют только базовый набор свойств. Дополнительные свойства доступны при использовании CIM. Для класса Layer доступны методы getSymbologyDefinition и setSymbologyDefinition. Эти методы могут быть использованы для обновления неподдерживаемых способов отображения или палитр arcpy.mp путем прямого внесения изменений в CIM либо замены условных обозначений, на которые есть ссылка из другого слоя в Map или LayerFile. Третий и четвертый примеры кода ниже демонстрируют эти рабочие процессы.

Свойства

СвойствоОписаниеТип данных
colorizer
(только чтение)

Получает объект палитры для растрового слоя. Поддерживаются следующие типы: RasterClassifyColorizer и RasterUniqueValueColorizer.

Object
renderer
(только чтение)

Получает объект способа отображения для векторного слоя. Поддерживаемые типы включают: GraduatedColorsRenderer, GraduatedSymbolsRenderer, SimpleRenderer или UniqueValueRenderer.

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

Следующий скрипт проходит через каждый векторный слой и тестирует, поддерживает ли его symbology свойство renderer, используя функцию hasattr. Затем, если способ отображения type является SimpleRenderer, он изменит его на GraduatedColorsRenderer с помощью метода updateRenderer, затем установит его значение 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. Далее изменяются 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')
Symbology, пример 3

В следующем скрипте показано, как использовать доступ Python CIM для модификации дополнительных настроек символов, не представленных в arcpy.mp API. Скрипт добавляет эффект пунктира к контуру символа слоя для полигональных символов. Сначала скрипт получает определение слоя CIM. Затем он получает первый символ слоя, который является символом контура. Если эффект в слое отсутствует, он создает его, а затем модифицирует, добавляя эффект пунктира. Наконец, изменения CIM возвращаются обратно в слой. Дополнительную информацию по CIM см. в разделе справки Python CIM Access.

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
Symbology, пример 4

Следующий скрипт демонстрирует, как использовать Доступ к CIM в Python для применения неподдерживаемого способа отображения. Способ отображения круговой диаграммы из файла слоя применяется к способу отображения Единый символ на карте с помощью методов getSymbologyDefinition и setSymbologyDefinition.

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'))