新闻详情

新闻详情

首页 / 资讯中心 / 详情

ArcGIS 属性表统计实战:用 Python 的 SearchCursor 与 collections 计算小班号出现次数

发布时间:2026/9/29 19:18:17来源:尧图网络
ArcGIS 属性表统计实战:用 Python 的 SearchCursor 与 collections 计算小班号出现次数
1. 小班号重号排查为什么值得写个脚本做林业、国土、规划类 GIS 数据的朋友大概率都遇到过同一个问题一份小班面图层属性表里小班号本该唯一可实际数据经过多次合并、拆分、复制粘贴之后重号几乎防不住。你要做的第一件事就是统计每个小班号在表里出现了几次出现 1 次的正常出现 2 次以上的就是重号得挑出来核对。手工怎么做打开属性表按小班号排序肉眼一行行看几百行还能忍上万行直接劝退。用 ArcGIS 自带的「汇总」功能也能出结果但它导出的是独立 dbf 表你还得再连接回属性表多一步操作筛选重号时更麻烦。导出到 Excel 用 COUNTIFS 也行可数据一更新就得重来一遍。这篇就讲一个更省事的思路用 Python 的arcpy.da.SearchCursor把字段读出来交给标准库collections.Counter做频次统计再用arcpy.da.UpdateCursor把次数直接写回属性表的新字段。整个过程在 ArcGIS Pro 的 Python 窗口或独立脚本里都能跑跑完属性表里就多一列「出现次数」筛选大于 1 的记录就是全部重号。适合已经会用 ArcGIS 基本操作、想往脚本方向走一步的人。2. 前置准备字段、环境与 TaoToken 接入2.1 数据与字段要求先明确输入。假设你的要素类叫XB里面有个文本字段XBH存小班号另外新建一个短整型字段COUNT_N或者叫出现次数用来接收统计结果。字段类型建议用短整型或长整型别用文本否则后面做数值筛选会别扭。有一点必须提前说清楚SearchCursor和UpdateCursor的字段列表顺序要一致因为代码里是用下标row[0]、row[1]取值的。如果你传进去的字段是[XBH, COUNT_N]那row[0]就是小班号row[1]就是待写入的次数。顺序错了结果就全乱了。2.2 运行环境ArcGIS Pro 自带 Python 环境直接在「分析」选项卡里打开 Python 窗口就能跑。ArcMap 用户用自带的 Python 2.7 环境也行但要注意print语法和编码处理的差异。本文示例以 Python 3 为主ArcMap 用户按注释微调即可。如果你习惯在外部编辑器里写脚本需要保证脚本用的是 ArcGIS 的 Python 解释器否则import arcpy会直接报 ModuleNotFoundError。这一点新手最容易踩。2.3 关于 TaoToken 的接入位置脚本本身不依赖任何在线服务纯本地跑。但如果你后续想把这类 GIS 处理脚本接到大模型做代码补全、报错解释或者用 Claude Code 这类工具辅助写 arcpy 脚本可以通过 TaoToken 统一接入。它的 API 地址是https://taotoken.net/api官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。需要生成密钥就去控制台接入文档里有各语言的调用示例。这一步是可选的不影响本篇脚本运行。3. 可复制配置SearchCursor Counter UpdateCursor 完整脚本3.1 核心三段式逻辑整个脚本就三件事读、算、写。读用SearchCursor遍历一遍把所有小班号收集成一个列表。 算把列表丢给collections.Counter得到一个「小班号 → 出现次数」的字典。 写用UpdateCursor再遍历一遍按当前行的小班号去字典里查次数写进结果字段。Counter的好处是它本身就是 dict 的子类查询用counts[xbh]就行不用自己写循环累加。相比手写d.get(x, 0) 1代码更短也不容易写错。3.2 完整脚本# -*- coding: utf-8 -*- import arcpy import collections def count_xbh(in_fc, xbh_field, count_field): in_fc: 输入要素类或图层 xbh_field: 小班号字段名 count_field: 用于写入出现次数的字段名 fields [xbh_field, count_field] # 第一步读取所有小班号 with arcpy.da.SearchCursor(in_fc, fields) as cursor: numbers [row[0] for row in cursor] # 第二步统计频次返回 {小班号: 次数} counts collections.Counter(numbers) # 第三步回写次数 with arcpy.da.UpdateCursor(in_fc, fields) as cursor: for row in cursor: row[1] counts[row[0]] cursor.updateRow(row) # 不调用这句赋值不会落盘 arcpy.AddMessage(统计完成共处理 {} 条记录。.format(len(numbers))) if __name__ __main__: fc rC:\data\test.gdb\XB count_xbh(fc, XBH, COUNT_N)3.3 关键参数说明参数含义注意点in_fc要素类路径支持 gdb 要素类、shp、图层名xbh_field小班号字段文本或数值型都可但类型要统一count_field结果字段必须已存在脚本不自动建字段fields 列表游标字段顺序读和写必须一致下标才对得上注意UpdateCursor里如果漏掉cursor.updateRow(row)循环跑完也不报错但字段值一个都不会变。这是最高频的「脚本跑了没效果」原因。3.4 如果字段还没建脚本不负责建字段你可以先手动加也可以用arcpy.AddField_management加一行arcpy.AddField_management(fc, COUNT_N, SHORT)字段名尽量别用中文虽然 ArcGIS 支持但在脚本里引用时容易因为编码问题出岔子。用COUNT_N这种英文名最稳。4. 验证请求与成功结果4.1 跑完看什么脚本执行完打开属性表COUNT_N这一列应该已经填满了数字。正常情况下大部分小班号对应 1少数对应 2 或更多。你可以右键COUNT_N字段选「降序排列」出现次数最多的排在最前面一眼就能看到哪些小班号重复得最厉害。4.2 用定义查询筛重号想只看重号在图层上右键 → 属性 → 定义查询输入COUNT_N 1确定之后地图上只剩重号小班属性表里也只剩这些记录。核对完把定义查询清掉即可不会改动原始数据。4.3 交叉验证为了确认脚本没算错可以抽一个小班号手工核对。比如某个小班号在属性表里数出来是 3 次那COUNT_N就该是 3。再不行就用 ArcGIS 的「汇总」功能对XBH做一次频次统计导出 dbf 后和脚本结果比对两边一致就说明逻辑没问题。4.4 顺带说下其他两种做法ArcGIS 汇总右键字段 → 汇总 → 选统计类型为「计数」导出 dbf。缺点是结果是独立表要回填属性表还得做连接。Excel COUNTIFS导出属性表用COUNTIFS(A:A, A2)统计再连接回来。数据量小的时候够用数据一更新就得重导重连。脚本的优势就在于可重复执行数据改了再跑一遍结果字段自动刷新不用手工重来。5. 本篇常见报错排查5.1 RuntimeError: Cannot find field XXX字段名拼错或者字段不在当前要素类里。检查xbh_field和count_field是否和属性表里完全一致大小写敏感。如果字段名带空格或特殊字符用方括号包起来比如[小班号]。5.2 脚本跑完字段全是 Null九成是漏了cursor.updateRow(row)。另外确认count_field字段类型不是文本如果是文本写入整数可能被拒或写成空。5.3 统计结果和预期不符先检查fields列表顺序。如果row[0]取到的不是小班号Counter统计的就是别的字段。另外注意小班号字段里如果有前后空格 001和001会被当成两个不同的键统计结果自然不对。可以在读取时加row[0].strip()清洗一下。5.4 大数据量跑得慢UpdateCursor逐行更新几万行还行上百万行会明显变慢。可以考虑先关掉图层刷新或者改用arcpy.CalculateField_management配合字典做批量计算。不过对日常小班数据来说当前写法足够。5.5 工具箱里报 SQL 语句错误如果你把这个脚本做成脚本工具参数里字段用多值输入ArcGIS 传进来的是字段1;字段2这种分号拼接的字符串不是列表。需要split(;)转一下fields arcpy.GetParameterAsText(1).split(;)这个坑我在做工具箱时也遇到过报错信息指向 SQL实际是字段参数格式问题。6. 把脚本接进你的日常工作流脚本跑通之后最实用的做法是把它做成 ArcGIS Pro 里的脚本工具输入要素类和两个字段名点一下就跑完。这样组里其他人不用懂 Python 也能用。如果你在写更复杂的 arcpy 脚本时卡在报错上可以把报错信息丢给模型对话让它帮你分析接入地址在https://taotoken.net/api密钥去 API Keys 页面生成具体调用方式看接入文档。长期写 GIS 自动化脚本的话Coding Plan 更适合持续用。最后留个实用习惯每次跑完统计先别急着删中间字段把COUNT_N 1的记录导出一份单独的核对清单确认无误后再决定是改号还是合并。数据这东西留一手总没错。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

