基于ArcGIS使用Python计算小班号出现的次数

       没有工具箱就没有点赞,有了工具箱你还有什么理由不赞!!!

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(";")方法将字符串转换成列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值