Arcpy使用字段计算器进行赋值
arcpy的字段计算器函数:
字段计算器主要使用的是CaculateField_management() 这个函数,这里面有几个重要的参数:
- 输入的表(in_table)
- 需要计算的字段名称(field)
- 计算表达式(expression)
- 字段计算器版本(个人常用python版本)
- 存放复杂表达式的代码块(code_block)
上面的参数里,最重要的莫过于表达式了,表达式里可以我们自己定义,那么这里除了用简单的语句之外,还可以用输入一个函数作为表达式:
def contact(field):
if field == u"澳门特别行政区" or field == u"香港特别行政区":
return "特别行政区"
else:
return "广东九市"
示例数据
当然,怎么在字段计算器里使用这个函数还是有讲究的,稍安勿躁,先来了解一下示例数据
首先,打印一下数据的字段名称:
Fields = arcpy.ListFields(data)
print [field.name for field in Fields]
--------------------------------------------------------------------------------------------
[u'FID', u'Shape', u'OBJECTID', u'province', u'city', u'Shape_Leng', u'Shape_Area', u'test']
简单的字段合并
这里我就选择province和city两个字段来进行简单的合并,用&符号来连接两个字段,并赋值为test字段,代码如下:
#用AddField_management()函数给数据(data)添加test字段,类型为文本
arcpy.AddField_management(data,'test','TEXT')
#构建条件表达式
expression = "'{}&{}'.format(!province!,!city!)"
#字段合并
arcpy.CalculateField_management(data,"test",expression,"PYTHON_9.3")
这里需要注意的是:
expression里面的format(!province!,!city!),感叹号包住的province和city表示的是字段名,切记不能写成format(“province”,“city”),这里的province和city表示字符串。
至于CalculateField_management()里为什么没有codeblock参数,待会下面的例子就会揭晓。
将函数作为条件表达式
下面的需求就是将函数作为条件表达式输入,这里先来看看示例数据的属性表:
for row in arcpy.SearchCursor(data):
print row.getValue('province')
我们将澳门特别行政区和香港特别行政区归为特别行政区,其余的省份归为广东省九市(ps:这是份粤港澳大湾区的数据)。因此,轻松构建出分类赋值的函数之后,大体的代码如下:
codeblock = '''
def contact(field):
if field == u"澳门特别行政区" or field == u"香港特别行政区":
return "特别行政区"
else:
return "广东九市"
'''
expression = 'contact(!province!)'
arcpy.CalculateField_management(data,"test",expression,"PYTHON_9.3",codeblock)
这里可以看到我们的函数包含在codeblock的变量里,我的理解如下:
- 将在codeblock这个小板板上写好我们的函数
- 然后将板子交给CalculateField_management的总监
- 总监看完黑板没有问题之后就让expression的员工去执行,妥妥设计师的身份!美哉美哉~
因此,在最后字段计算器里需要把codeblock的参数也加上去,否则expression就只知道你调用了一个函数,但函数里面是怎样的它并不知道,最后也没法运行
这里有个特别需要注意的地方:
(缩进!缩进!!缩进!!!)
错误的写法:
codeblock = """
def contact(a):
if a == u"香港特别行政区" or a == u"澳门特别行政区":
return "特别行政区"
else:
return "广东九市"
"""
expression = "contact(!city!)"
arcpy.CalculateField_management(data,"test",expression,"PYTHON_9.3",codeblock)
-------------------------------------------------------------------------------
arcgisscripting.ExecuteError: 执行失败。参数无效。
ERROR 000989: Python 语法错误: Parsing error IndentationError: unexpected indent (line 2)
执行(CalculateField)失败。
错误原因:在这个引号里,函数前面的缩进也会被传进expression里,并不只是传了函数,因此一开始没有注意到这点的我耗费了好几个小时,谨记谨记!!!!
运行结果
最后,用函数作为条件表达式的字段计算器,也是成功做出了我们想要的效果
完整代码:
# -*- coding:utf-8 -*-
import arcpy
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
#设置目标数据
data = r"D:\New Desktop\2019全国行政区划\县域粤港澳大湾区.shp"
#添加一个test字段,设置为文本型
arcpy.AddField_management(data,'test','TEXT')
#打印一下数据的字段
Fields = arcpy.ListFields(data)
print [field.name for field in Fields]
#使用字段计算器进行字段合并
# expression = "'{} & {}'.format(!province!,!city!)"
codeblock = '''
def contact(field):
if field == u"澳门特别行政区" or field == u"香港特别行政区":
return "特别行政区"
else:
return "广东九市"
'''
#构建条件表达式
expression = 'contact(!province!)'
arcpy.CalculateField_management(data,"test",expression,"PYTHON_9.3",codeblock)
#打印处理完的值
for row in arcpy.SearchCursor(data):
print row.getValue('test')