简介:ArcGIS DataReviewer 10.2 是 Esri 推出的空间数据质检工具,面向 GIS 从业者、数据分析师及测绘项目团队,用于发现并修正空间信息、属性信息与拓扑结构中的错误,保障数据准确性与完整性。资源包共 157 个文件,约 76.22MB,以 png、gif、jpg 等界面与示例图片,js、css、htm、html 等前端页面脚本,以及 xml、ini、txt 等配置说明文件为主,另含 exe、msi、cab 等安装组件,构成完整的工具部署与运行环境。已有 1222 人学习下载,适合需要系统掌握数据质检流程的中高级 GIS 用户。借助该工具,读者可完成坐标精度、重叠缺失要素、属性格式与空值重复值、未闭合线段及穿越边界等检查,并通过批处理任务、脚本与 API 接口实现自动化质检,结合协作平台与质检报告定位问题分布、统计错误并获取修复建议,从而提升地理分析的精确度与可靠性。
1. 从 ArcGIS DataReviewer102.zip 说起:一套被低估的矢量数据质检工作流
如果你手头有一批 Shapefile 或地理数据库要素类,字段缺失、几何自相交、面重叠、悬挂节点这些毛病反复出现,靠人工逐条翻属性表基本等于慢性自杀。ArcGIS DataReviewer102.zip 这个包名指向的正是 Esri 那套 Data Reviewer 扩展的 10.2 版本,它解决的核心问题只有一个:把矢量数据的质量检查从“人眼扫”变成“规则跑”。它适合两类人——一类是每天要交付测绘成果、规划数据的 GIS 工程师,另一类是做数据入库前质检的运维人员。这个包本身不是独立软件,而是挂在 ArcMap 10.2 上的扩展模块,装完之后你会多出一整套 Reviewer 工具条和批量校验能力。很多人第一次拿到它,以为解压就能用,结果卡在许可和版本匹配上,这篇就把从部署到写规则、跑批、看报告的全链路拆开讲。
2. 部署与许可:让 Data Reviewer 在 ArcMap 10.2 里真正跑起来
2.1 先搞清楚这个包里到底有什么
ArcGIS DataReviewer102.zip 解压后通常包含几个部分:扩展安装程序(.msi 或 setup.exe)、许可授权文件说明、以及可能的示例数据或校验规则模板。它不是绿色免安装包,必须走 Windows 的安装流程。我一般会先把压缩包解到本地一个纯英文路径下,比如D:\gis_setup\datareviewer102\,避免中文路径导致安装程序读不到配置文件。解压后你会看到类似DataReviewerDesktop.msi、License10.2.txt这样的文件。注意,10.2 时代的 Esri 桌面产品分 Desktop Basic、Standard、Advanced 三档,Data Reviewer 需要 Standard 及以上级别的许可,Basic 级别即使装了也调不出工具条。
安装前先确认你的 ArcMap 能正常启动,并且已经装了 Desktop 10.2 的完整版,不是只装了 Engine。然后关闭所有 ArcGIS 相关进程,包括 ArcCatalog 和后台的ArcGISCacheMgr.exe。安装程序会往注册表写扩展注册信息,如果 ArcMap 开着,写进去的 CLSID 可能不生效,表现为工具条灰色。
2.2 安装步骤与许可配置
安装本身是向导式,但有两个地方容易翻车。第一,安装类型选“Complete”而不是“Typical”,Typical 可能不装 Batch Job Runner 组件,后面跑批量校验会缺可执行文件。第二,安装完成后不要急着开 ArcMap,先处理许可。
10.2 的许可方式分单机版和浮动版。单机版用Authorize工具,浮动版改License Manager指向许可服务器。Data Reviewer 的许可是在 Desktop 许可基础上追加的扩展许可,需要在ArcGIS Administrator里勾选 Data Reviewer 的复选框。具体操作:打开 ArcGIS Administrator → Desktop → 展开你的许可类型 → 找到 Data Reviewer 条目 → 勾选。如果这里看不到条目,说明安装没注册成功,重新跑一遍安装程序的“Repair”选项。
# 检查 Data Reviewer 的 DLL 是否注册成功(在 CMD 里执行) reg query "HKLM\SOFTWARE\ESRI\Desktop10.2\Extensions" /s | findstr /i "Reviewer" # 正常应返回类似 DataReviewer 的键值,如果为空说明注册失败上面这条命令查的是 64 位注册表视图。如果你的系统是 64 位但 ArcMap 是 32 位应用,扩展注册可能落在Wow6432Node下,所以更稳妥的查法是:
reg query "HKLM\SOFTWARE\Wow6432Node\ESRI\Desktop10.2\Extensions" /s | findstr /i "Reviewer"逻辑说明:ArcMap 10.2 是 32 位进程,安装程序写注册表时会重定向到Wow6432Node。如果只查默认视图,会误判为没装。参数上/s表示递归查子键,findstr /i忽略大小写过滤。返回结果里应该能看到DataReviewer相关的 CLSID 和InstallDir路径。
许可配好后,启动 ArcMap,在Customize → Extensions里勾选 Data Reviewer,然后Customize → Toolbars里调出 Data Reviewer 工具条。如果工具条上的按钮全是灰的,八成是扩展没勾选,或者许可级别不够。
2.3 验证安装是否成功的三个动作
第一个动作:打开 ArcMap,加载一个随便的线要素类,点开 Data Reviewer 工具条上的Select Data Check下拉框,看能不能列出检查项。能列出Geometry Check、Attribute Check这些,说明核心组件正常。
第二个动作:在Reviewer → Batch Job Runner里新建一个空 job,看能不能保存为.rbj文件。这一步验证的是批处理引擎是否可用。
第三个动作:打开Reviewer → Manage Reviewer Results,看能不能连上默认的 Reviewer 工作空间。10.2 默认用 Access 个人地理数据库存校验结果,路径通常在C:\Users\你的用户名\AppData\Roaming\ESRI\DataReviewer\下。如果这里报错,多半是权限问题,用管理员身份跑一次 ArcMap 让它初始化。
注意:Data Reviewer 的结果存储库不要放在网络盘上,10.2 对 UNC 路径的支持不稳定,容易在批量写入时锁死。
3. 校验规则怎么写:从几何检查到属性域校验的实操
3.1 几何检查:自相交、面重叠、悬挂节点
Data Reviewer 的几何检查分两类:一类是单要素自身的几何合法性,比如自相交、空几何、短线段;另一类是要素间的空间关系,比如面重叠、线悬挂、点不在线上。在工具条上点Select Data Check → Geometry Check,会弹出一个配置面板。
以面重叠检查为例,配置项里最关键的是Overlap Type,可选Any Overlap和Area Overlap。前者只要两个面有公共区域就报,后者可以设面积阈值,比如只报重叠面积大于 10 平方米的。我一般会设Area Overlap并给一个容差值,因为相邻地块共享边时,由于浮点精度问题,边界上可能出现极细的条状重叠,这种属于“假报”,不设阈值会被淹没。
# 用 arcpy 调 Data Reviewer 的几何检查(需在 ArcMap 的 Python 窗口里跑) import arcpy arcpy.CheckOutExtension("DataReviewer") # 创建 Reviewer 工作空间 reviewer_ws = r"C:\ReviewerWorkspace\reviewer.gdb" arcpy.CreateReviewerWorkspace_Reviewer(reviewer_ws, "REVIEWER", "REVIEWER") # 定义几何检查参数 input_fc = r"C:\Data\parcels.shp" check_type = "GEOMETRY" geometry_check = "OVERLAP" tolerance = "10 Meters" # 执行检查 arcpy.ExecuteDataCheck_Reviewer( input_fc, reviewer_ws, check_type, geometry_check, tolerance )逻辑说明:CheckOutExtension是必须的,否则后面所有 Reviewer 函数都会抛许可错误。CreateReviewerWorkspace_Reviewer建的是存校验结果的工作空间,不是你的业务数据库。ExecuteDataCheck_Reviewer的前两个参数是输入要素和结果库,第三个参数指定检查大类,第四个指定具体检查项,第五个是容差。容差的单位要和你要素类的空间参考一致,如果要素是地理坐标系(度),写10 Meters会报单位不匹配,得改成0.0001 DecimalDegrees之类的。
参数怎么调:OVERLAP检查的容差建议设成你业务上能接受的最小重叠面积。比如地块数据,10 平方米以下的重叠可以忽略,那就设 10。如果是行政区划面,重叠面积阈值可以设大一点,比如 1000 平方米,因为行政区划边界通常有明确的坐标点,小重叠多半是数字化误差。
3.2 属性检查:字段空值、域值越界、格式匹配
属性检查的入口是Select Data Check → Attribute Check。常用的有三类:Null Value Check查必填字段是否为空,Domain Check查字段值是否在编码域内,Regular Expression Check查文本字段是否符合格式(比如身份证号、地块编号)。
配置Domain Check时,你需要先有一个编码域(Coded Value Domain)挂在字段上。如果数据是从 Shapefile 转过来的,域信息会丢,得在目标地理数据库里重建域。重建之后,在检查配置里选Domain Check,指定要素类、字段、以及“是否允许空值”。
# 属性域检查的 arcpy 写法 import arcpy arcpy.CheckOutExtension("DataReviewer") reviewer_ws = r"C:\ReviewerWorkspace\reviewer.gdb" input_fc = r"C:\Data\landuse.gdb\parcels" field_name = "LANDUSE_CODE" arcpy.ExecuteDataCheck_Reviewer( input_fc, reviewer_ws, "ATTRIBUTE", "DOMAIN", field_name )逻辑说明:DOMAIN检查依赖字段上绑定的域。如果字段没绑域,这个检查会直接跳过并返回空结果,不会报错,所以跑完之后要确认结果表里有没有记录。参数field_name只传字段名,不传表名。如果要对多个字段做域检查,得循环调用,每次换字段名。
正则检查在 10.2 里支持的是有限正则语法,不支持 lookahead 和 lookbehind。比如你要查地块编号是否符合“字母+8位数字”的格式,写^[A-Z]{1}[0-9]{8}$可以,但写^(?!0000)这种负向断言就会报语法错误。这是 10.2 的 Python 2.7 正则引擎限制,不是 Data Reviewer 的锅。
3.3 把检查项串成批处理任务
单次检查跑完只出一个结果表,实际项目里往往要跑十几项检查。这时候用Batch Job Runner。在 ArcMap 里打开Reviewer → Batch Job Runner,新建一个 job,把前面配好的检查项逐个加进去。每个检查项可以单独设输入要素和参数,也可以引用同一个工作空间。
批处理文件保存为.rbj,本质是个 XML。你可以用文本编辑器打开看,里面记录了每个检查的类型、参数、输入路径。如果要在多台机器上复用,把.rbj和结果库模板一起拷过去,改一下路径就行。但注意,.rbj里的路径如果是绝对路径,换机器必挂,所以建议在配 job 的时候就用相对路径或者统一的工作空间别名。
<!-- .rbj 文件片段:一个几何检查加一个属性检查 --> <Job> <DataCheck> <Type>GEOMETRY</Type> <SubType>OVERLAP</SubType> <InputDataset>parcels</InputDataset> <Tolerance>10 Meters</Tolerance> </DataCheck> <DataCheck> <Type>ATTRIBUTE</Type> <SubType>DOMAIN</SubType> <InputDataset>parcels</InputDataset> <Field>LANDUSE_CODE</Field> </DataCheck> </Job>逻辑说明:InputDataset写的是要素类名而不是全路径,前提是你在 job 里配了工作空间。如果直接写全路径,换机器时改路径的工作量会很大。Tolerance的单位跟着数据空间参考走,不要硬编码。
4. 跑批与结果解读:校验报告里哪些是真问题
4.1 批量执行与日志查看
批处理跑起来之后,Data Reviewer 会往结果库里写三类表:REVIEWER_STATUS记录每个检查项的执行状态,REVIEWER_RESULTS存具体的错误要素,REVIEWER_BATCHJOB存 job 级别的汇总。跑完之后先看REVIEWER_STATUS,如果某个检查项状态是Failed,点进去看错误信息。常见失败原因:输入要素被其他进程锁了、结果库磁盘满、容差单位不匹配。
-- 查最近一次批处理里所有失败或警告的检查项 SELECT CHECK_NAME, STATUS, ERROR_MESSAGE FROM REVIEWER_STATUS WHERE STATUS IN ('Failed', 'Warning') ORDER BY CHECK_NAME;逻辑说明:REVIEWER_STATUS表在结果地理数据库里,用 Access 或 SQLite 客户端都能查。STATUS字段的值通常是Passed、Failed、Warning。Warning一般表示检查跑完了但有异常,比如部分要素被跳过。ERROR_MESSAGE里会写具体原因,比如“单位不匹配”或“表被锁定”。
4.2 结果表里的字段含义
REVIEWER_RESULTS是核心表,每条记录对应一个被检出的问题要素。关键字段有:ORIGIN_CHECK(哪个检查项报的)、FEATURE_OID(问题要素的 ObjectID)、ERROR_TYPE(错误类型)、SEVERITY(严重级别)、DESCRIPTION(文字描述)。SEVERITY分 1 到 5,1 最严重,5 最轻。实际处理时,先过滤SEVERITY <= 2的,这些是必须改的;3 到 5 的可以视项目要求决定是否处理。
# 从结果表里导出严重级别 1 和 2 的问题要素 import arcpy reviewer_ws = r"C:\ReviewerWorkspace\reviewer.gdb" results_table = reviewer_ws + r"\REVIEWER_RESULTS" output_fc = r"C:\Data\critical_issues.shp" # 用 MakeFeatureLayer 加定义查询 arcpy.MakeFeatureLayer_management(results_table, "critical_lyr", "SEVERITY <= 2") arcpy.CopyFeatures_management("critical_lyr", output_fc)逻辑说明:MakeFeatureLayer的第三个参数是 SQL 表达式,直接过滤SEVERITY。注意结果表本身是地理数据库里的对象类,不是要素类,所以CopyFeatures出来的是带几何的要素(如果原始检查是几何检查)。如果是属性检查,结果表里可能没有几何字段,CopyFeatures会报错,这时候改用TableToTable。
4.3 把结果回写到原始数据做标记
实际工作中,质检结果不能只躺在 Reviewer 库里,得让数据生产人员看到哪些要素有问题。常见做法是在原始要素类里加一个QC_FLAG字段,跑完检查后用FEATURE_OID做关联更新。
# 把严重问题标记回原始要素类 import arcpy original_fc = r"C:\Data\landuse.gdb\parcels" results_table = r"C:\ReviewerWorkspace\reviewer.gdb\REVIEWER_RESULTS" # 先加字段 arcpy.AddField_management(original_fc, "QC_FLAG", "SHORT") # 用 UpdateCursor 关联更新 with arcpy.da.UpdateCursor(original_fc, ["OID@", "QC_FLAG"]) as cursor: for row in cursor: oid = row[0] # 查结果表里有没有这个 OID 的严重问题 with arcpy.da.SearchCursor(results_table, ["FEATURE_OID", "SEVERITY"], "FEATURE_OID = {} AND SEVERITY <= 2".format(oid)) as sc: has_critical = any(sc) row[1] = 1 if has_critical else 0 cursor.updateRow(row)逻辑说明:这段代码对每个要素查一次结果表,效率不高,但逻辑清晰。如果要素上万,建议先把结果表里SEVERITY <= 2的FEATURE_OID读到一个 set 里,再遍历原始要素做判断,能快一个数量级。OID@是 arcpy 的语法,取 ObjectID。QC_FLAG设 1 表示有严重问题,0 表示没问题。
5. 避坑与排查:Data Reviewer 10.2 的五个血泪教训
5.1 工具条全灰,扩展勾了也没用
现象:Customize → Extensions里 Data Reviewer 已经勾选,但工具条按钮还是灰的。原因:许可级别不够,或者扩展的 DLL 注册到了错误的注册表视图。解决:先确认 Desktop 许可级别是 Standard 或 Advanced,然后在ArcGIS Administrator里看 Data Reviewer 的可用状态。如果许可没问题,用管理员身份重跑安装程序的 Repair,再查Wow6432Node下的注册表键。
5.2 批量跑一半卡死,日志里全是“表被锁定”
现象:Batch Job Runner 跑到某个检查项时进度条不动,强制结束之后结果库里一堆Failed。原因:结果库放在网络盘,或者 ArcMap 同时开着结果表的属性窗口。解决:结果库必须放本地磁盘,跑批之前关掉所有结果表的预览窗口。如果已经锁了,用Reviewer → Manage Reviewer Results里的“Compact”功能压缩结果库,或者直接删掉.lock文件。
5.3 几何检查报了一堆“假重叠”
现象:面重叠检查报出几百条记录,但人工看地图上根本看不出重叠。原因:相邻面的共享边在浮点精度下产生了极细的条状重叠,面积远小于容差。解决:把Overlap Type从Any Overlap改成Area Overlap,并设一个合理的面积阈值。如果数据是地理坐标系,阈值单位用平方度,数值要设得很小,比如0.000001。
5.4 属性域检查返回空结果,但字段确实有越界值
现象:DOMAIN检查跑完,结果表里一条记录都没有,但手动查属性表发现字段值不在域内。原因:字段没有绑定编码域,或者绑定的域和检查时选的域不是同一个。解决:在 ArcCatalog 里检查字段的域属性,确认域已经绑定。如果数据是从 Shapefile 导入的,域信息会丢,需要在目标地理数据库里重建域并重新绑定。
5.5 换机器后 .rbj 文件跑不起来
现象:在 A 机器上配好的批处理文件,拷到 B 机器上打开,所有检查项都报“输入数据集不存在”。原因:.rbj里存的是绝对路径,B 机器上没有同样的目录结构。解决:配 job 的时候用工作空间别名而不是绝对路径,或者把数据和结果库放在相对路径下。如果已经配死了,用文本编辑器打开.rbj,批量替换路径。
6. 进阶技巧:用 Python 脚本把 Data Reviewer 嵌进自动化流水线
Data Reviewer 10.2 的图形界面适合配规则和做一次性检查,但如果你每天都要跑同一套质检,每次点工具条就是浪费生命。我一般会把整个流程写成 Python 脚本,用 Windows 任务计划程序定时跑。核心思路是:用 arcpy 调ExecuteDataCheck_Reviewer跑检查,用SearchCursor读结果表,用UpdateCursor回写标记,最后把汇总报告导出成 CSV 发给相关人。
# 自动化质检流水线:跑检查、导出报告、回写标记 import arcpy import csv import datetime arcpy.CheckOutExtension("DataReviewer") # 配置区 reviewer_ws = r"C:\ReviewerWorkspace\reviewer.gdb" input_fc = r"C:\Data\landuse.gdb\parcels" report_csv = r"C:\Reports\qc_report_{}.csv".format( datetime.datetime.now().strftime("%Y%m%d")) # 第一步:跑几何重叠检查 arcpy.ExecuteDataCheck_Reviewer( input_fc, reviewer_ws, "GEOMETRY", "OVERLAP", "10 Meters") # 第二步:跑属性域检查 arcpy.ExecuteDataCheck_Reviewer( input_fc, reviewer_ws, "ATTRIBUTE", "DOMAIN", "LANDUSE_CODE") # 第三步:读结果表,导出 CSV results_table = reviewer_ws + r"\REVIEWER_RESULTS" with open(report_csv, "wb") as f: writer = csv.writer(f) writer.writerow(["CHECK_NAME", "FEATURE_OID", "SEVERITY", "DESCRIPTION"]) with arcpy.da.SearchCursor(results_table, ["ORIGIN_CHECK", "FEATURE_OID", "SEVERITY", "DESCRIPTION"]) as cursor: for row in cursor: writer.writerow(row) # 第四步:把严重问题回写到原始要素的 QC_FLAG 字段 critical_oids = set() with arcpy.da.SearchCursor(results_table, ["FEATURE_OID"], "SEVERITY <= 2") as cursor: for row in cursor: critical_oids.add(row[0]) with arcpy.da.UpdateCursor(input_fc, ["OID@", "QC_FLAG"]) as cursor: for row in cursor: row[1] = 1 if row[0] in critical_oids else 0 cursor.updateRow(row) print("质检完成,报告已导出到 {}".format(report_csv))逻辑说明:这段脚本把四个步骤串在一起。第一步和第二步的ExecuteDataCheck_Reviewer参数和前面讲的一致。第三步用 Python 2.7 的csv模块写报告,注意open的模式是"wb",因为 10.2 的 Python 是 2.7,写 CSV 要用二进制模式避免空行。第四步先把严重问题的 OID 读进 set,再遍历原始要素更新QC_FLAG,比逐要素查结果表快得多。
参数怎么改:reviewer_ws换成你自己的结果库路径,input_fc换成待检要素类。OVERLAP的容差10 Meters根据数据空间参考调整。SEVERITY <= 2这个阈值可以按项目要求改成<= 3或<= 1。报告路径里的日期格式可以改成你习惯的。
这套脚本跑通之后,可以挂到 Windows 任务计划里,每天凌晨跑一次,早上到工位直接看 CSV。如果结果里严重问题数量超过阈值,再手动介入。这样质检就从“人追着数据跑”变成了“数据追着人跑”。
我自己的习惯是:每次改完检查规则,先用一个 100 条左右的小样本跑一遍,确认结果表里的记录数和预期一致,再上全量数据。全量跑之前一定先备份原始要素类,因为UpdateCursor写QC_FLAG的时候如果逻辑写错,会把所有要素标成有问题,后悔药可没地方买。希望帮到你。
本文还有配套的精品资源,点击获取