
简介这份《Surpac Vision 地质数据库教程》面向矿山地质、测量与采矿工程技术人员以及地质信息管理相关专业的学生与初学者帮助其系统掌握 Surpac Vision 地质数据库的建库与数据管理方法。资源为单一 PDF 文档压缩包约 2.32MB内容按章节组织涵盖地质数据库介绍、数据库结构、创建流程、编辑浏览与管理、三维空间显示、地质解译与剖面品位计算、组合样品、地质统计与分析、线文件剖面输出及信息提取与报告等模块并附有 3D 转换实例与多边形资源评估附件。教程从表与字段分析、空库创建、数据导入验证到映射数据库逐步展开同时讲解钻孔显示风格、隐藏刷新、勘探线定义与矿体圈定等实操要点便于读者对照软件界面完成练习。目前已有 221 人学习适合作为地质数据库入门与日常操作的参考手册。1. 从一份 PDF 说起surpac 地质数据库到底在解决什么问题如果你在矿山地质、勘探或者测量岗位待过大概率遇到过这种场景钻孔数据散落在十几个 Excel 里有人用 CSV有人用 TXT列名一会儿是Cu_ppm一会儿是Cu%等到要出剖面图或者估品位的时候光是把数据对齐就得花掉一整天。surpac 地质数据库教程.pdf 这类资料之所以被反复搜索本质上是因为大家卡在了同一个地方——不是不会点软件按钮而是不知道数据该怎么组织、表结构该怎么设计、校验规则该卡在哪一层。surpac 的地质数据库模块核心思路是把钻孔、探槽、坑道这些工程数据拆成「孔口表 测斜表 样品表 岩性表」几张关系表用孔号hole_id做主键串起来再通过数据库引擎统一管理。它解决的不是画图问题而是「同一份数据不同人用、不同时间用结果一致」的问题。适合谁看地质工程师、数据库管理员、以及刚接手矿山数字化项目、需要把历史纸质台账电子化的技术员。这一章先把概念立住后面几章直接上表结构、SQL 和排错。2. 表结构怎么设计四张核心表与字段类型选择2.1 为什么是这四张表而不是一张大宽表很多人第一反应是「我把所有列塞进一张表不就行了」。短期看确实省事但 surpac 在生成剖面、做品位插值、按岩性过滤样品时需要按不同维度独立查询。如果孔口坐标和样品品位在同一张表里一个孔有 200 个样品坐标就要重复 200 次改一个孔口坐标得更新 200 行出错概率直线上升。常见做法是拆成四张表表名作用主键关键字段collar孔口信息hole_id孔口坐标 X/Y/Z、终孔深度、孔类型survey测斜数据hole_id depth倾角、方位角sample样品数据hole_id from to品位值、样长geology岩性分层hole_id from to岩性代码、描述四张表通过hole_id关联survey和sample再通过深度区间关联。这样设计的好处是改孔口坐标只动一行加样品只往 sample 表插互不干扰。2.2 字段类型与精度别让浮点误差毁掉品位估算字段类型选错是后期最头疼的问题。血泪经验是坐标和深度用NUMBER(12,3)品位用NUMBER(10,4)岩性代码用VARCHAR2(20)。不要用FLOAT存坐标因为浮点累加在测斜计算时会产生米级偏差。下面是一段建表 SQL以常见的关系库语法为例-- 孔口表一个孔一行 CREATE TABLE collar ( hole_id VARCHAR2(20) PRIMARY KEY, -- 孔号唯一标识 x_coord NUMBER(12,3) NOT NULL, -- 孔口X坐标保留3位小数 y_coord NUMBER(12,3) NOT NULL, -- 孔口Y坐标 z_coord NUMBER(10,3) NOT NULL, -- 孔口标高 final_depth NUMBER(8,2), -- 终孔深度 hole_type VARCHAR2(10) -- 孔类型DD/RC/TC ); -- 测斜表一个孔多个测点 CREATE TABLE survey ( hole_id VARCHAR2(20), depth NUMBER(8,2), -- 测点深度 dip NUMBER(6,2), -- 倾角负值向下 azimuth NUMBER(6,2), -- 方位角 CONSTRAINT pk_survey PRIMARY KEY (hole_id, depth), CONSTRAINT fk_survey_collar FOREIGN KEY (hole_id) REFERENCES collar(hole_id) ); -- 样品表一个孔多个样品段 CREATE TABLE sample ( hole_id VARCHAR2(20), from_depth NUMBER(8,2), -- 样品起始深度 to_depth NUMBER(8,2), -- 样品结束深度 cu_grade NUMBER(10,4), -- 铜品位单位% au_grade NUMBER(10,4), -- 金品位单位g/t CONSTRAINT pk_sample PRIMARY KEY (hole_id, from_depth, to_depth), CONSTRAINT fk_sample_collar FOREIGN KEY (hole_id) REFERENCES collar(hole_id) );逻辑说明collar表用hole_id做主键保证孔号不重复survey和sample用复合主键因为同一个孔在不同深度有多个记录。外键约束保证不会出现「样品表里有孔号但孔口表里没有」的孤儿数据。参数说明NUMBER(12,3)表示总共 12 位数字其中 3 位小数最大能存 999999999.999足够覆盖常见坐标范围。品位字段用NUMBER(10,4)是为了保留 4 位小数避免 0.0001 级别的品位被四舍五入成 0。2.3 深度区间校验from 必须小于 to样品表和岩性表都有from_depth和to_depth如果录入时写反了后续按深度查询会直接漏掉这段样品。建议在插入前加一条检查-- 插入前校验起始深度必须小于结束深度 SELECT hole_id, from_depth, to_depth FROM sample WHERE from_depth to_depth;如果这条查询返回了任何行说明有脏数据必须先修正再入库。我一般会在 ETL 脚本里加一个断言不通过就中断导入而不是等数据全进去再回头找。3. 数据导入与校验从 Excel 到 surpac 数据库的完整链路3.1 导入前的数据清洗列名映射与单位统一Excel 里的列名千奇百怪Cu%、Cu_ppm、铜品位可能指同一个东西。导入前必须做列名映射。常见做法是维护一张映射表Excel 列名标准字段单位转换Cu%cu_grade不变Cu_ppmcu_grade除以 10000铜品位cu_grade不变Au(g/t)au_grade不变金品位au_grade不变单位不统一是隐蔽性最强的坑。ppm 和 % 混用最后品位估算结果能差两个数量级。建议在导入脚本里强制做一次单位归一化并且把原始值和转换后的值都记日志。3.2 用 Python 做批量导入与校验下面是一段 Python 脚本读取 Excel 并写入数据库同时做基本校验import pandas as pd import sqlalchemy as sa # 读取Excel指定列名映射 df pd.read_excel(drillhole_data.xlsx) df df.rename(columns{ 孔号: hole_id, 起始深度: from_depth, 结束深度: to_depth, Cu%: cu_grade }) # 单位归一化如果列名是Cu_ppm除以10000 if Cu_ppm in df.columns: df[cu_grade] df[Cu_ppm] / 10000.0 # 校验1from必须小于to invalid df[df[from_depth] df[to_depth]] if not invalid.empty: raise ValueError(f发现{len(invalid)}条深度区间异常记录请检查) # 校验2孔号不能为空 if df[hole_id].isnull().any(): raise ValueError(存在空孔号请补全后再导入) # 写入数据库 engine sa.create_engine(oracle://user:passhost:1521/db) df.to_sql(sample, engine, if_existsappend, indexFalse) print(f成功导入{len(df)}条样品记录)逻辑说明先做列名重命名把中文列名转成标准字段名然后处理单位转换接着做两条硬校验——深度区间和孔号非空最后用to_sql追加写入。参数说明if_existsappend表示追加而不是覆盖避免误删已有数据。如果要做全量替换改成replace但生产环境慎用。indexFalse防止把 pandas 的行号也写进表里。3.3 导入后的完整性检查三张表能不能对上数据进去之后必须做一次跨表检查。最常见的三个问题样品表有孔号但孔口表没有、测斜表深度超过终孔深度、样品段之间有重叠。-- 检查1孤儿样品样品表有孔口表没有 SELECT s.hole_id FROM sample s LEFT JOIN collar c ON s.hole_id c.hole_id WHERE c.hole_id IS NULL; -- 检查2测斜深度超过终孔深度 SELECT sv.hole_id, sv.depth, c.final_depth FROM survey sv JOIN collar c ON sv.hole_id c.hole_id WHERE sv.depth c.final_depth; -- 检查3同孔样品段重叠 SELECT a.hole_id, a.from_depth, a.to_depth, b.from_depth, b.to_depth FROM sample a JOIN sample b ON a.hole_id b.hole_id WHERE a.from_depth b.to_depth AND b.from_depth a.to_depth AND a.from_depth b.from_depth;这三条查询返回空结果才说明数据基本干净。我一般会把它们做成定时任务每次导入后自动跑一遍有问题直接发邮件告警。4. 避坑与排查surpac 地质数据库最常见的五个翻车点4.1 孔号大小写不一致导致关联失败现象样品表里是ZK001孔口表里是zk001查询时关联不上剖面图里样品全丢。原因数据库默认区分大小写而 Excel 录入时没有统一规范。解决在导入前统一转成大写或者在建表时用VARCHAR2并加UPPER()函数索引。我一般直接在 ETL 脚本里加df[hole_id] df[hole_id].str.upper()。4.2 测斜数据缺失导致孔轨迹计算错误现象某个孔没有测斜记录surpac 按垂直孔处理但实际是斜孔导致样品位置偏移几十米。原因测斜表里漏录了数据或者测斜深度和样品深度对不上。解决导入后跑一次检查找出没有测斜记录的孔SELECT c.hole_id FROM collar c LEFT JOIN survey s ON c.hole_id s.hole_id WHERE s.hole_id IS NULL;如果有返回要么补录测斜要么在数据库里标记该孔为垂直孔避免误算。4.3 品位单位混用ppm 和 % 的隐形炸弹现象同一个矿床早期数据用 ppm后期用 %导入时没转换估出来的品位忽高忽低。原因不同来源的数据单位不统一且没有在字段名里体现。解决在样品表里加一个grade_unit字段记录原始单位同时在导入时强制转换到统一单位。不要依赖人工记忆。4.4 深度基准不一致孔口标高和测斜深度对不上现象孔口标高用的是矿区本地坐标测斜深度从孔口算起但样品深度从地表算起导致样品位置整体偏移。原因深度基准没有统一约定。解决在数据库设计阶段就明确——所有深度从孔口起算孔口标高单独存。如果原始数据是从地表起算导入时减去孔口标高。4.5 并发写入导致主键冲突现象两个人同时导入同一个孔的数据报主键冲突或者后导入的覆盖了先导入的。原因没有做导入锁或者用了if_existsreplace。解决导入前先按孔号删除已有数据再插入或者用数据库的MERGE语句做 upsert。更稳妥的做法是给导入操作加一个应用层锁同一时间只允许一个人导入。5. 进阶技巧用视图和触发器把校验做进数据库5.1 建一个「干净数据」视图下游只用视图与其让每个人写不同的查询不如建一个视图把四张表关联好并且过滤掉脏数据CREATE VIEW v_clean_sample AS SELECT s.hole_id, c.x_coord, c.y_coord, c.z_coord, s.from_depth, s.to_depth, s.cu_grade, s.au_grade FROM sample s JOIN collar c ON s.hole_id c.hole_id WHERE s.from_depth s.to_depth AND EXISTS (SELECT 1 FROM survey sv WHERE sv.hole_id s.hole_id);这个视图只返回深度区间合法、且有测斜记录的样品。下游做剖面、估品位都从这个视图取数避免重复踩坑。5.2 用触发器拦截非法插入如果数据库支持触发器可以在插入前自动校验CREATE OR REPLACE TRIGGER trg_sample_check BEFORE INSERT ON sample FOR EACH ROW BEGIN IF :NEW.from_depth :NEW.to_depth THEN RAISE_APPLICATION_ERROR(-20001, 起始深度必须小于结束深度); END IF; IF :NEW.cu_grade 0 THEN RAISE_APPLICATION_ERROR(-20002, 品位不能为负); END IF; END;这样即使有人直接写 SQL 插入也会被拦下来。触发器是最后一道防线但不要把所有逻辑都塞进去否则排错会很痛苦。5.3 定期做数据质量报告我习惯每周跑一次质量报告统计孤儿样品数、测斜缺失孔数、深度异常记录数、品位为空的样品比例。把这些指标做成趋势图一旦某周异常升高说明导入流程出了问题。指标正常范围告警阈值孤儿样品数00测斜缺失孔数00深度异常记录00品位空值率5%10%这张表可以直接写成 SQL 脚本输出到 CSV再用任意报表工具展示。关键是坚持跑而不是等出问题了才查。5.4 备份策略别等数据库崩了才后悔地质数据库一旦丢失重新录入的成本极高。我一般要求每天自动导出一次全量数据为 CSV保留最近 30 天每周做一次数据库级备份保留最近 3 个月。备份文件不要放在同一台机器上至少异地存一份。最后说一个我自己的教训早期做项目时觉得校验太麻烦先导入再说结果后面花了两周时间清理脏数据比一开始就写校验脚本多花了十倍时间。现在我的习惯是任何数据导入前先写三条校验查询跑通了再入库。希望帮到你。本文还有配套的精品资源点击获取