原创 西西艾尔 GIS二师兄 2021-12-28 22:20
标注是放置在地理要素附近的描述性文本,ArcMap的标注是动态创建的,也就是依赖属性字段值的,当字段值改变时,标注随之改变,当然你也可以把标注转为注记(图层右击标注转为注记)由动态变为静态。
标注的需求往往是多样的,在我们仅仅为了学习时,往往用到的都是对某一图层用某一字段值进行标注,这很简单,但是遇到复杂标注时往往会一筹莫展,本篇文章以及接下来几篇将为你打开思路,让你了解ArcMap可以如何多样化标注,当你读完,完全可以随意组合,满足各种标注需求。
分类标注,就是某一图层先根据类别进行符号化,然后以不同的方式对每个分类进行标注。
1、我们可以创建一个示例点图层,里面有个类别字段TIPE,由A、B、C三种类别。还有一个标注的字段name,如下图:
2、右击该图层打开“属性”,选择符号化,根据类别,选择TIPE字段,符号化,可以分别用三种大小的符号。如下图:
3、在切换到标注,选择标注的字段NAME,你会发现该图层都是同一个样式标注,如果我想对三个级别分别以不同的样式标注应该怎么操作。4、其实很简单,继续在标注页面,在“方法”一栏,下拉选择“为不同的类选择不同的标注;默认会有一个default类,删除它,再添加A、B、C三个类。
6、至此,每个类已经定义完成,接下来,我们可以分别对每个类定义标注;这里我仅仅改变了每个类的标注字体大小,你完全可以更改标注的字段,标注的颜色,标注的字段组合等等一系列操作。
python很简单,所以没必要看到语言就畏惧,这里罗列了一些简单的表达式,这些表达式也可以组合,当你不记得时可以翻开这篇文章。
1、堆叠字段:当我们想要几个字段(比如下面的NAME、Number、Direction字段)都标注在要素旁边,并且分行如下实例;[NAME] + '\n’ + [Number] + '\n’ + [Direction]
2、拆分文本:假设有一个名称字段,其值为“ Calgary,100”,只想标注“,”之后的值,即 100:def FindLabel ( [Name] ): return [Name].split(“,”)[1]
3、排除、连接和堆叠:有值为“BP10200”的名称字段和值为“546”的字段。需要绘制两个字段,但不包括第一个字段中的数字,标注为:BP 54def FindLabel ( [Name] , [Code] ): return [Name] [:2] + '\n’ + [Code]
4、替换命令:如果你有一个长字符串的字段名,你想用短格式替换,那么使用名为“replace”的函数。例如,姓名字段有“CountyRoads2340”,而你想标注为“CR2340”。def FindLabel ( [Name]): return [Name].replace(“CountyRoads”,”CR”)
5、删除非数字字符:有时只想从字母数字中绘制数字。例如,我们有类似“2 Highway, 22 minor road, 74 street”这样的文本,而只想标注2 22 74。def FindLabel ([Name]): import re output = re.sub(“[^0-9 ]”, “”, [Name]) return output
6、如果你想组合2个字段,结果有一个字段值为空,这时候会报错,那么可以这样:def FindLabel([Name],[Code]): if str([Name]) == “None” and str([Code]) != “None”: return [Code] elif str([Name]) != “None” and str([Code]) == “None”: return [Name] elif str([Name]) == “None” and str([Code]) == “None”: return “” else: return str([Name]) + ” ” + str([Code])
7、 计数值:如果值在字段上重复并且你想对其进行计数;例如A(2)这意味着 A 重复了 2 次。注意:在下面的代码中,Name是字段名称,Example是图层名称。def FindLabel ( [Name] ): mxd = arcpy.mapping.MapDocument(“CURRENT”) lyr = arcpy.mapping.ListLayers (mxd,”Example”)[0] q='”NAME”=’+”'”+[NAME]+”'” tbl=arcpy.da.TableToNumPyArray(lyr,”Name”,q) n=len(tbl) return '%s(%s)’ %([Name],str(n))
8、四舍五入:标记数字字段并希望根据条件进行四舍五入。例如,如果值大于 1 且小于 50,则为 3 位小数,如果在 50 到 100 之间,则为 2 位小数,其他为 1 位小数。def FindLabel([Code]): if [Code] is not None: value = float([Code]) if 1 < value < 50: return round(value, 3) elif 50 <= value < 100: return round(value, 2) else: return round(value, 1) else: return None