Змінення стилів міток (шрифт, колір, розмір тощо) за допомогою ArcPy?


9

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

Який вираз чи функцію ви б використовували в arcpy, щоб змінити стиль цих міток?

В даний час сценарій позначає квартири кодом карти і змінює його назву в TOC на квартири, як слід.

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

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

Чи можна змінити шрифти, мітки та графіку за допомогою сценаріїв 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, вам потрібно зробити файл шару доступним для всіх, наприклад, загальнодоступний мережевий диск.


Я створив власну панель інструментів "Властивості шару оновлення" . Це дозволяє вибрати шар у TOC ArcMap, а потім вибрати файл вхідного шару. Потім він оновлює шар із усіма властивостями у файлі шару та повертається до початкового класу функцій. Він буде працювати з даними, які містяться в gdb, mdb, shp або sde.

Переглянути вихідний код

Будь ласка, повідомте мене, якщо у вас є якісь питання.

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


Я створив окремий файл шару з іншого шару даних на основі точок із усім набором (символікою та мітками), він виконується, але все, що, здається, це повністю замінити не маркований, несимволізований файл квартири (що б я не вирішив додати) файл квартири sourceLayer. Я припускаю, що це через помилкове в розділі "Тільки символіки оновлення". Чи є спосіб це виконати, щоб він просто застосував символіку та мітки, але не перемістив точки в інше місце?
Тайлер Спірс

Які функції я б хотів шукати для цього? Я не надто знайомий із повторним постачанням. Я дуже ціную вашу допомогу поки що, до речі.
Тайлер Спірс

Я спробував налаштувати це, щоб відповідати моєму коду. Він працює через функцію 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

Інший варіант - встановити спеціальний вираз мітки на шарі (змінюючи розмір та колір..etc) за допомогою 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.


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

@Tyler Spears, Спробуйте видалити подвійні лапки навколо імен полів.
художній твір21

Коли я це роблю, він говорить, що параметри не визначені.
Тайлер Спірс

@Tyler Spears, Чи можете ви розмістити код у своєму запитанні? У вас є одна цитата поза дужками функції.
художній твір21

Абсолютно я оновив своє запитання, щоб показати свій код.
Тайлер Спірс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.