在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多种,基于这些丰富的标签,可以满足各种各样的标注文本需求。这里只介绍用到的字体大小和颜色;其余标签的使用可以参考官网:
标签<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脚本介绍完毕;介绍的内容也是比较简单,希望可以做到抛砖引玉的作用,可以给大家在地图制图,地图标注上的工作提供参考;更多的功能大家可以参考官网的帮助文档继续探索。
官网参考:
构建标注表达式的帮助文档
使用文本格式化标签
https://desktop.arcgis.com/zh-cn/arcmap/10.3/map/working-with-text/using-text-formatting-tags-about-text-formatting-t.htm
可在 ArcMap 中使用的格式化标签
数据说明:
本文使用的湖南省行政区划数据从互联网上获取,属性表中的面积area字段值是仅为了说明标注的功能实现,不代表真实值!
评论(0)