查看原文
其他

ArcGIS中分类标注以及常用的标注Python代码

GIS前沿 2022-07-16

The following article is from GIS二师兄 Author 西西艾尔


标注是放置在地理要素附近的描述性文本,ArcMap的标注是动态创建的,也就是依赖属性字段值的,当字段值改变时,标注随之改变,当然你也可以把标注转为注记(图层右击标注转为注记)由动态变为静态。

标注的需求往往是多样的,在我们仅仅为了学习时,往往用到的都是对某一图层用某一字段值进行标注,这很简单,但是遇到复杂标注时往往会一筹莫展,本篇文章以及接下来几篇将为你打开思路,让你了解ArcMap可以如何多样化标注,当你读完,完全可以随意组合,满足各种标注需求。

一、分类标注

分类标注,就是某一图层先根据类别进行符号化,然后以不同的方式对每个分类进行标注。

1、我们可以创建一个示例点图层,里面有个类别字段TIPE,由A、B、C三种类别。还有一个标注的字段name,如下图:


2、右击该图层打开“属性”,选择符号化,根据类别,选择TIPE字段,符号化,可以分别用三种大小的符号。如下图:


3、在切换到标注,选择标注的字段NAME,你会发现该图层都是同一个样式标注,如果我想对三个级别分别以不同的样式标注应该怎么操作。



4、其实很简单,继续在标注页面,在“方法”一栏,下拉选择“为不同的类选择不同的标注;默认会有一个default类,删除它,再添加A、B、C三个类。


5、现在为每个类以查询条件的方式定义,操作如下:



6、至此,每个类已经定义完成,接下来,我们可以分别对每个类定义标注;这里我仅仅改变了每个类的标注字体大小,你完全可以更改标注的字段,标注的颜色,标注的字段组合等等一系列操作。


结果如下:每个类别的标注字体大小都不一样


二、常用的python标注表达式

python很简单,所以没必要看到语言就畏惧,这里罗列了一些简单的表达式,这些表达式也可以组合,当你不记得时可以翻开这篇文章。

首先当然是打开编辑器。按照以下方式:


然后我们可以输入标注的表达式;

1、堆叠字段:当我们想要几个字段(比如下面的NAME、Number、Direction字段)都标注在要素旁边,并且分行如下实例;

Calgary
1000
 NE

那么取消勾选上图中1Advanced,直接输入:

[NAME] + ‘\n’ + [Number] + ‘\n’ + [Direction]

2、拆分文本:假设有一个名称字段,其值为“ Calgary,100”,只想标注“,”之后的值,即 100:

def FindLabel ( [Name] ): return [Name].split(“,”)[1]

3、排除、连接和堆叠:有值为“BP10200”的名称字段和值为“546”的字段。需要绘制两个字段,但不包括第一个字段中的数字,标注为:BP 54


def 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

- END -

ArcGIS API for Python技术应用

由入门到精通,所有的干货教程都在这

ArcGIS浮雕效果制图

ArcGIS制图地图布局居中

GIS制图 | 复刻《这里是中国》(附DEM、全国遥感影像练习数据下载)



戳原文,更有料!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存