2. 温纳装置视电阻率数据格式转换与质量标记

温纳原始记录到 DAT 的字段映射

温纳装置野外记录通常以“测点号 + 电极距 a + 视电阻率 ρa”为主键,而 Res2DInv 的 DAT 文件要求按“测点位置 x、电极距 a、视电阻率、误差/质量标记”组织。转换的核心不是简单改扩展名,而是把野外记录中的排列参数换算成 Res2DInv 能识别的测点位置与层号,同时保留重复观测信息用于质量判定。

温纳排列中,四个电极 AMNB 等间距 a,测点位置取排列中心 x = (x_A + x_B)/2,视电阻率 ρa = 2πa·ΔV/I。Res2DInv 的 DAT 每行格式为:x a ρa err,其中 err 为百分比误差(0 表示无误差,负值表示该点被剔除)。因此转换时需保证 x 与 a 的对应关系与野外记录一致,不能把电极距误填为电极坐标。

温纳记录 → DAT 字段映射与质量标记 野外原始记录(温纳) 测点号 x_A x_B a ρa(Ω·m) L01 0 6 2 48.2 L01 0 6 2 47.9 ←重复 L01 2 8 2 51.3 L01 4 10 2 49.8 L01 6 12 2 96.5 ←离群 L01 8 14 2 50.1 L01 0 12 4 44.7 L01 2 14 4 46.0 L01 4 16 4 45.2 注:x_A、x_B 为电极坐标(m) 转换规则 ① 测点位置 x = (x_A+x_B)/2 ② 电极距 a 直接取记录值 ③ 重复观测取均值, 相对偏差 >5% 标 err=10 ④ 离群值(偏离邻点 >3σ)标 err=-1 剔除 ⑤ 正常点 err=0 DAT 行格式: x a ρa err err 为百分比误差,负值=剔除 输出 DAT(带质量标记) 3.0 2 48.05 0 5.0 2 51.30 0 7.0 2 49.80 0 9.0 2 96.50 -1 11.0 2 50.10 0 6.0 4 44.70 0 8.0 4 46.00 0 10.0 4 45.20 0 重复点已合并取均值 离群点 err=-1 保留标记 供反演时自动剔除

转换脚本与质量标记实现

下面给出一个可直接运行的 Python 脚本,读取 CSV 格式的温纳原始记录,完成测点位置换算、重复观测合并、离群值标记,并输出 Res2DInv 可读的 DAT 文件。示例数据为教学假设值,用于演示流程,不代表真实实测结果。

import csv, statistics

# 输入:温纳原始记录 CSV,字段 line, xA, xB, a, rho
rows = []
with open("wenner_raw.csv", newline="", encoding="utf-8") as f:
    for r in csv.DictReader(f):
        rows.append({
            "line": r["line"],
            "xA": float(r["xA"]), "xB": float(r["xB"]),
            "a": float(r["a"]), "rho": float(r["rho"])
        })

# 1) 计算测点位置 x = (xA+xB)/2,按 (x, a) 分组
groups = {}
for r in rows:
    x = (r["xA"] + r["xB"]) / 2.0
    key = (round(x, 3), r["a"])
    groups.setdefault(key, []).append(r["rho"])

# 2) 重复观测合并:取均值,相对偏差>5% 标 err=10
dat = []
for (x, a), vals in groups.items():
    mean = statistics.mean(vals)
    if len(vals) > 1:
        dev = max(abs(v - mean) / mean for v in vals) * 100
        err = 10 if dev > 5 else 0
    else:
        err = 0
    dat.append({"x": x, "a": a, "rho": mean, "err": err})

# 3) 离群值检测:同一 a 层内,偏离中位数 >3σ 标 err=-1
by_a = {}
for d in dat:
    by_a.setdefault(d["a"], []).append(d)
for a, lst in by_a.items():
    rhos = [d["rho"] for d in lst]
    med = statistics.median(rhos)
    sigma = statistics.pstdev(rhos) if len(rhos) > 1 else 0
    for d in lst:
        if sigma > 0 and abs(d["rho"] - med) > 3 * sigma:
            d["err"] = -1

# 4) 按 x 升序、a 升序输出 DAT
dat.sort(key=lambda d: (d["a"], d["x"]))
with open("line01.dat", "w", encoding="utf-8") as f:
    for d in dat:
        f.write(f"{d['x']:.2f}  {d['a']:.1f}  {d['rho']:.2f}  {d['err']}\n")
print("DAT 行数:", len(dat))

运行后得到 line01.dat,每行四个字段。Res2DInv 读取时,err=0 表示正常参与反演,err=10 表示该点误差较大但仍参与(权重降低),err=-1 表示该点被剔除。这样既保留了原始观测信息,又让反演程序按质量自动处理。

质量标记判读与验证

转换完成后需做三项检查:① 同一 a 层内 x 是否连续、无重复;② 重复观测的相对偏差是否集中在 5% 以内,若大量超限说明采集质量差;③ 被标 err=-1 的点是否集中在某一电极附近,若是则可能是接地问题而非地质异常。下表为示例数据的检查结果(教学假设值)。

检查项判据示例结果结论
x 连续性同层 x 间隔 = aa=2 层 x=3,5,7,9,11通过
重复观测偏差≤5%48.2 与 47.9,偏差 0.6%通过,取均值 48.05
离群点偏离中位数 >3σx=9, a=2 处 ρa=96.5标 err=-1 剔除
剔除点分布不集中于单电极仅 1 点,孤立可接受
若同一电极附近出现多个 err=-1 点,应先回查该电极的接地电阻记录,确认是接触问题后再决定是否整段剔除,避免误删真实地质异常。
不要把电极距 a 与电极坐标 x 混填。DAT 第二列必须是排列的电极间距(温纳为等间距 a),填错会导致反演层厚与深度比例整体失真。