数据检查记录管理是 SunvStation 数据质量保证系统的核心组件,用于记录、追踪和管理数据验证过程中发现的各类问题。通过该机制,您可以系统地捕获检查结果、定位问题对象、记录问题描述,并支持后续的统计分析和问题修复工作。数据检查记录为数据生产流程提供了可追溯的质量控制能力。 Sources: [PySSCheck.py](PySSCheck.py#L101-L160) ## 系统架构概览 数据检查记录管理基于 **CheckFunForPY** 类实现,该类通过 SWIG 封装技术连接 Python 业务逻辑与 C++ 核心检查引擎。在整个系统架构中,CheckFunForPY 位于接口层,与工作空间、地图管理等核心模块协同工作,形成完整的数据质量保障体系。 ```mermaid graph TB subgraph "应用层 Python 业务逻辑" Script[检查脚本] end subgraph "接口层 SWIG 封装" CheckFun[CheckFunForPY
检查记录管理类] OtherMods[其他接口模块
PySSCore, PySSMap等] end subgraph "实现层 C++ 核心库" CheckDL[_PySSCheck.pyd
检查引擎实现] OtherDL[其他核心库
_PySSCore.pyd等] end Script -->|实例化| CheckFun Script -->|可能调用| OtherMods CheckFun -->|调用| CheckDL CheckFun -.->|协作| OtherMods OtherMods --> OtherDL style CheckFun fill:#e1f5ff style CheckDL fill:#fff4e1 ``` CheckFunForPY 类采用了 **记录集管理模式**,检查记录以集合形式在内存中维护,提供增删改查的完整操作。与 SSProcessManager 的单例模式不同,CheckFunForPY 需要显式实例化,这种设计允许同时维护多个独立的检查记录集合,适用于并行检查或分段检查等复杂场景。 Sources: [PySSCheck.py](PySSCheck.py#L101-L160) ## 核心功能模块 数据检查记录管理包含六大核心功能模块,每个模块对应一组相关的方法,共同构成完整的检查记录生命周期管理能力。 ### 记录生命周期管理 | 方法名称 | 功能说明 | 典型应用场景 | |---------|---------|------------| | `AddCheckRecord()` | 添加一条新的检查记录 | 数据验证脚本发现问题时记录 | | `RemoveCheckRecord()` | 删除指定的检查记录 | 误报修正或批量清理 | | `GetCheckRecordCount()` | 获取当前检查记录总数 | 统计分析、进度监控 | | `ClearCheckRecord()` | 清空所有检查记录 | 开始新一轮检查前初始化 | 记录的生命周期从添加开始,经过可能的删除操作,最终通过保存操作持久化。这种设计遵循**最小状态原则**,检查记录仅在内存中维护显式状态,避免隐式的后台同步操作。 Sources: [PySSCheck.py](PySSCheck.py#L114-L123) ### 持久化与IO操作 | 方法名称 | 功能说明 | 操作目标 | |---------|---------|---------| | `LoadCheckRecord()` | 从文件加载历史检查记录 | 恢复之前保存的检查结果 | | `SaveCheckRecord()` | 将当前检查记录保存到文件 | 持久化存储检查结果 | | `WriteCheckRecord()` | 将检查记录写入系统输出 | 与系统检查模块集成 | 持久化操作支持检查结果的跨会话复用,您可以在不同时间点加载和比较检查结果,追踪数据质量的演变趋势。 Sources: [PySSCheck.py](PySSCheck.py#L108-L110) ### 查询与访问 | 方法名称 | 功能说明 | 参数说明 | |---------|---------|---------| | `GetCheckRecordValue()` | 获取指定记录的字段值 | 支持批量获取多个字段 | | `ShowCheckOutput()` | 显示检查输出结果 | 在系统界面中呈现 | 查询方法提供了灵活的数据访问能力,支持按索引定位记录并提取特定字段,便于生成定制化的报告或进行深度分析。 Sources: [PySSCheck.py](PySSCheck.py#L124-L125) ## 检查记录数据结构 每条检查记录包含丰富的元数据信息,用于完整描述检查发现的问题。理解这些字段的结构是有效使用检查记录功能的基础。 ```mermaid classDiagram class CheckRecord { +string group 检查组名 +string check 检查项名称 +int checkmodel 检查模式 +string description 问题描述 +float x 问题位置X坐标 +float y 问题位置Y坐标 +float z 问题位置Z坐标 +int objtype 对象类型 +string geoids 地物ID列表 +string noteids 注记ID列表 } class CheckFunForPY { +AddCheckRecord(group, check, ...) +GetCheckRecordValue(index, fields, values) +RemoveCheckRecord(group, check) +GetCheckRecordCount() +LoadCheckRecord() +SaveCheckRecord() } CheckFunForPY "1" *-- "0..*" CheckRecord : 管理记录集合 ``` 检查记录采用**坐标定位 + 对象关联**的双重定位机制。通过 x、y、z 坐标可以直接定位问题发生的地理位置,通过 geoids 和 noteids 可以关联到具体的地物对象和注记对象,这种设计既支持空间定位,也支持对象级别的追踪修复。 Sources: [PySSCheck.py](PySSCheck.py#L113-L114) ### 关键字段说明 | 字段名 | 数据类型 | 说明 | 示例值 | |-------|---------|------|--------| | `group` | string | 检查组名称,用于分类管理 | "拓扑检查" | | `check` | string | 检查项名称,标识具体检查类型 | "重叠检查" | | `checkmodel` | int | 检查模式标识符 | 0 | | `description` | string | 问题描述或错误详情 | "面对象与线对象存在重叠" | | `x` | float | 问题位置X坐标 | 123456.78 | | `y` | float | 问题位置Y坐标 | 345678.90 | | `z` | float | 问题位置Z坐标(可选) | 0.0 | | `objtype` | int | 问题对象类型 | 2(面对象) | | `geoids` | string | 地物对象ID列表,逗号分隔 | "1001,1002,1003" | | `noteids` | string | 注记对象ID列表,逗号分隔 | "2001,2002" | Sources: [PySSCheck.py](PySSCheck.py#L113-L114) ## 典型使用流程 数据检查记录管理遵循标准的 **创建-操作-保存** 流程。理解这个流程有助于编写结构清晰、逻辑严谨的检查脚本。 ```mermaid flowchart LR A[开始数据检查任务] --> B[创建 CheckFunForPY 实例] B --> C[执行数据检查逻辑] C --> D{发现数据问题?} D -->|否| C D -->|是| E[调用 AddCheckRecord 记录问题] E --> C C --> F{检查流程完成?} F -->|否| C F -->|是| G[调用 GetCheckRecordCount 统计] G --> H{需要显示结果?} H -->|是| I[调用 ShowCheckOutput] H -->|否| J[调用 SaveCheckRecord 保存] I --> J J --> K[检查记录管理完成] ``` 该流程体现了**渐进式积累**的设计理念:检查记录在检查过程中逐步添加,最后统一处理显示和保存,这种方式避免了频繁的 I/O 操作,提升了大规模数据检查的性能。 Sources: [PySSCheck.py](PySSCheck.py#L108-L125) ### 基础实例化 与 sunvpy 中其他需要显式实例化的类一样,使用 CheckFunForPY 首先需要创建实例。 ```python from sunvpy.PySSCheck import CheckFunForPY # 创建检查记录管理实例 check_fun = CheckFunForPY() ``` 实例化后,check_fun 对象维护一个独立的检查记录集合,与其他实例或系统全局检查记录互不干扰。 Sources: [PySSCheck.py](PySSCheck.py#L156-L158) ### 添加检查记录 添加检查记录是数据质量验证脚本的核心操作。以下示例展示了如何记录一个重叠检查问题: ```python # 检查到两个面对象重叠 group_name = "拓扑检查" check_name = "重叠检查" check_model = 0 desc = "建筑物A与建筑物B存在空间重叠" x_pos = 123456.78 y_pos = 345678.90 z_pos = 0.0 obj_type = 2 # 面对象 geo_ids = "1001,1002" # 两个重叠对象的ID note_ids = "" # 无注记对象 # 添加检查记录 check_fun.AddCheckRecord( group_name, check_name, check_model, desc, x_pos, y_pos, z_pos, obj_type, geo_ids, note_ids ) ``` 在实际应用中,geoids 和 noteids 通常从当前选择集或遍历结果中提取,这需要与 SSProcessManager 的选择集功能配合使用。 Sources: [PySSCheck.py](PySSCheck.py#L113-L114) ### 统计与查询 检查完成后,通常需要获取统计信息或详细记录,用于生成报告或进行后续分析。 ```python # 获取检查记录总数 count = check_fun.GetCheckRecordCount() print(f"共发现 {count} 个问题") # 遍历检查记录 for i in range(count): fields = "group,check,description,geoids" values = "" # 获取记录值(通过引用参数返回) check_fun.GetCheckRecordValue(i, fields, values) # values 包含所有请求字段的值,按逗号分隔 print(f"记录 {i}: {values}") ``` GetCheckRecordValue 方法采用 **批量字段获取** 的设计,一次调用可以获取多个字段,减少方法调用次数,提升性能。返回的 values 字符串按照 fields 参数中指定的字段顺序,以逗号分隔各个字段值。 Sources: [PySSCheck.py](PySSCheck.py#L124-L125) ### 持久化与清理 检查记录的生命周期管理包括保存和清理操作,确保数据不会意外丢失或占用过多内存。 ```python # 保存检查记录到文件 check_fun.SaveCheckRecord() # 在系统界面中显示检查结果 check_fun.ShowCheckOutput() # 清空检查记录,准备下一次检查 check_fun.ClearCheckRecord() ``` 保存操作会将当前内存中的所有检查记录写入系统配置的默认位置,通常位于工作目录下的特定文件夹中。ShowCheckOutput 方法会触发系统内置的检查结果查看器,提供可视化的结果浏览界面。 Sources: [PySSCheck.py](PySSCheck.py#L108-L112) ## 检查记录的高级应用 在实际的数据生产项目中,检查记录管理通常与其他 sunvpy 功能结合使用,形成完整的质量控制解决方案。 ### 与选择集的协同 检查记录通常基于选择集操作的结果生成,以下是一个完整的检查流程示例: ```python from sunvpy import SSProcess from sunvpy.PySSCheck import CheckFunForPY # 1. 创建检查记录实例 check_fun = CheckFunForPY() # 2. 设置选择条件,筛选可能存在问题的对象 SSProcess.clearSelection() SSProcess.clearSelectCondition() SSProcess.setSelectCondition("SSObj_LayerName", "==", "建筑") SSProcess.setSelectCondition("", "==", "True") # 3. 执行过滤查询 SSProcess.selectFilter() # 4. 遍历选择集,记录问题 count = SSProcess.getSelGeoCount() for i in range(count): geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) layer_name = SSProcess.getSelGeoValue(i, "SSObj_LayerName") # 添加检查记录 check_fun.AddCheckRecord( group="拓扑检查", check="重叠检查", checkmodel=0, description=f"图层 '{layer_name}' 中的地物存在重叠", x=x, y=y, z=0.0, objtype=2, geoids=str(geo_id), noteids="" ) # 5. 保存并显示结果 print(f"检查完成,共发现 {check_fun.GetCheckRecordCount()} 个问题") check_fun.SaveCheckRecord() check_fun.ShowCheckOutput() ``` 该示例展示了检查记录管理与选择集操作的典型协作模式,体现了**查询-遍历-记录**的三阶段处理流程。 Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L29-L38) ### 历史记录对比 通过 LoadCheckRecord 方法,可以加载历史检查记录进行对比分析,追踪数据质量的改进情况。 ```python # 加载之前的检查记录 check_fun.LoadCheckRecord() old_count = check_fun.GetCheckRecordCount() print(f"历史记录中共有 {old_count} 个问题") # 执行新的检查... # ...检查逻辑... # 清空历史记录,保存新的检查结果 check_fun.ClearCheckRecord() # ...添加新的检查记录... new_count = check_fun.GetCheckRecordCount() print(f"本次检查发现 {new_count} 个问题") print(f"数据质量改进: {old_count - new_count} 个问题已修复") ``` 对比分析功能为数据生产质量评估提供了量化指标,是数据质量管理体系的重要组成部分。 Sources: [PySSCheck.py](PySSCheck.py#L108-L110) ## 性能考虑与最佳实践 在大规模数据检查场景下,合理使用检查记录管理功能对于保证脚本性能至关重要。 ### 批量操作优化 检查记录的添加操作相对轻量,但在数十万级别记录时仍需注意性能。建议采用**分批保存**策略: ```python BATCH_SIZE = 1000 # 每1000条记录保存一次 for i in range(total_checks): # 执行检查并添加记录 check_fun.AddCheckRecord(...) # 分批保存 if (i + 1) % BATCH_SIZE == 0: check_fun.SaveCheckRecord() check_fun.ClearCheckRecord() # 可选:清空后继续累积 # 保存剩余记录 if total_checks % BATCH_SIZE != 0: check_fun.SaveCheckRecord() ``` 这种策略可以有效控制内存使用,避免检查记录集合过大导致性能下降。 Sources: [PySSCheck.py](PySSCheck.py#L108-L114) ### 记录内容优化 在记录量大的情况下,精简描述信息可以提升整体性能: ```python # 简洁描述(推荐) desc = f"重叠|obj_{geo_id}|{layer_name}" # 冗长描述(避免) desc = f"在图层 '{layer_name}' 中,编码为 {geo_id} 的地物对象与其他对象存在空间重叠现象,需要进行进一步的空间关系分析和几何修正处理" ``` 描述信息主要用于问题定位,过度详细的描述会占用额外的存储空间并影响后续查询性能。 Sources: [PySSCheck.py](PySSCheck.py#L113-L114) ## 常见问题与故障排除 ### 记录无法保存 如果 SaveCheckRecord 调用失败,通常是因为以下原因: 1. **文件权限问题**:确保脚本有写入输出目录的权限 2. **路径不存在**:检查系统配置的输出路径是否有效 3. **磁盘空间不足**:检查磁盘剩余空间 ```python # 添加错误处理 try: check_fun.SaveCheckRecord() print("检查记录保存成功") except Exception as e: print(f"保存失败: {e}") ``` ### geoids 和 noteids 格式错误 这两个字段需要以逗号分隔的字符串形式提供,错误格式可能导致关联失败: ```python # 正确格式 geo_ids = "1001,1002,1003" # 错误格式(会导致问题) geo_ids = "1001; 1002; 1003" # 使用了分号 geo_ids = "[1001,1002]" # 使用了括号 ``` ### GetCheckRecordValue 返回空值 当指定索引超出范围或字段名称不存在时,该方法可能返回空字符串。应始终进行有效性检查: ```python fields = "group,check,description" values = "" # 确保索引有效 if index < check_fun.GetCheckRecordCount(): check_fun.GetCheckRecordValue(index, fields, values) if not values: print(f"警告:记录 {index} 的数据不完整") else: print(f"错误:索引 {index} 超出范围") ``` Sources: [PySSCheck.py](PySSCheck.py#L124-L125) ## 学习路径建议 数据检查记录管理是 SunvStation 数据质量保障体系的基础,掌握本页面的内容后,建议按照以下顺序深入学习: 1. **[添加与加载检查记录](31-tian-jia-yu-jia-zai-jian-cha-ji-lu)** - 详细了解 AddCheckRecord 和 LoadCheckRecord 的高级用法 2. **[显示检查结果](32-xian-shi-jian-cha-jie-guo)** - 掌握 ShowCheckOutput 和结果可视化技巧 3. **[自定义检查规则](33-zi-ding-yi-jian-cha-gui-ze)** - 学习如何构建自定义的数据检查逻辑 通过系统学习这些内容,您将能够构建完整的数据质量控制和问题追踪系统。