分享

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

 风声之家 2022-01-28

原创 西西艾尔 GIS二师兄 2021-12-28 22:20

标注是放置在地理要素附近的描述性文本,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

确定

  • 不看此公众号

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多