在ArcMap中进行简单的地图标注,我相信稍微对ArcMap有所了解的人来说都会用;第一步在内容列表中选中需要进行标注的图层右键,在右键菜单中点击【标注要素】;第二步再点击【属性】按钮打开属性编辑页面,在标注页面中设置进行标注的字段,标注的字体属性等信息;如下图所示。

这种简单的标注在地图上显示的内容较少,如下图所示,只是简单地标注了县级行政区的名称。

复杂标注的需求说明和实现效果

介绍完简单的标注过程后,接下来我们来看一下复杂的标注需求,如何力争在地图上通过标注向人们传达更多的信息,提高地图的可读性。
先来看一下数据属性表中的字段信息和复杂标注的需求;数据属性表的信息如下:

需要通过复杂标注实现的功能有:

1、在地图上同时标注县级行政区名称和面积;

2、县行政区名称和面积换行显示,且名称和面积字体大小不同;

3、面积保留一位小数且要带中文名称的单位:平方千米;

4、按照面积1000平方千米进行分类:大于等于1000平方千米的标注为红色,小于1000平方千米的标注字体为黑色;

5、不允许改动数据属性表信息。
按照上述的需求,使用标注表达式中的Python脚本实现的最终效果如下图所示。

在标注表达式中使用Python脚本

了解完数据和标注的需求情况,我们接下来详细介绍一下如何通过Python脚本实现上述的较为复杂的标注效果。根据前面列出的5个需求,用标注表达式一个一个地实现。

标注表达式的打开方式如下:在图层属性页面中点击【标注】→在标注页面中点击【表达式】按钮即可打开标注表达式的设置窗口;在标注表达式窗口可以看到图层的字段列表,表达式编辑区和相关的功能;表达式解析的语言可以是VB,Python和JScript;这里选择Python,如下图所示。

首先来看怎么在标注中同时显示县名称和面积两个字段值;通过双击字段列表中的字段名即可把字段添加到脚本编辑区中,然后通过【+】连接即可实现两个字段值的显示;表达式写完后,可以点击【验证】按钮验证表达是否有效;如果表达式有效,可以在验证结果窗口中看到表达式的标注实例效果;如下图所示。

实现两个字段值显示后,接下来我们看一下如何进行换行,面积保留一位小数和添加中文的单位平方千米;要实现换行和加单位还是比较简单,只需要在两个字段中间添加一个换行符"\n",然后通过【+】连接中文单位即可;因为ArcMap无法直接读取中文编码,要先使用decode函数把中文解码,然后ArcMap才能读取识别,所以表达式1为:

[xianname]+"\n" + [area] +"平方千米".decode("utf-8")

想要实现面积保留一位小数,就要用到Python的round()函数,这个函数使用起来也比较容易,它需要传入两个参数,第一个是需要处理的小数,第二个是保留小数的位数;例如给小数123.444保留一位小数的表达式2为:

round(123.444,1)#表达式输出值为123.4

把表达式1和表达式2和字段名称联合起来即可实现换行和加中文单位的需求;因为round()函数返回的数据类型为float,所以需要把float转为字符串才能与字符串进行关联;所以最终的表达式和验证结果如下:

[xianname]+"\n" +str(round(float([area]),1)) +"平方千米".decode("utf-8")

接着往下,我们看一下表达式中如何标注字体颜色和大小的控制;在标注表达式中可以使用文本格式化标签;ArcMap 文本格式化标签遵守 XML 语法规则。每个起始标签必须有对应的结束标签。标签可以嵌套,但必须先结束内部标签,然后再结束外部标签。可以在ArcMap标注表达式中使用的文本格式化标签有字体名称、字号、颜色,斜体、粗体、上标、下标、字符宽度、行间距等10多种,基于这些丰富的标签,可以满足各种各样的标注文本需求。这里只介绍用到的字体大小和颜色;其余标签的使用可以参考官网:

desktop.arcgis.com/zh-c

标签<CLR red='0',blue='0',green='0'>文本</CLR>用于控制字体的颜色,可以通过红绿蓝三个属性值进行设置;如果红绿蓝属性值缺失,默认值为0.

标签<FNT size = '14',name = "Arial">文本</FNT>用于控制字体的字号和字体名称。

例如县行政区名称字体颜色设置为黑色,字号设置为14的表达式和效果图如下:

"<CLR red='0'><FNT size = '14'>"+[xianname]+"</FNT></CLR>"

最后只剩下根据面积的大小进行标注分类;要使用标注表达式的高级功能才能实现;前面实现的功能都是可以使用一行代码就可以满足,如果较为复杂的功能,例如进行逻辑判断,涉及多行代码就需要通过高级功能定义一个函数实现;结合前面已经实现的功能,再加上面积大小判断分类,最终定义的标注表达式函数如下:

def FindLabel ( [area] , [xianname]  ): #函数FindLabel 有两个参数,分别是面积和县名称字段
    areaValue=round(float( [area] ),1)  #面积保留一位小数
    danwei="平方千米".decode('utf-8')   #中文单位名称解码
    if  areaValue >= 1000 :  #面积大小与1000进行判断
        #大于等于1000的设置一种样式
        return  "<CLR red='255'><FNT size = '14'>" + [xianname]   + "</FNT></CLR>"+"\n"+"<CLR red='255'><FNT size = '10'>" +str(areaValue)  +danwei+ "</FNT></CLR>"
    else:
        #小于1000的设置另一种样式
        return   "<CLR red='0'><FNT size = '14'>" + [xianname]   + "</FNT></CLR>"+"\n"+"<CLR red='0'><FNT size = '10'>" +str(areaValue)  +danwei+ "</FNT></CLR>"

上面函数实现的最终的标注效果如下

总结

1、要善于使用验证功能,验证功能可以使我们看到我们表达式的正误;正确可以看到标注实例;错误有错误信息方便我们排查,完善脚本。

2、中文字符需要通过解码后才能与字段值进行串联,否则会报编码错误;错误信息如下:

3、表达式要求数据类型一致才能进行串联;例如float类型和字符串直接串联会报错,报错信息如下:

4、表达式中获得的字段值都是文本类型;例如在属性表中,area数据类型为双精度的小数,但是在表达式中获得的却是字符串。

5、标签对的大小写必须完全一致。标签是成对出现的,在表达式中,标签的相关信息需要用双引号括起来,例如:

"<CLR red='255'><FNT size = '14'>"+[xianname]+"</FNT></CLR>"+"\n" +"<CLR red='255'><FNT size = '10'>"+str(round(float([area]),1)) +"平方千米".decode("utf-8")+ "</FNT></CLR>"

6、复杂的表达式需要勾选高级功能才能在脚本编辑区构建表达式函数,且表达式函数的名称固定为FindLabel,函数名称不可修改。

7、可以善于使用保存和加载功能,方便表达式的复用和共享;通过保存功能可以把表达式保存到.lxp格式的本地文件中;通过加载功能可以加载已经保存的表达式文件。

至此,在ArcMap标注表达式中使用Python脚本介绍完毕;介绍的内容也是比较简单,希望可以做到抛砖引玉的作用,可以给大家在地图制图,地图标注上的工作提供参考;更多的功能大家可以参考官网的帮助文档继续探索。

官网参考:

构建标注表达式的帮助文档

desktop.arcgis.com/zh-c

使用文本格式化标签

desktop.arcgis.com/zh-c

可在 ArcMap 中使用的格式化标签

desktop.arcgis.com/zh-c

数据说明:

本文使用的湖南省行政区划数据从互联网上获取,属性表中的面积area字段值是仅为了说明标注的功能实现,不代表真实值!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。