Arcpy使用字段计算器进行赋值

arcpy的字段计算器函数:

字段计算器主要使用的是CaculateField_management() 这个函数,这里面有几个重要的参数:

  1. 输入的表(in_table)
  2. 需要计算的字段名称(field)
  3. 计算表达式(expression)
  4. 字段计算器版本(个人常用python版本)
  5. 存放复杂表达式的代码块(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']

简单的字段合并

这里我就选择provincecity两个字段来进行简单的合并,用&符号来连接两个字段,并赋值为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的变量里,我的理解如下:

  1. 将在codeblock这个小板板上写好我们的函数
  2. 然后将板子交给CalculateField_management的总监
  3. 总监看完黑板没有问题之后就让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')
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值