Краткая информация
Графические элементы — это базовые геометрические фигуры, такие как точки, линии и полигоны. Объект GraphicElement обеспечивает доступ к свойствам и методам управления графическими элементами в компоновке или в слое карты с графикой.
Обсуждение
Объект GraphicElement включает в себя такие элементы, как точки, линии и площадные фигуры, которые добавляются в компоновку или слой графики. Метод listElements для объекта Layout возвращает список Python объектов элементов компоновки страницы. Затем вы должны пройти по всем элементами списка или указать номер индекса для ссылки на определенный элемент. Чтобы вернуть список только объектов GraphicElement, используйте константу GRAPHIC_ELEMENT для параметра element_type. Значение wildcard также может быть использовано для дальнейшей тонкой настройки поиска на основе значения name элемента. Присвойте каждому элементу уникальное имя, чтобы на него можно было ссылаться с использованием скрипта ArcPy.
Используйте один из следующих методов для создания графических элементов:
- Метод createGraphicElement в классе ArcGISProject позволяет создать графический элемент, указав геометрию Multipoint, Point, Polygon или Polyline.
- Метод createPredefinedGraphicElement в классе ArcGISProject позволяет создать предварительно сконфигурированную форму, например, такую как круг, эллипс или треугольник. Создайте эти фигуры, указав значение Point или значение Polygon.
- Существующие графические элементы могут быть клонированы с помощью метода clone на объекте GraphicElement. Это полезно, потому что в некоторых случаях проще начать с существующего элемента. При клонировании элемента укажите значение suffix, чтобы позже клонированные элементы можно было идентифицировать с помощью метода listElements, использующего групповой символ и то же значение suffix. Возвращенный список элементов затем можно отредактировать или удалить с помощью метода delete.
Существует два основных метода определения геометрии, которая будет использоваться при создании графических элементов. Первый — это передача полной геометрии, которая определяет графический элемент. Это необходимо, например, при создании точечной, мультиточечной или пользовательской площадной формы. При создании преднастроенной формы, такой как прямоугольник, можно вместо этого ввести точечную геометрию и задать свойства elementWidth и elementHeight для завершения желаемой формы, вместо того чтобы вычислять и передавать все координаты, необходимые для создания геометрии. Координата точки будет представлять положение anchor элемента и сохраняется в свойствах elementPositionX и elementPositionY.
Графические элементы имеют getDefinition и методы setDefinition, которые позволяют изменять дополнительные свойства, недоступные классу GraphicElement. Более подробную информацию см. в разделе справки Доступ к CIM в Python .
Примечание:
До версии ArcGIS Pro 3.2, элементы группы в компоновке имели значениеtype равное GRAPHIC_ELEMENT. Начиная с ArcGIS Pro 3.2, новый класс GroupElement имеет значение type равное GROUP_ELEMENT. Графические элементы продолжают поддерживаться isGroup для обеспечения прямой совместимости.
Свойства
Свойство | Описание | Тип данных |
anchor (только чтение) | Возвращает одно из следующих строковых значений, которые описывают текущую позицию якоря. Чтобы изменить значение, используйте метод setAnchor.
| String |
elementHeight (чтение и запись) | Высота элемента в единицах страницы компоновки или карты. | Double |
elementPositionX (чтение и запись) | X-положение позиции точки якоря элемента в единицах страницы компоновки или карты. | Double |
elementPositionY (чтение и запись) | Y-положение позиции точки якоря элемента в единицах страницы компоновки или карты. | Double |
elementRotation (чтение и запись) | Угол поворота элемента в градусах. Положительные значения поворачивают по часовой стрелке, а отрицательные – против часовой стрелки. | Double |
elementWidth (чтение и запись) | Ширина элемента в единицах страницы компоновки или карты. | Double |
isGroup (только чтение) | Возвращает True, если элемент является GroupElement. Элементы группы невозможно clone или delete. | Boolean |
locked (чтение и запись) | Если задано значение True, элемент нельзя выбрать графически в виде компоновки или карты. | Boolean |
longName (только чтение) | Полное имя элемента, включая информацию о группе, если она существует. Например, элемент с именем 'Point' в групповом элементе с именем 'Group Element' вернет значение longName, равное 'Group Element\\Point'. Если элемент не входит в группу, longName будет таким же, как и значение name. | String |
name (чтение и запись) | Имя элемента. Важно, чтобы у всех элементов были уникальные имена, благодаря чему на них можно было бы ссылаться с помощью параметра wildcard функции listElements объекта Layout. | String |
parentGroupElement (только чтение) | Если элемент находится в группе, возвращаемое значение будет равно GroupElement. | GroupElement |
type (только чтение) | Возвращает значение GRAPHIC_ELEMENT. | String |
visible (чтение и запись) | Определяет, видим ли элемент в компоновке или в слое графики. | Boolean |
Обзор метода
Метод | Описание |
applyStyleItem (style_item) | Метод applyStyleItem применяет элементы стиля к графическим элементам. |
clone ({suffix}) | Обеспечивает механизм клонирования существующего графического элемента на странице компоновки. |
delete () | Обеспечивает механизм удаления существующего графического элемента на странице компоновки. |
getDefinition (cim_version) | Возвращает определение CIM графического элемента. |
setAnchor (anchor) | Метод setAnchor, управляющий положением якоря для GraphicElement. |
setDefinition (definition_object) | Задает определение CIM графического элемента. |
Методы
applyStyleItem (style_item)
При привязывании StyleItem с помощью метода listStyleItems для класса ArcGISProject параметр style_class должен быть POINT, LINE или POLYGON. Поскольку графические элементы поддерживают разные типы геометрии, и в одном цикле вы можете просматривать несколько элементов, перед применением стиля вам может потребоваться определить тип геометрии. Приведенный ниже пример кода позволяет понять, как это сделать. Обратитесь к разделу справки StyleItem для получения дополнительной информации и примеров кода.
Примечание:
Перед использованием метода applyStyleItem необходимо добавить стили в проект. Их можно добавить, используя метод updateStyles для класса ArcGISProject.
Следующий скрипт выполняет итерацию графических элементов в компоновке и использует доступ Python CIM для определения типа геометрии графического элемента перед применением элемента стиля к любому из них.
p = arcpy.mp.ArcGISProject('current')
lyt = p.listLayouts('*_Layout')[0]
poly_si = p.listStyleItems('ArcGIS 2D', 'Polygon', 'Park')[0]
line_si = p.listStyleItems('Favorites', 'Line', 'Trail')[0]
pt_si = p.listStyleItems('Favorites', 'Point', 'First Aid')[0]
multiPt_si = p.listStyleItems('Favorites', 'Point', 'Water')[0]
for elm in lyt.listElements('GRAPHIC_ELEMENT'):
elm_cim = elm.getDefinition('V3')
if isinstance(elm_cim.graphic, arcpy.cim.CIMGraphics.CIMPolygonGraphic):
elm.applyStyleItem(poly_si)
if isinstance(elm_cim.graphic, arcpy.cim.CIMGraphics.CIMLineGraphic):
elm.applyStyleItem(line_si)
if isinstance(elm_cim.graphic, arcpy.cim.CIMGraphics.CIMPointGraphic):
elm.applyStyleItem(pt_si)
if isinstance(elm_cim.graphic, arcpy.cim.CIMGraphics.CIMMultipointGraphic):
elm.applyStyleItem(multiPt_si)
clone ({suffix})
Параметр | Описание | Тип данных |
suffix | Дополнительная строка, использующаяся для добавления тега каждому вновь созданному графическому элементу. Новый элемент получит то же имя, что и родительская графика, плюс к нему добавится значок suffix и порядковый номер. Например, если имя родительского элемента Line и у suffix значение равно _copy, клонированные элементы будут называться Line_copy, Line_copy_1, Line_copy_2 и т.п. А если suffix не указан, результаты будут выглядеть как Line_1, Line_2, Line_3 и т.п. | String |
Сгруппированные текстовые элементы копировать нельзя. Все сгруппированные элементы являются графическими. Проверьте, не является ли графический элемент групповым, с помощью свойства isGroup объекта GraphicElement.
delete ()
Может понадобиться удалить существующие или клонированные графические элементы. Клонированным элементам, при создании, можно присваивать собственный suffix, чтобы их можно было легко найти с помощью параметра wildcard для метода listElements на объекте Layout .
getDefinition (cim_version)
Параметр | Описание | Тип данных |
cim_version | A string that represents the major version of the CIM that will be used.
| String |
Тип данных | Описание |
Object | Возвращает определение CIM для GraphicElement. |
Более подробно о работе с CIM и примеры см. Доступ к CIM в Python.
setAnchor (anchor)
Параметр | Описание | Тип данных |
anchor | A string that specifies the location of the anchor position.
| String |
Задание положения якоря привязки полезно, поскольку с его помощью вы можете контролировать, как элемент будет расширяться при изменении размера. Например, значение положения якоря привязки для графического элемента - BOTTOM_LEFT_CORNER. Если вы измените положение якори на TOP_RIGHT_CORNER, изменение значения elementHeight приведет к расширению элемента вниз, а изменение значения elementWidth - к расширению элемента влево.
setDefinition (definition_object)
Параметр | Описание | Тип данных |
definition_object | A modified CIM definition object originally retrieved using getDefinition. | Object |
Более подробно о работе с CIM и примеры см. Доступ к CIM в Python.
Пример кода
Следующий скрипт перемещает групповой элемент с именем Grouped Graphics на новое местоположение на странице компоновки, используя новое положение якоря, и сохраняет изменения.
p = arcpy.mp.ArcGISProject('CURRENT')
lyt = p.listLayouts('Graphic*')[0]
elm = lyt.listElements('GROUP_ELEMENT', 'Grouped Graphics')[0]
elm.setAnchor('Center_Point')
elm.elementPositionX = 3.25
elm.elementPositionY = 9.5
Следующий скрипт создает точечный графический элемент в новой компоновке. Затем скрипт создает точечный графический элемент в графическом слое на новой карте.
p = arcpy.mp.ArcGISProject('current')
#Create a layout
lyt = p.createLayout(8.5, 11, 'INCH', 'New Layout with Point')
ptStyle = p.listStyleItems('ArcGIS 2D', 'Point', 'Star 1')[0]
#Construct a layout point graphic element using a default symbol
lyt_ptGra = p.createGraphicElement(lyt, arcpy.Point(4.125, 5.5),
ptStyle, 'ArcPy_Point')
#Optional - modify the symbol size via the CIM
lyt_ptGra_cim = lyt_ptGra.getDefinition('V3')
lyt_ptGra_cim.graphic.symbol.symbol.symbolLayers[0].size = 150
lyt_ptGra.setDefinition(lyt_ptGra_cim)
lyt.openView()
#Create a map (WGS 1984 Web Mecator) and graphics layer
m = p.createMap('New Map with Point', 'Map')
gl = m.createGraphicsLayer('New Graphics Layer')
#Construct a point in map space
map_ptGra = p.createGraphicElement(gl, arcpy.Point(-13681707, 5947924),
ptStyle, 'Olympia Capitol Building')
#Optional - modify the symbol size via the CIM
map_ptGra_cim = map_ptGra.getDefinition('V3')
map_ptGra_cim.graphic.symbol.symbol.symbolLayers[0].size = 25
map_ptGra.setDefinition(map_ptGra_cim)
m.openView()
Следующий скрипт создает мультиточечный графический элемент с 48 точками в новой компоновке и изменяет размер символа, используя доступ к Python CIM.
p = arcpy.mp.ArcGISProject('current')
lyt = p.createLayout(100, 100, 'CENTIMETER', 'X Marks the Spot')
#Construct 2 multi-point graphic elements using a system style item
mPtStyle = p.listStyleItems('ArcGIS 2D', 'Point', 'X Marker')[0]
x = 4; y = 4; z = 96
mPtCoords = []
for i in range(1, 25):
xy = [x, y]
xz = [x, z]
mPtCoords.append(xy)
mPtCoords.append(xz)
x = x + 4
y = y + 4
z = z - 4
mPt = arcpy.Multipoint(arcpy.Array([arcpy.Point(*coords)
for coords in mPtCoords]))
mPtGra = p.createGraphicElement(lyt, mPt, mPtStyle, name='ArcPy_MultiPt')
#Optional - modify the point symbol size via the CIM
mPtGra_cim = mPtGra.getDefinition('V3')
mPtGra_cim.graphic.symbol.symbol.symbolLayers[0].size = 75
mPtGra.setDefinition(mPtGra_cim)
lyt.openView()
Следующий скрипт создает полилинейный графический элемент в новой компоновке и изменяет его слои символов с помощью доступа к Python CIM.
p = arcpy.mp.ArcGISProject('current')
lyt = p.createLayout(5, 3, 'INCH', 'New layout with line graphic')
#Construct a line graphic element using a sytem style item
lnStyle = p.listStyleItems('ArcGIS 2D', 'Line', 'Line with 2 Markers')[0]
plyLnCoords = [[1, 1.25], [2, 2], [3, 1], [4, 1.5]]
plyLn = arcpy.Polyline(arcpy.Array([arcpy.Point(*coords)
for coords in plyLnCoords]))
lnGra = p.createGraphicElement(lyt, plyLn, lnStyle, 'ArcPy_Line')
#Optional - modify multiple line symbol layer properties via the CIM
lnGra_cim = lnGra.getDefinition('V3')
lnSym = lnGra_cim.graphic.symbol.symbol
lnSym.symbolLayers[0].size = 20
lnSym.symbolLayers[0].markerPlacement.offsetAlongLine = 60
lnSym.symbolLayers[0].markerPlacement.placementTemplate = [240]
lnSym.symbolLayers[1].size = 20
lnSym.symbolLayers[1].markerPlacement.offsetAlongLine = 180
lnSym.symbolLayers[1].markerPlacement.placementTemplate = [240]
lnSym.symbolLayers[2].effects[0].dashTemplate = [80, 40, 80, 40]
lnSym.symbolLayers[2].width = 4
lnGra.setDefinition(lnGra_cim)
lyt.openView()
Следующий скрипт использует шаблон JSON для создания кривой (дуги) и геометрии Безье. Геометрия используется для создания двух графических элементов в новой компоновке. Для изменения свойств кривой Безье может использоваться и доступ к Python CIM. Дополнительные сведения о создании геометрических объектов с использованием JSON см. в разделе Геометрические объекты.
p = arcpy.mp.ArcGISProject('current')
lyt = p.createLayout(6, 3, 'INCH', 'New Layout with 2 curves')
#Construct a curve/arc graphic element using a default symbol
arcPath = {"curvePaths" : [[[3.5,1.25],{"c" : [[5,1.25],[4.25, 1.75]]}]]}
arc = arcpy.AsShape(arcPath, esri_json=True)
arcGra = p.createGraphicElement(lyt, arc, name='ArcPy_Arc')
#Construct a bezier curve graphic element using a system style item
curveStyle = p.listStyleItems('ArcGIS 2D', 'Line', 'Dashed 1 Long 1 Short')[0]
curvePath = {"curvePaths" : [[[1.25,1.25],
{"b" : [[3,1.5],[1.6875,2.75],[2.125,0]]}]]}
curve = arcpy.AsShape(curvePath, esri_json=True)
curveGra = p.createGraphicElement(lyt, curve, curveStyle, 'ArcPy_Curve')
#Optional - modify the bezier curve symbol layer properties via the CIM
curveGra_cim = curveGra.getDefinition('V3')
symLyr1 = curveGra_cim.graphic.symbol.symbol.symbolLayers[0]
symLyr1.width = 4
symLyr1.color.values = [255, 0, 0, 100]
symLyr1.effects[0].dashTemplate = [8, 8, 0.01, 8]
symLyr1.capStyle = 'Round'
curveGra.setDefinition(curveGra_cim)
lyt.openView()
Следующий скрипт создает графический элемент полигона в новой компоновке и создает новую карту, добавляет файл слоя и загружает объекты из слоя в новый графический слой.
p = arcpy.mp.ArcGISProject('current')
#Create a layout
lyt = p.createLayout(8.5, 11, 'INCH', 'New Layout with Polygon')
#Construct a polygon graphic element using a system style item
polyStyle = p.listStyleItems('ArcGIS 2D', 'Polygon', 'Buffered Gradient')[0]
polyCoords = [[1, 1], [1, 10], [7.5, 10], [7.5, 9], [2, 9], [2, 6], [6.5, 6],
[6.5, 5], [2, 5], [2, 2], [7.5, 2], [7.5, 1], [1, 1]]
poly = arcpy.Polygon(arcpy.Array([arcpy.Point(*coords)
for coords in polyCoords]))
polyGra = p.createGraphicElement(lyt, poly, polyStyle, name='ArcPy_Polygon')
lyt.openView()
#Create a map, add a layer file and create a graphics layer
m = p.createMap('New Map with Feature Polygons', 'Map')
lyrFile = arcpy.mp.LayerFile(r"C:\Projects\GreatLakes\GreatLakes.lyrx")
m.addLayer(lyrFile)
lyr = m.listLayers('GreatLakes')[0]
gl = m.createGraphicsLayer('New Graphics Layer')
#Load polygon features into a map's graphics layer
#Caution - map graphics have limitations in terms of total size and number
for row in arcpy.da.SearchCursor(lyr, ["SHAPE@"]):
featShp = row[0]
p.createGraphicElement(gl, featShp, polyStyle)
m.openView()
Следующий скрипт создает два предопределенных графических элемента в компоновке. Первый создается с помощью функции конверта, а второй использует местоположение точки и изменяет размер элемента с помощью свойств elementWidth и elementHeight.
def MakeRec_LL(llx, lly, w, h):
xyRecList = [[llx, lly], [llx, lly+h], [llx+w,lly+h], [llx+w,lly], [llx,lly]]
xyRecList = [[1,1],[1, 2], [2.75, 2], [2.75, 1], [1, 1]]
array = arcpy.Array([arcpy.Point(*coords) for coords in xyRecList])
rec = arcpy.Polygon(array)
return rec
p = arcpy.mp.ArcGISProject('CURRENT')
#Create a layout
lyt = p.createLayout(6, 3, 'INCH', 'New Layout with Rectangles')
#Construct a pre-defined rectangle graphic element using a system style item
# and a rectangle function that takes x/y min/max and a width/height
# using the lower left corner as a start location
polyStyle = p.listStyleItems('ArcGIS 2D', 'Polygon', 'Orchard')[0]
p.createPredefinedGraphicElement(lyt, MakeRec_LL(1, 1, 1.75, 1), 'RECTANGLE',
polyStyle, 'ArcPy_Rectangle_Env',
lock_aspect_ratio=False)
#Construct the same element above using a point location
rec = p.createPredefinedGraphicElement(lyt, arcpy.Point(3, 1), 'RECTANGLE',
polyStyle, 'ArcPy_Rectangle_Pt',
lock_aspect_ratio=False)
rec.elementWidth = 1.75
rec.elementHeight = 1
lyt.openView()
Следующий скрипт создает графический элемент полигона для каждой из 10 предопределенных фигур, устанавливает якорь в центре и использует доступ к Python CIM для обновления свойства Rounding, которое сохраняется в пользовательском словаре propertySetItem, связанном с каждым графическим элементом.
p = arcpy.mp.ArcGISProject('current')
lyt = p.createLayout(8.5, 11, 'INCH', 'Predefined Shapes')
#A list of pre-defined shape key words
shapeList = ['Circle', 'Cloud', 'Cross', 'Ellipse', 'Half_Circle',
'Rectangle', 'Right_Triangle', 'Rounded_Rectangle', 'Triangle', 'X']
x = 1.25
y = 9.5
for shape in shapeList:
elm = p.createPredefinedGraphicElement(lyt, arcpy.Point(x, y), shape, name=f'ArcPy_{shape}_Pt')
elm.setAnchor('Center_Point')
if elm.elementWidth > elm.elementHeight:
elm.elementWidth = 0.75
else:
elm.elementHeight = 0.75
#Optional - use Python CIM Access to modify element rounding
elm_cim = elm.getDefinition('V3')
attrbs = elm_cim.graphic.attributes
attrbs['propertySetItems'] = ['Rounding', 50] #Sets 50% rounding
elm.setDefinition(elm_cim)
y = y - 1
lyt.openView()
Этот скрипт строит графическую таблицу, основанную на значениях данных из таблицы в карте. Компоновка был создана с вертикальной линией с именем vertLine, горизонтальной линией с именем horzLine и текстовым элементом cellText. Каждый из этих элементов был создан с необходимыми свойствами символов и текста. Якори элементов установлены в верхнем левом положении, а вертикальное и горизонтальное выравнивание текстового элемента — вверх и влево.
import arcpy
aprx = arcpy.mp.ArcGISProject(r"C:\Projects\YosemiteNP\Yosemite.aprx")
#Reference items in the project
m = aprx.listMaps("Yosemite National Park")[0]
lyr = m.listLayers("Valley_Pts")[0]
lyt = aprx.listLayouts("Points of Interest")[0]
horzLine = lyt.listElements("GRAPHIC_ELEMENT", "horzLine")[0]
vertLine = lyt.listElements("GRAPHIC_ELEMENT", "vertLine")[0]
tableText = lyt.listElements("TEXT_ELEMENT", "cellText")[0]
#Get/set information about the table
numRows = int(arcpy.GetCount_management(lyr).getOutput(0))
rowHeight = 0.2
fieldNames = ["COMPLEXID", "NAME"]
numColumns = len(fieldNames)
colWidth = 1.5
#Build graphic table lines based on upper left coordinate
# set the proper size of the original, parent line, then clone it and position appropriately
upperX = 1.0
upperY = 5.0
#Vertical lines
vertLine.elementPositionX = upperX
vertLine.elementPositionY = upperY
vertLine.elementHeight = (rowHeight * numRows) + rowHeight #extra line for column names
x = upperX
for vert in range(1, numColumns+1):
x = x + colWidth
vert_clone = vertLine.clone("_clone")
vert_clone.elementPositionX = x
#Horizontal lines
horzLine.elementPositionX = upperX
horzLine.elementPositionY = upperY
horzLine.elementWidth = numColumns * colWidth
y = upperY - rowHeight
for horz in range(1, numRows +2 ): #need to accommodate the extra line for field names
temp_horz = horzLine.clone("_clone")
temp_horz.elementPositionY = y
y = y - rowHeight
#Place text column names
tableText.elementPositionX = upperX + 0.05 #slight offset
tableText.elementPositionY = upperY
tableText.text = fieldNames[0]
accumWidth = colWidth
for field in range(1, numColumns):
newFieldTxt = tableText.clone("_clone")
newFieldTxt.text = fieldNames[field]
newFieldTxt.elementPositionX = newFieldTxt.elementPositionX + accumWidth
accumWidth = accumWidth + colWidth
#Create text elements based on values from the table
table = arcpy.SearchCursor(lyr.dataSource)
y = upperY - rowHeight
for row in table:
x = upperX + 0.05 #slight offset
try:
for field in fieldNames:
newCellTxt = tableText.clone("_clone")
newCellTxt.text = row.getValue(field)
newCellTxt.elementPositionX = x
newCellTxt.elementPositionY = y
accumWidth = accumWidth + colWidth
x = x + colWidth
y = y - rowHeight
except:
print("Invalid value assignment")
#Export to PDF and delete cloned elements
lyt.exportToPDF(r"C:\Temp\test.pdf")
for elm in lyt.listElements(wildcard="_clone"):
elm.delete()
del aprx