3. 爆心距计算与测点坐标校核

为什么爆心距必须单独校核

PPV 回归中,爆心距 R 是分母项,萨道夫斯基公式 V = K·(Q^(1/3)/R)^α 对 R 的误差非常敏感。现场记录里 R 常由“爆区中心坐标 + 测点坐标”事后计算,一旦坐标录入错位(经纬度顺序颠倒、东/北坐标互换、漏掉小数点、测点编号与坐标错配),R 会出现数量级偏差,直接污染回归样本。因此本例把 R 作为独立字段重新计算,并与原始记录比对,形成规范化距离列。

坐标与距离的计算约定

采用平面直角坐标(矿山常用本地坐标系,单位 m),爆区中心取各爆区代表点坐标 (E0, N0),测点坐标 (Ei, Ni),则:

R_i = √[(E_i − E_0)² + (N_i − N_0)²]

约定:E 为东坐标(横轴),N 为北坐标(纵轴);若原始数据为经纬度,需先投影到平面坐标再计算,不可直接用经纬度差求欧氏距离。R 保留 1 位小数(m),并同时保留“斜距/平距”标识——本例统一用平距,若测点高程差大于 30 m 需另行说明。

爆心距计算与坐标校核:从原始坐标到规范化 R 字段 平面坐标与距离关系 E(东) N 爆区中心 (E₀,N₀) 测点 i (Eᵢ,Nᵢ) Rᵢ ΔE = Eᵢ−E₀ ΔN 坐标录入校核判定 读取 E₀,N₀ 与 Eᵢ,Nᵢ 计算 Rᵢ 与 R_记录 |ΔR|/R ≤ 5% ? 通过:写入 R 规范列 超限:回查坐标来源 修正后重算并留痕 典型坐标错误对 R 的影响(示例数据) E/N 互换:R 偏差可达数十米 漏小数点:R 放大 10 倍 测点编号错配:R 张冠李戴 经纬度直算:量纲错误 校核原则:R 必须由坐标重算,不直接沿用现场手记;偏差超 5% 即视为可疑样本,先查坐标再决定是否剔除。

用示例数据完成一次校核

下表为某爆次 4 个测点的原始记录与重算结果(示例数据,非实测)。爆区中心取 (E₀, N₀) = (1000.0, 2000.0) m。

测点E (m)N (m)R_记录 (m)R_重算 (m)相对偏差判定
#11060.02080.0100.0100.00.0%通过
#21150.02000.0150.0150.00.0%通过
#32000.01150.0150.01250.0733%E/N 互换,修正
#41090.02120.012.0120.0−90%漏小数点,修正

#3 的 E、N 明显互换(E 远大于 N 且与爆区方位不符),修正为 (1150.0, 2000.0) 后 R=150.0 m;#4 记录 R=12.0 m 与坐标算出的 120.0 m 相差 10 倍,判定为漏小数点,按重算值 120.0 m 写入。修正后 4 个样本 R 分别为 100.0、150.0、150.0、120.0 m。

可执行的校核脚本

下面脚本读入原始记录(含坐标与手记 R),重算 R、计算相对偏差、按 5% 阈值标记可疑样本,并输出规范化距离列。示例数据内嵌,可直接运行。

import math

# 原始记录:测点编号, E, N, R_记录
records = [
    ("#1", 1060.0, 2080.0, 100.0),
    ("#2", 1150.0, 2000.0, 150.0),
    ("#3", 2000.0, 1150.0, 150.0),
    ("#4", 1090.0, 2120.0,  12.0),
]
E0, N0 = 1000.0, 2000.0
TOL = 0.05  # 相对偏差阈值 5%

def dist(e, n):
    return math.hypot(e - E0, n - N0)

rows = []
for pid, e, n, r_rec in records:
    r_calc = dist(e, n)
    rel = (r_calc - r_rec) / r_rec if r_rec else float("inf")
    flag = "OK" if abs(rel) <= TOL else "CHECK"
    rows.append((pid, e, n, r_rec, round(r_calc, 1), round(rel * 100, 1), flag))

print(f"{'测点':<4}{'E':>8}{'N':>8}{'R记录':>8}{'R重算':>8}{'偏差%':>8}  判定")
for pid, e, n, r_rec, r_calc, rel, flag in rows:
    print(f"{pid:<4}{e:>8.1f}{n:>8.1f}{r_rec:>8.1f}{r_calc:>8.1f}{rel:>8.1f}  {flag}")

# 规范化距离列(可疑样本按重算值写入,并保留原值备查)
norm = [(pid, r_calc) for pid, _, _, _, r_calc, _, _ in rows]
print("\n规范化 R 列:", norm)

预期输出中 #1、#2 判定 OK,#3、#4 判定 CHECK;规范化 R 列为 100.0、150.0、1250.0、120.0 m——注意 #3 在未修正坐标前重算值仍是 1250.0 m,说明脚本只能“发现”偏差,坐标本身仍需人工回查修正。修正 #3 坐标后重跑,R 变为 150.0 m,全部样本通过。

脚本不会自动判断 E/N 是否互换,也不会自动补小数点。它只负责把“记录值 vs 重算值”的偏差暴露出来;坐标修正必须结合爆区方位、测点布置图和原始测量记录人工确认,修正过程要留痕(原值、修正值、依据)。

规范化距离字段的落地要求

  • 字段命名统一为 R_m,单位 m,保留 1 位小数,禁止混用 km 或斜距。
  • 同时保留 R_record 与 R_calc 两列,便于追溯;回归只使用 R_m。
  • 每个样本标注 coord_flag(OK / CHECK / FIXED),CHECK 样本在修正前不得进入回归。
  • 爆区中心坐标按爆次记录,同一爆次所有测点共用同一 (E₀, N₀),不得逐点更换。

完成以上步骤后,距离字段即可与后续的最大单响药量、PPV 按爆次正确配对,进入比例距离计算与散点绘制环节。