大数跨境
0
0

ArcGIS字段计算器攻略:26段Python代码,所有功能一网打尽!

ArcGIS字段计算器攻略:26段Python代码,所有功能一网打尽! GIS前沿
2024-01-01
3
导读:在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算。字段计算器可以对所有记录或选中记录

在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算。字段计算器可以对所有记录或选中记录执行简单计算和高级计算。

计算可以通过【Python】或【VBScript】执行。建议使用【Python】,字段计算器的使用,其实主要就是【Python】基础语法的简单应用。

注意,在代码框里输入的符号都必须是在英文状态下输入。

字段计算器的使用方法

在任一要素类或者表上右击【打开属性表】,再找到要计算的字段上右击【字段计算器】,即可打开字段计算器。

打开窗口如上图。

1)选择脚本语言。默认是【VB】,需要手动改成【Python】。

2)要素或表的字段名,可以双击,会自己在(5)或者(6)的代码里自动生成字段名的代码。

3)python的一些简单函数和方法,同样可以双击自动生成。

4)如果勾选【显示代码块】,则会出现代码框(6)。默认是不勾选的,如果计算脚本比较复杂,需要多行,就勾选,在代码框(5)中定义方法,再在代码框(6)中进行引用。

5)主代码框。

6)引用方法的时候用到的代码框,默认是不开启的。

使用方法示例

1、四则运算

简单的加减乘除运算,例如:

!数值01! * !数值02!

2、字符串叠加

!字符串01! + !字符串02!

 

3、字符串切片

如字符串的前3位:

!字符串01![:3]

类似的情况还有,取字符串的后3位:

!字符串01![-3:]

取字符串的2到4位。

!字符串01![1:4]

取关键字及前面或后面的文字,如,取“市”及前面的字。

注意,要查找的如果是中文,需要在前面加u,这是python2.*版本的问题。如果是ArcgisPro就不用加。

!字符串01! [:!字符串01!.find(u'市')+1]

如果要考虑“市”和“县”2个关键字,情况就稍微复杂一些。可以勾选【显示代码块】,写一个方法再引用。


def ss(a):    list_str = [u'市', u'县']    index = -1    for s in list_str:        if a.find(s) != -1:            index = a.find(s)    return a [:index+1]

4、英文转大写、小写、首字母大写等

全部转大写:

!字符串01!.upper()

全部转小写:

!字符串01!.lower()

首字母大写,其余字母小写:

!字符串01!.capitalize()

 

5、字符串替换

如:要把“县”替换成“市”,注意这里不是在新字段里生成结果,而是修改原字段,要小心

!字符串01!.replace(u'县', u'市')

 引申一下,如果要去取字符串中的空格,则可以如下计算:

!字符串01!.replace(' ', '')

6、在字符串的每个字符中插入一个指定字符

如:要把【福州市】计算成【福_州_市】,字符也可以是空格。


'_'.join( !字符串01! )

7、保留2个小数

如果要把一个小数类型的字段,保留2个小数,可以如下:


round(!Shape_Area!,2)

8、计算椭球面积

注意,要计算的字段必须是float或是double类型。要素也不能没有定义坐标系。

!shape.geodesicarea!

9、提取中文、英文、数字、特殊符号

这里有用到正则表达式。如,提取汉字:


import redef ss(a):    va = re.findall(u'[\u4e00-\u9fa5]+',a)    if len(va) == 0:        result = ''    else:        result = ''        for i in range(0, len(va)):            result += va[i]    return result

 

如果是提取英文,则上面第3行代码替换成:

va = re.findall(r'[a-zA-Z]', a)

如果是提取数字:

va = re.findall(r'\d', a)

 特殊符号:

va = re.findall(r'\W', a)

10、if-else语句的运用

例如:通过建筑结构和层数来简单判断建筑质量。


def ss(a,b):    if a == u'混' and b>2:        return '质量较好'    elif a == u'混' and b<=2:        return '质量一般'    else:        return '质量较差'

11、计算要素的四至、部件数等


# 东!shape.extent.XMax!# 西!shape.extent.XMin!# 北!shape.extent.YMax!# 南!shape.extent.YMin!# 部件数!shape.PartCount!# 是否是多部件!shape.isMultipart!

12、字段值前面补齐0

例如:在OID前补0,补到8位。注意要计算的字段必须是字符串类型。

(8-len(str(!数值01!))) * '0' + str( !数值01! )

13、度分秒转十进制度

这个例子算是一个综合运用,代码较长。


def ss(a):    index1 = a.find(u'°')    index2 = a.find(u'′')    index3 = a.find(u'″')    degree = float(a[0:index1])    minutes = float(a[index1 + 1:index2])    seconds = float(a[index2 + 1:index3])    result = degree + minutes / 60 + seconds / 3600    return result

140

 OBJECTID05OBJECTIDstr()


str(!OBJECTID!).zfill(5)


150

round()00


format(!TBMJ!, '.5f')


16

08

!JQDLMC!.center(8,"0")


17

8

!JQDLMC!.ljust(8,"%")

!JQDLMC!.rjust(8,"%")

18

88

!BSM!.find("8")

 

!BSM!.rfind("8")

19


max(!TBMJ!,!Shape_Area!)


min(!TBMJ!,!Shape_Area!)

20

010

random.randrange(0,10)


import random


21

None

22

PercentChange(!TBMJ!)

lastValue = 0def PercentChange(arg):    newValue = arg    global lastValue    if lastValue:        percentage = (float(newValue - lastValue) / lastValue)  * 100    else:        percentage = 0    lastValue = newValue    return percentage


23、

AccumulateValue(!TBMJ!)

total = 0def AccumulateValue(arg):    value = arg    global total    if total:        total += value    else:        total = value    return total


24、

SequentialNumber()

rec=0def SequentialNumber():    global rec    pStart = 1    pInterval = 1    if (rec == 0):        rec = pStart    else:        rec = rec + pInterval    return rec


25、

线

getVertexCount(!shape!)


def getVertexCount(feat):        partnum = 0    partcount = feat.partCount    pntcount = 0    while partnum < partcount:        part = feat.getPart(partnum)        pnt = part.next()        while pnt:            pntcount += 1               pnt = part.next()            if not pnt:                 pnt = part.next()        partnum += 1    return pntcount

26、

shapex100

shiftXCoordinate(!SHAPE!)


def shiftXCoordinate(shape):    shiftValue = 100    point = shape.getPart(0)    point.X += shiftValue    return point


- END -



历史干货

周成虎院士:从遥感大数据到遥感大模型
从事测绘地信,你需要这些插件、软件、小工具、图源...
地理资源、地球科学领域高质量科技期刊分级目录总汇
EPS房屋和宗地图绘制、数据检查、成果输出
ArcMap出图小技巧:主图设计、图例、比例尺、指北针、标题

【声明】内容源于网络
0
0
GIS前沿
分享测绘地信资讯,交流行业软件技巧。
内容 4923
粉丝 0
GIS前沿 分享测绘地信资讯,交流行业软件技巧。
总阅读10.1k
粉丝0
内容4.9k