Менять стили меток (шрифт, цвет, размер и т. Д.) С помощью ArcPy?

9

Я пытаюсь написать макрос Python для ArcGIS 10.2, который автоматизирует процесс маркировки точек в слое на основе разных типов квартир. Например, один стиль квартир будет иметь синий квадрат с белым жирным шрифтом в качестве одной метки; у другого будет розовый квадрат с черным жирным шрифтом; у другого будет красный квадрат с белым жирным шрифтом и т. д.

Какое выражение или функцию вы бы использовали в arcpy, чтобы изменить стиль этих меток?

В настоящее время скрипт помечает квартиры кодом карты и меняет свое имя в оглавлении на квартиры, как и должно быть.

введите описание изображения здесь

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

Есть ли способ изменить шрифты, метки и графику с помощью сценариев Python (ArcPy, IDLE и т. Д.)?


Я решил отредактировать этот пост, чтобы дать окончательное описание того, что я собираюсь здесь, чтобы не было путаницы. По сути, точки на карте будут выглядеть не так, как на картинке выше:

введите описание изображения здесь


Я пытался использовать lblClass.expressionфункцию, однако код, который я пытаюсь использовать, не работает. Я думаю, что это, вероятно, шаг в правильном направлении. Ниже приведен код, который я пытался использовать, чтобы получить labelClass.expression для изменения шрифтов меток.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])
Тайлер Спирс
источник

Ответы:

7

API arcpy.mapping предоставляет доступ только к ограниченному количеству свойств слоя, которые можно изменять напрямую, но все свойства, находящиеся в диалоговом окне Свойства слоя, можно изменить с помощью функции UpdateLayer. Информация извлекается из исходного слоя и применяется к слою в документе карты, который необходимо обновить. Source_layer может быть файлом слоя (.lyr) или слоем в документе карты. UpdateLayer - надежная функция, поскольку ее можно использовать несколькими различными способами для получения разных результатов.

Вам нужно создать символы / метки так, как вы хотите, и сохранить их в файле слоя. Затем загрузите этот файл слоя с помощью arcpy.mapping.UpdateLayer () .

Если несколько человек должны запустить надстройку Python, вам нужно сделать файл слоя доступным для всех, например, для публичного сетевого диска.


Я закончил тем, что сделал пользовательскую панель инструментов Свойства слоя обновления . Это позволяет вам выбрать слой в ArcMap TOC, а затем выбрать файл входного слоя. Затем он обновляет слой со всеми свойствами в файле слоя и повторно возвращает исходный класс объектов. Он будет работать с данными, которые находятся в gdb, mdb, shp или sde.

Посмотреть исходный код

Пожалуйста, дай мне знать, если возникнут какие-либо вопросы.

введите описание изображения здесь

ianbroad
источник
Я создал отдельный файл слоя из другого слоя данных, основанного на точках, со всем, что все установлено (символы и метки), он выполняется, но все, что он делает, это полностью заменяет немаркированный, несимволизированный файл квартиры (какой бы я ни выбрал добавить) на Исходный слой квартирного файла. Я предполагаю, что это из-за False в разделе «только обновление символов». Есть ли способ, которым это можно выполнить, чтобы он просто применял символы и метки, но не перемещал точки в другое место?
Тайлер Спирс
Какие функции я бы искал для этого? Я не слишком знаком с рессорсингом. Кстати, я ценю вашу помощь.
Тайлер Спирс
Я попытался настроить это, чтобы соответствовать моему коду. Он работает через функцию UpdateLayer, но в строке 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]выдает ошибку, говорящую о том, что индекс находится вне диапазона.
Тайлер Спирс
Это означает, что arcpy.mapping.ListLayersметод не находит слой в текущем mxd с тем же именем, что и у вас input_layer_file(индекс [0]возврата индекса вне диапазона означает, что в списке нет элементов).
XIY
Я сделал, и я чувствую, что это очень близко, но проблема в том, что после завершения части UpdateLayer выдает следующую ошибку: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Тайлер Спирс
6

Другой вариант - установить пользовательское выражение метки на слое (изменение размера и цвета и т. Д.) С помощью python:

например

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Создание выражений меток

Они могут быть установлены через:

LabelClass (arcpy.mapping)

РЕДАКТИРОВАТЬ:

Попробуй это:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

Вы можете удалить другие операторы строки (для цикла, labClass и вызова функции). Кроме того, функция должна называться FindLabel.

artwork21
источник
Я пытался использовать что-то похожее на такую ​​функцию. Я создал определение с именем, def getLabel (Code, Type)а затем после настройки операторов if-else для различных кодов карт, которые я использую, я установил 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")', который просто возвращает ошибка, TypeError: unsupported operand type(s) for &: 'str' and 'str'я в основном следую примеру веб-сайта Esri. Если я могу просто доказать, что могу изменить шрифт, я могу перейти к настройке более сложных аспектов (таких как форма, фон и цвет надписей).
Тайлер Спирс
@ Tyler Spears, попробуйте удалить двойные кавычки вокруг имен полей.
artwork21
Когда я делаю это, он говорит, что параметры не определены.
Тайлер Спирс
@Tyler Spears, вы можете разместить свой код в вашем вопросе? У вас есть одиночная кавычка вне скобок функции.
artwork21
Абсолютно, я обновил свой вопрос, чтобы показать мой код.
Тайлер Спирс