在 ng-zorro-antd 中实现可编辑单元格表格:基于 OnPush 的 immutable 数据编辑实战指南 2026/9/29 22:14:47

在 ng-zorro-antd 中实现可编辑单元格表格:基于 OnPush 的 immutable 数据编辑实战指南

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读 表格编辑是后台管理系统中最高频的交互场景之一。NG-ZORRO(ng-zor…

阅读更多 →
eFuse:TPS25982系列电子保险丝的相关设计 2026/9/29 22:14:47

eFuse:TPS25982系列电子保险丝的相关设计

创作背景:在设计板子中,总是有一些意外情况导致PCB短路(内部设计或是外部不小心短接),此时便想起给整个板子做一个保险。对于保险设计有很多方法:保险丝,电子保险丝等等。对于传统保险设计有一些…

阅读更多 →
光伏硅片传感器选型参考:明治ESB-BY30适配场景与现场调试要点 2026/9/29 22:14:47

光伏硅片传感器选型参考:明治ESB-BY30适配场景与现场调试要点

一句话结论:硅片检测选型的关键不在"标称检测距离越长越好",而在光源波长与硅片光谱特性是否匹配、是否具备反射率波动免疫能力;ESB-BY30在这两个维度上给出了明确的工程方案。 一、选型时应关注的五个维度 光源波长:…

阅读更多 →
六、PB-GATT入网流程 2026/9/29 22:14:47

六、PB-GATT入网流程

BLE Mesh理论资料 六、 PB-GATT入网流程 1、 入网流程 2、 Mesh Provisioning Service 3、 Mesh Proxy Service 4、 Proxy PDU 5、 Provisioning PDU 6、 发送Beacon信号

阅读更多 →
FPGA 工程全流程漫谈:从 0 到 1 上手一个真实项目 2026/9/29 22:14:47

FPGA 工程全流程漫谈:从 0 到 1 上手一个真实项目

很多刚开始学习 FPGA 的同学,都会经历一个阶段:看了几天 Verilog,能写一个 LED 闪烁;学了几个模块,知道什么是寄存器、状态机;甚至跑通了几个例程。但是一旦真正面对一个 FPGA 项目,比如&#x…

阅读更多 →
别只搜 “AI 写论文排行榜”:低碳经济与管理论文,我会按环节选工具 ✏️|思梦航 AI 2026/9/29 22:14:27

别只搜 “AI 写论文排行榜”:低碳经济与管理论文,我会按环节选工具 ✏️|思梦航 AI

如果你是管理学 / 工商管理类 / 低碳经济与管理专业的学生,大概率会遇到一类很典型的毕业任务: 以**“碳排放交易政策对高碳上市企业低碳转型绩效的影响”**为题,完成一篇包含政策背景、文献综述、理论机制、研究假设、DID 模型、稳健性检验和…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