没有工具箱就没有点赞,有了工具箱你还有什么理由不赞!!!
1 背景
由于日常工作经常会遇到检查小班号是否重号的问题,就想自己动手写一个实现统计小班号出现次数的工具箱。
2 技术路线
搜索游标获取所有小班号→计数函数统计小班号出现的次数→更新游标将小班号出现次数更新到对应字段
2.1 搜索游标(SearchCursor)
with arcpy.da.SearchCursor(in_fc, fields) as cursor:
numbers = [row[0] for row in cursor]
2.2 容器数据类型(collections)
对传入给collections .Counter()的可迭代对象进行计数,并将计数对象与计数结果作为键值对,以字典的形式进行结果的返回。
# 使用标准库
counts = collections.Counter(numbers)
# 字典get()方法
d = {}
for xbh in xbhs:
d[xbh] = d.get(xbh, 0) + 1
2.3 更新游标(UpdateCursor)
更新游标,更新小班号出现的次数。更新游标最后需要调用cursor.updateRow(row)方法,更新数据。
with arcpy.da.UpdateCursor(in_fc, fields) as cursor:
for row in cursor:
row[1] = counts[row[0]]
# 切记要更新数据,否则赋值不成功
cursor.updateRow(row)
3 代码分析
# -*-coding:utf-8 -*-
import sys
import os
import collections
import arcpy
reload(sys)
sys.setdefaultencoding('utf-8')
def xbh_count(in_fc, fields):
"""
in_fc: 输入要素类
fields: 字段列表
return: None
"""
# 查询游标,获取所有小班号
with arcpy.da.SearchCursor(in_fc, fields) as cursor:
numbers = [row[0] for row in cursor]
# 使用Counter()方法,以字典形式返回小班号及出现的次数
counts = collections.Counter(numbers)
# 更新游标,计算每个小班号出现的次数,并赋值给Count字段
with arcpy.da.UpdateCursor(in_fc, fields) as cursor:
for row in cursor:
row[1] = counts[row[0]]
# 切记要更新数据,否则赋值不成功
cursor.updateRow(row)
if __name__ == "__main__":
in_fc = arcpy.GetParameterAsText(0)
fields = arcpy.GetParameterAsText(1).split(";")
xb_counter(in_fc, fields)
4 其他方法
4.1 ArcGIS汇总
右键→汇总→导出dbf,汇总导出dbf计算每个小班出现的次数,以表格的形式返回,没有以字段形式体现。
4.2 电子表计数
导出属性表,使用countifs函数统计出小班号对应的出现次数,再连接回属性表。
4.3 对比分析
以上2种方法,都能统计出小班号出现的次数,但数据后续处理比较麻烦,如要筛选出出现1次以上的数据,就必须新建字段,将小班号对应的出现次数赋值到属性表里,或者在表格中筛选次数大于1次的,再在属性表里筛选。
5 工具箱
在制作工具箱的时候,软件一直提示SQL语句错误,小编猜测应该是获取字段名时出错。获取的字段名不是以列表提供的,而是以"字段名1;字段名2;..."形式提供,需要调用str.split(";")方法将字符串转换成列表。