使用ArcPy更改标签样式(字体,颜色,大小等)?


9

我正在尝试为ArcGIS 10.2编写一个python宏,该宏将根据不同类型的公寓自动标记图层中的点。例如,一种风格的公寓将有一个蓝色的正方形,上面带有白色的加粗文本作为标签。另一个将是带有黑色粗体的粉红色正方形;另一个将带有带有白色粗体文本的红色正方形,依此类推。

您将在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])

Answers:


7

arcpy.mapping API仅提供对有限数量的可以直接修改的图层属性的访问,但是可以使用UpdateLayer函数修改在“图层属性”对话框中找到的所有属性。该信息是从源图层中提取的,并应用于需要更新的地图文档中的图层。source_layer可以是图层(.lyr)文件,也可以是地图文档中的图层。UpdateLayer是一个强大的函数,因为它可以几种不同的方式用于产生不同的结果。

您需要按需要创建符号系统/标签,并将其保存到图层文件中。然后使用arcpy.mapping.UpdateLayer()加载该图层文件。

如果需要多个人运行python加载项,则需要使图层文件对所有人(例如公共网络驱动器)都可访问。


我最终制作了一个自定义的“ 更新层属性”工具箱。它允许您在ArcMap TOC中选择一个图层,然后选择一个输入图层文件。然后,它将使用图层文件中的所有属性更新图层,并将其重新资源化回原始要素类。它将与gdb,mdb,shp或sde中的数据一起使用。

查看源代码

请让我知道,如果你有任何问题。

在此处输入图片说明


我从另一个基于点的数据层创建了一个单独的层文件,并已设置了所有内容(符号和标签),它可以执行,但似乎要做的就是用sourceLayer公寓文件。我假设这是因为“仅更新符号系统”部分中的False。有没有一种方法可以执行此操作,以便仅应用符号系统和标签,而不会将点移动到其他位置?
泰勒矛2014年

我要寻找什么样的功能来做到这一点?我对重新配置不太熟悉。到目前为止,感谢您的帮助。
泰勒·斯皮尔斯

我尝试调整它以适合我的代码。它通过UpdateLayer函数工作,但在第35行:refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]抛出错误,指出索引超出范围。
泰勒斯皮尔斯

这意味着该arcpy.mapping.ListLayers方法无法在当前mxd中找到与您的名称相同的图层input_layer_file[0]返回索引超出范围的索引意味着列表中没有项目)。
2014年

我做到了,我觉得这很接近,但是问题是,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
Tyler Spears 2014年

6

另一个选择是使用python在图层上设置自定义标签表达(更改大小和颜色..etc):

例如

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,尝试删除字段名称周围的双引号。
艺术品

当我这样做时,它表示未定义参数。
泰勒·斯皮尔斯

@Tyler Spears,您可以在问题中发布代码吗?您可以在函数括号之外使用单引号。
艺术品

绝对,我已经更新了我的问题以显示我的代码。
泰勒斯皮尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.