Files
sunvpy-docs/docs/content/30-shu-ju-jian-cha-ji-lu-guan-li.md
2026-04-10 13:47:53 +08:00

15 KiB
Raw Blame History

数据检查记录管理是 SunvStation 数据质量保证系统的核心组件,用于记录、追踪和管理数据验证过程中发现的各类问题。通过该机制,您可以系统地捕获检查结果、定位问题对象、记录问题描述,并支持后续的统计分析和问题修复工作。数据检查记录为数据生产流程提供了可追溯的质量控制能力。

Sources: PySSCheck.py

系统架构概览

数据检查记录管理基于 CheckFunForPY 类实现,该类通过 SWIG 封装技术连接 Python 业务逻辑与 C++ 核心检查引擎。在整个系统架构中CheckFunForPY 位于接口层,与工作空间、地图管理等核心模块协同工作,形成完整的数据质量保障体系。

graph TB
    subgraph "应用层 Python 业务逻辑"
        Script[检查脚本]
    end
    
    subgraph "接口层 SWIG 封装"
        CheckFun[CheckFunForPY<br/>检查记录管理类]
        OtherMods[其他接口模块<br/>PySSCore, PySSMap等]
    end
    
    subgraph "实现层 C++ 核心库"
        CheckDL[_PySSCheck.pyd<br/>检查引擎实现]
        OtherDL[其他核心库<br/>_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

核心功能模块

数据检查记录管理包含六大核心功能模块,每个模块对应一组相关的方法,共同构成完整的检查记录生命周期管理能力。

记录生命周期管理

方法名称 功能说明 典型应用场景
AddCheckRecord() 添加一条新的检查记录 数据验证脚本发现问题时记录
RemoveCheckRecord() 删除指定的检查记录 误报修正或批量清理
GetCheckRecordCount() 获取当前检查记录总数 统计分析、进度监控
ClearCheckRecord() 清空所有检查记录 开始新一轮检查前初始化

记录的生命周期从添加开始,经过可能的删除操作,最终通过保存操作持久化。这种设计遵循最小状态原则,检查记录仅在内存中维护显式状态,避免隐式的后台同步操作。

Sources: PySSCheck.py

持久化与IO操作

方法名称 功能说明 操作目标
LoadCheckRecord() 从文件加载历史检查记录 恢复之前保存的检查结果
SaveCheckRecord() 将当前检查记录保存到文件 持久化存储检查结果
WriteCheckRecord() 将检查记录写入系统输出 与系统检查模块集成

持久化操作支持检查结果的跨会话复用,您可以在不同时间点加载和比较检查结果,追踪数据质量的演变趋势。

Sources: PySSCheck.py

查询与访问

方法名称 功能说明 参数说明
GetCheckRecordValue() 获取指定记录的字段值 支持批量获取多个字段
ShowCheckOutput() 显示检查输出结果 在系统界面中呈现

查询方法提供了灵活的数据访问能力,支持按索引定位记录并提取特定字段,便于生成定制化的报告或进行深度分析。

Sources: PySSCheck.py

检查记录数据结构

每条检查记录包含丰富的元数据信息,用于完整描述检查发现的问题。理解这些字段的结构是有效使用检查记录功能的基础。

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

关键字段说明

字段名 数据类型 说明 示例值
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

典型使用流程

数据检查记录管理遵循标准的 创建-操作-保存 流程。理解这个流程有助于编写结构清晰、逻辑严谨的检查脚本。

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

基础实例化

与 sunvpy 中其他需要显式实例化的类一样,使用 CheckFunForPY 首先需要创建实例。

from sunvpy.PySSCheck import CheckFunForPY

# 创建检查记录管理实例
check_fun = CheckFunForPY()

实例化后check_fun 对象维护一个独立的检查记录集合,与其他实例或系统全局检查记录互不干扰。

Sources: PySSCheck.py

添加检查记录

添加检查记录是数据质量验证脚本的核心操作。以下示例展示了如何记录一个重叠检查问题:

# 检查到两个面对象重叠
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

统计与查询

检查完成后,通常需要获取统计信息或详细记录,用于生成报告或进行后续分析。

# 获取检查记录总数
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

持久化与清理

检查记录的生命周期管理包括保存和清理操作,确保数据不会意外丢失或占用过多内存。

# 保存检查记录到文件
check_fun.SaveCheckRecord()

# 在系统界面中显示检查结果
check_fun.ShowCheckOutput()

# 清空检查记录,准备下一次检查
check_fun.ClearCheckRecord()

保存操作会将当前内存中的所有检查记录写入系统配置的默认位置通常位于工作目录下的特定文件夹中。ShowCheckOutput 方法会触发系统内置的检查结果查看器,提供可视化的结果浏览界面。

Sources: PySSCheck.py

检查记录的高级应用

在实际的数据生产项目中,检查记录管理通常与其他 sunvpy 功能结合使用,形成完整的质量控制解决方案。

与选择集的协同

检查记录通常基于选择集操作的结果生成,以下是一个完整的检查流程示例:

from sunvpy import SSProcess
from sunvpy.PySSCheck import CheckFunForPY

# 1. 创建检查记录实例
check_fun = CheckFunForPY()

# 2. 设置选择条件,筛选可能存在问题的对象
SSProcess.clearSelection()
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_LayerName", "==", "建筑")
SSProcess.setSelectCondition("<Overlap>", "==", "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

历史记录对比

通过 LoadCheckRecord 方法,可以加载历史检查记录进行对比分析,追踪数据质量的改进情况。

# 加载之前的检查记录
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

性能考虑与最佳实践

在大规模数据检查场景下,合理使用检查记录管理功能对于保证脚本性能至关重要。

批量操作优化

检查记录的添加操作相对轻量,但在数十万级别记录时仍需注意性能。建议采用分批保存策略:

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

记录内容优化

在记录量大的情况下,精简描述信息可以提升整体性能:

# 简洁描述(推荐)
desc = f"重叠|obj_{geo_id}|{layer_name}"

# 冗长描述(避免)
desc = f"在图层 '{layer_name}' 中,编码为 {geo_id} 的地物对象与其他对象存在空间重叠现象,需要进行进一步的空间关系分析和几何修正处理"

描述信息主要用于问题定位,过度详细的描述会占用额外的存储空间并影响后续查询性能。

Sources: PySSCheck.py

常见问题与故障排除

记录无法保存

如果 SaveCheckRecord 调用失败,通常是因为以下原因:

  1. 文件权限问题:确保脚本有写入输出目录的权限
  2. 路径不存在:检查系统配置的输出路径是否有效
  3. 磁盘空间不足:检查磁盘剩余空间
# 添加错误处理
try:
    check_fun.SaveCheckRecord()
    print("检查记录保存成功")
except Exception as e:
    print(f"保存失败: {e}")

geoids 和 noteids 格式错误

这两个字段需要以逗号分隔的字符串形式提供,错误格式可能导致关联失败:

# 正确格式
geo_ids = "1001,1002,1003"

# 错误格式(会导致问题)
geo_ids = "1001; 1002; 1003"  # 使用了分号
geo_ids = "[1001,1002]"       # 使用了括号

GetCheckRecordValue 返回空值

当指定索引超出范围或字段名称不存在时,该方法可能返回空字符串。应始终进行有效性检查:

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

学习路径建议

数据检查记录管理是 SunvStation 数据质量保障体系的基础,掌握本页面的内容后,建议按照以下顺序深入学习:

  1. 添加与加载检查记录 - 详细了解 AddCheckRecord 和 LoadCheckRecord 的高级用法
  2. 显示检查结果 - 掌握 ShowCheckOutput 和结果可视化技巧
  3. 自定义检查规则 - 学习如何构建自定义的数据检查逻辑

通过系统学习这些内容,您将能够构建完整的数据质量控制和问题追踪系统。