实际工作中,经常会有对各类图斑进行编号的需求。数据中图斑数比较少时,我们可以手动进行编号,但数据量较大时就必须得想办法自动实现图斑编号。今天,将分享几种常见的图斑自动编号方式,主要包括:图斑顺序编号、按字段属性分类编号、按图斑四至位置编号、分级编号、指定位数编号、加前缀编号等多种编号方法。
由于将要介绍的方法大多数都用到ArcGIS属性表中的【字段计算器】,因此先对【字段计算器】做一简单介绍。
一、字段计算器介绍
在左侧菜单栏任一要素类或者表上右击【打开属性表】,再找到要计算的字段上右击【字段计算器】,即可打开字段计算器。
打开【字段计算器】后页面如下图所示:
1是选择脚本语言,默认是VB语言,可以改成Python语言;2是要素字段名,双击会在3和4的代码里显示;3是代码框,勾选【显示代码块】就会出现,用于编写多行的简单脚本。4主代码框,用于简单的代码或字段运算。右边是常用函数,双击即可使用,可用于字段属性字符串切片[:]、大小写转换.isupper()、字符串补齐.zfill()等。
二、图斑编号
1.按图斑顺序编号
最简单的编号就是按图斑顺序依次编号,一种是可以借助现有的编号字段,比如FID进行字段运算获得编号,另外一种便是通过编写简单代码的方式进行编号。先看第一种,我们添加一个BH字段,然后打开字段计算器,切换到Python语言,然后双击FID字段再加1(FID编号从0开始)。
计算完成后,BH字段里面就有了编号。
接下来,我们通过编写简易代码的方式来实现编号。同样打开字段计算器,切换到Python语言,显示代码块,在里面编写编号函数,然后在下面进行函数调用,同样可以实现上面的效果。
完整编号函数代码如下,在字段计算器代码块里面输入时要注意空格,否则容易报错。温馨提示:可以通过点击【保存】按钮将当前函数保存成.cal的函数文件,下次使用时点击【加载】按钮便可直接调用。
1 rec=0
2 def autoIncrement():
3 global rec
4 pStart = 1
5 pInterval = 1
6 if (rec == 0):
7 rec = pStart
8 else:
9 rec = rec + pInterval
10 return re
这样我们便实现了简单的顺序编号,但有时候我们需要编号数字位数保持一致,例如:0001、0299这样都是四位数。这就需要用到Python字符串函数.zfill(n)。函数功能:返回长度为n的字符串,原字符串右对齐,前面填充0。
下面,我们以生成5位数编号举例。在BH字段名称上右击打开字段计算器,切换到Python语言,先选择并双击BH字段,再选择并双击.zfill()函数,输入函数参数5,就形成!BH!.zfill(5)代码,表示BH字段字符串向左保留为5位。
点击确定,计算完成后生成的结果如下:
同样的,如果需要在编号前面再加其他字母等信息,直接在编号前面添加即可。比如5位编号前面加“SM”,为“SM00001”,代码为:"SM"+ !BH!,要注意为英文双引号。另外,也可以通过修改上面编号函数代码的方式实现。
2按字段类型编号
有时候,我们在编号时需要按照图层中某一字段属性类型对要素进行编号。比如在卫片图斑中,我们需要按乡镇对图斑进行编号,每个乡镇都从0开始编号。同样可以在字段计算器中采取Python脚本的方式进行实现。我们定义一个isDuplicateIndex(inValue)函数,然后调用即可,同时让编号按3位数对齐。
完整Python代码:
UniqueDict = {}
def isDuplicateIndex(inValue):
UniqueDict.setdefault(inValue,0)
UniqueDict[inValue] += 1
return UniqueDict[inValue]
计算后结果如下:
3按图斑四至编号
有时候,为了工作方便我们需要按照图斑四至位置,按照从左到右、从上到下的顺序给图斑进行编号。按照四至位置编号,首先需要按照上述排序方式对图斑进行重新排序,然后依次编号即可。
首先,需要给大家简单介绍一下几个字段计算器中常用的Python语法:
!shape.area!:图斑要素面积;
!shape.length!:图斑要素周长。
!shape.extent.Xmin!:图斑要素最小外包矩形的左上角X坐标;
!shape.extent.XMax!:图斑要素最小外包矩形的右下角X坐标;
!shape.extent.Ymax!:图斑要素最小外包矩形的左上角Y坐标;
!shape.extent.YMin!:图斑要素最小外包矩形的右下角Y坐标;
具体操作步骤如下:
第一步:给图层添加Xmin和Ymax两个字段。字段添加后,在字段计算器中基于Python语法:!shape.extent.Xmin!和!shape.extent.Ymax!分别计算出Xmin和Ymax坐标。
第二步:在【数据管理】模块下的【常规】工具集中找到【排序】工具进行图斑排序。
排序规则:从上到下排序意思就是沿纵轴从上到下排序,所以排序字段Ymax在前面降序排列,从左到右排序意思就是沿横轴从左到右排序,所以排序字段Xmin在后面升序排列,从而保证数据按从上到下,从左到右的顺序排列。
第三步:排序后会生成一个新的要素图层,给新图层添加编号字段,然后运用上面顺序编号的代码给图斑依次编号就可了。
计算完成后我们要的四至编号就成功实现了,如下图所示:
需要说明的是,这块没有使用质心坐标是因为图斑形状很长或很宽时,会因为质心的位置导致排序位置偏后。为了避免这种情况,采取Xmin和Ymax进行排序。
4图斑分级别号
实际工作中,有时候需要根据某字段属性值大小划分不同的等级进行编号或赋值,所谓图斑分级编号。比如:按照图斑面积划分不同的等级,相同等级的图斑赋相同的编号或其他属性值。
我们以面积大小为例,采取自定义Python函数的方式演示一下如何进行分级编号。自定义编号函数:按照要素面积大小,将面积小于2000平方米的图斑编号为1,大于2000小于3000平方米的为2,以此类推。
完整的函数代码如下:
def bianhao(value):
bh = ""
if value <= 2000:
bh = 1
elif 2000 < value <= 3000:
bh = 2
elif 3000 < value <= 4000:
bh = 3
elif 4000 < value <= 5000:
bh = 4
else:
bh = 5
return str(bh).zfill(3)
函数调用字段为面积字段,计算后结果如下,图斑已经按照面积大小进行了编号。
另外,有种笨办法不用写代码也能实现分级编号。还是以面积为例:首先对面积进行升序或降序排序,然后手动选中面积小于2000平方米的所有图斑,再手动将编号赋值为1,以此类推。当然,数据量大时就不太方便了。
以上。如有问题,欢迎关注我的G*Z*H:爬虫与地理信息。