SURPAC地质建模规范:数据表、ID编号与文件命名避坑指南
简介:这份文档面向地质勘探、矿产资源评价及环境监测领域的建模初学者与技术人员,系统梳理了 SURPAC 软件建模的核心知识点,帮助读者建立从数据组织到解译建模的完整认知框架。压缩包内为 1 个 docx 文件,约 17KB,内容以目录式笔记呈现,涵盖项目数据在微机中的存储组织、原始数据组织、剖面解译与中段解译等模块,并细化了文件组织、文件命名方法及线串号分配等操作要点,还按勘探线、地层、矿体、小矿体、剖面坐标线、钻孔剖面、打印剖面图等类型分别说明文件归类思路。文档对勘探线编号与 ID、中段编号与 ID、宏文件、正交与斜交剖面等概念也作了界定,便于读者理解建模前的数据准备逻辑。目前已有 493 人学习,适合作为 SURPAC 建模入门阶段的要点速查与流程梳理材料。
1. 拿到这份 SURPAC 建模文档,先搞清楚它能帮你省掉哪几步返工
如果你正在用 SURPAC 做地质建模,大概率遇到过这种局面:钻孔数据导进去了,剖面也画了几条,结果到合并矿体、切中段、出打印图的时候,文件对不上号,线串号串了层,勘探线_ID 一会儿四位一会儿五位,最后只能推倒重来。这份《用 SURPAC 软件建模》文档,解决的正是这个阶段的问题——它不讲软件怎么装、按钮在哪,而是把从原始数据组织到剖面解译、中段解译、文件命名、线串号分配这一整条链路的规定动作写清楚了。适合谁?适合已经能打开 SURPAC、手里有一批钻孔和剖面数据、但建模流程总是卡在“文件管理”和“解译规范”上的从业者。下面按文档里的技术点,把能直接抄的部分和容易翻车的地方拆开说。
2. 建模前的数据底座:五张表与 ID 编号规则
SURPAC 建模的起点不是画线,而是把原始数据按它认的结构组织好。文档里明确要求:为建立地质数据库,把本区信息分成五个数据表在 EXCEL 中录入。这一步做不扎实,后面剖面解译再漂亮也是空中楼阁。
2.1 五张原始数据表的结构与录入要点
文档列出的五张表分别是井口表、测斜表、样品分析结果表、岩性表,以及配合勘探线_ID 使用的编号规则。井口表记录钻孔的开孔位置和基本信息;测斜表记录测斜深度、倾角和方位角,单位分别是米和度;样品分析结果表承载品位数据;岩性表记录岩性分段。这四张表加上勘探线_ID 的编号约定,构成 SURPAC 地质数据库的输入底座。
我一般会先在 EXCEL 里把列名固定死,再批量填数据,避免中途改列名导致导入错位。常见做法是给每张表单独一个 sheet,sheet 名与表名一致,导出 CSV 时按表逐个导出。下面是一个用 Python 做表结构校验的脚本,导入 SURPAC 之前先跑一遍,能挡掉大部分低级错误:
import pandas as pd # 定义四张表的必需列,列名按项目实际字段替换 required_cols = { "collar": ["hole_id", "east", "north", "elev", "total_depth"], "survey": ["hole_id", "depth", "dip", "azimuth"], "assay": ["hole_id", "from", "to", "grade"], "lithology": ["hole_id", "from", "to", "rock_code"], } for table, cols in required_cols.items(): df = pd.read_csv(f"{table}.csv") missing = [c for c in cols if c not in df.columns] if missing: print(f"[FAIL] {table} 缺列: {missing}") continue # 检查主键 hole_id 是否有空值 if df["hole_id"].isna().any(): print(f"[WARN] {table} 存在空 hole_id,共 {df['hole_id'].isna().sum()} 行") print(f"[OK] {table} 行数={len(df)} 列数={len(df.columns)}")这段脚本的逻辑很直白:按表名读 CSV,逐表比对必需列,缺列直接报 FAIL,hole_id 有空值报 WARN。参数上唯一要改的是required_cols里的列名,按你项目 EXCEL 的实际表头填。跑通之后再进 SURPAC 建库,比在软件里一条条报错要快得多。
提示:测斜表的深度单位是米、角度单位是度,录入时不要在单元格里带单位字符,否则导入后数值列会变成文本,SURPAC 读不进去。
2.2 勘探线_ID 与中段_ID 的编号方法
文档对 ID 的定义很具体:勘探线_ID 是用 SURPAC 建模时表示地质数据所属勘探线的整数,用四位或五位整数表示,通常在原勘探线号前补 0 或 1 到 4 位、5 位。中段_ID 可以用中段标高做 ID,遇负标高直接把负值当 ID,标高为小数时去掉小数点变成整数。
这套规则看着琐碎,但它是文件命名和线串号分配的地基。我一般会写一个小函数统一生成 ID,避免手工补零补错位:
def make_line_id(raw_no: str, width: int = 5, prefix: str = "1") -> str: """把勘探线号补成固定宽度整数 ID raw_no: 原始勘探线号,如 '6' width: 目标宽度,文档要求 4 或 5 位 prefix: 补位字符,常用 '0' 或 '1' """ body = raw_no.zfill(width - len(prefix)) return prefix + body def make_level_id(elev: float) -> int: """中段标高转 ID:负值保留符号,小数去点变整数""" if elev < 0: return int(str(abs(elev)).replace(".", "")) * -1 return int(str(elev).replace(".", ""))make_line_id("6", 5, "1")得到10006,正好对上文档里“地层 40006.str 表示 6 勘探线”的命名示例逻辑。make_level_id(-125.5)得到-1255。参数上要注意 width 和 prefix 的长度关系,prefix 占一位时 zfill 的宽度要减一,否则总长度会超。这套编号一旦定下来,整个项目的文件名、线串号、属性字段都跟着它走,中途改规则等于全项目返工,血泪经验就是:开工前把编号表拉出来给所有人对一遍。
3. 剖面解译的文件组织:七类文件各管什么
剖面解译是这份文档的核心章节,也是实际建模里最容易乱的地方。文档按内容把文件分成勘探线、地层、矿体、小矿体、剖面坐标线、钻孔剖面、地质剖面、旋转文件、打印平面图、剖面块模型等类型。每一类文件管一件事,混着放就会在后续合并和出图时出问题。
3.1 各类文件的职责边界与命名方法
文档给的命名方法是“文件内容 + 勘探线_ID.str”,例如“地层 40006.str”。解译初始阶段,先对每个剖面上的各种岩性和矿体单独解译,命名用“地层编号或矿体号 + 勘探线_ID.str”,地层文件和矿体文件要在 D1 属性里记录地层名称或矿体号。
| 文件类型 | 记录内容 | 关键约定 |
|---|---|---|
| 勘探线 | 矿区所有勘探线,每条线一个线段 | 以南/南西/西/北西端点为起点,北/北东/东/东南端点为终点;D1 记勘探线_ID,D2 记勘探线号 |
| 地层 | 剖面上除矿体界线外的地质界线 | 线号按 4.3 节分配,D1 记地层名称 |
| 矿体 | 剖面上的矿体界线 | 线号按 4.3 节分配,D1 记矿体号 |
| 剖面坐标线 | 各勘探线剖面图上的坐标网 | 正交剖面可自动生成,斜交剖面需手工制作 |
| 钻孔剖面 | 执行“提取用于打印的剖面图”的结果 | 以勘探线第一端点为起点、第二端点为终点 |
| 地质剖面 | 合并地层、矿体、坐标线等 | 不含钻孔剖面信息 |
| 剖面块模型 | 剖面位置剖切块模型的轮廓 | 用于剖切校验 |
这张表建议直接贴在工位边上。我见过太多人把矿体线画进地层文件里,当时看着没问题,等到合并地质剖面、切块模型的时候才发现矿体轮廓缺一块,回头找线号能找一下午。命名上还有一个细节:勘探线文件的 ID 号通过取 1,用于打印的平面图文件 ID 号为 0,这两个特殊值不要被批量补零脚本覆盖掉。
3.2 线串号分配:按文件类型分别定规则
文档 4.3 节把线串号分配按文件类型拆开讲。勘探线类型的文件,线号通常取 1 或任一线号,也可以每条勘探线取单独线号;地层类型的文件,每个剖面形成一个地层线文件,地层信息与线串文件中的线号关联。矿体、小矿体、剖面坐标线、钻孔剖面、打印剖面图各有自己的分配习惯。
实操上我一般先建一张线号分配表,用 CSV 管起来,解译时照着填,避免同一剖面里两条地层线撞号:
import csv # 线号分配表:file_type, line_id, description rows = [ ("勘探线", 1, "全矿区勘探线统一线号"), ("地层", 101, "第四系底界"), ("地层", 102, "基岩顶界"), ("矿体", 201, "主矿体上盘界线"), ("矿体", 202, "主矿体下盘界线"), ("剖面坐标线", 301, "斜交剖面手工坐标网"), ] with open("line_id_alloc.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["file_type", "line_id", "description"]) writer.writerows(rows)这张表的作用是让线号分配从“脑子里记”变成“文件里查”。参数上,line_id 的段位可以按类型分段:1xx 给地层、2xx 给矿体、3xx 给辅助线,段内再细分。这样即使后面加新地层,也不会和矿体线号冲突。文档里提到“小矿体”类型的文件在目录里标了“错误!未定义书签”,说明原文档这一节本身就不完整,实际项目中如果遇到小矿体,建议单独起一个 4xx 段位,别硬塞进主矿体线号里。
3.3 正交剖面与斜交剖面的坐标线处理
文档对正交剖面和斜交剖面的定义很清楚:勘探线方位与东坐标或北坐标垂直的是正交剖面,不垂直的是斜交剖面。正交剖面的坐标线在生成勘探线剖面图时能自动生成;斜交剖面的坐标线表示方法有特殊性,需要在剖面解译时根据剖面空间位置手工制作一个坐标线,供解译参考和绘图使用。
这一步是很多人翻车的地方。斜交剖面如果直接套正交剖面的自动坐标线,图面坐标和实际空间位置对不上,打印出来的剖面图量距会偏。我一般会在解译前先判断剖面方位角,用下面这段逻辑做个标记:
def is_orthogonal(azimuth: float, tol: float = 0.5) -> bool: """判断勘探线是否为正交剖面 azimuth: 勘探线方位角(度) tol: 容差,度 正交即方位角接近 0/90/180/270 """ targets = [0, 90, 180, 270, 360] return any(abs(azimuth - t) <= tol for t in targets) # 示例 for az in [90.0, 45.0, 270.3]: print(az, "正交" if is_orthogonal(az) else "斜交,需手工坐标线")容差 tol 默认 0.5 度,实际项目里如果勘探线放样有偏差,可以放宽到 1 度,但超过 1 度就建议按斜交处理,别图省事。斜交剖面手工坐标线做完之后,记得和钻孔剖面扣合检查一遍,文档里“地质剖面旋转为东西向”和“旋转为水平”两步就是为这个扣合做准备的:先用“线文件 2D 转换”把勘探线段移到东坐标轴、左端点移到原点,再把 Y 坐标和 Z 坐标互换,剖面就从铅直面转到水平面,和钻孔剖面信息对齐后才能打印出图。
4. 中段解译与旋转出图:从三维到打印图的完整链路
剖面解译做完只是半程,中段解译和出图是另一半。文档第 5 章中段解译的目录同样标了“错误!未定义书签”,但 5.1 到 5.3 的结构和剖面解译一致:文件组织、命名方法、线串号分配,文件类型包括地层、矿体、小矿体、钻孔中段。这说明中段解译可以复用剖面解译的文件管理思路,只是把“勘探线_ID”换成“中段_ID”。
4.1 中段文件的组织与命名复用
中段_ID 用中段标高做 ID,负标高保留负号,小数去点变整数。命名沿用“文件内容 + 中段_ID.str”的格式。我一般会把剖面和中段的命名规则写进同一个配置,避免两套规则打架:
def build_filename(content: str, id_value, kind: str = "line") -> str: """统一生成 SURPAC 文件名 content: 文件内容,如 '地层'、'矿体' id_value: 勘探线_ID 或 中段_ID kind: 'line' 用勘探线_ID,'level' 用中段_ID """ if kind == "line": return f"{content} {id_value}.str" return f"{content} {id_value}.str" print(build_filename("地层", "10006", "line")) # 地层 10006.str print(build_filename("矿体", -1255, "level")) # 矿体 -1255.str函数本身不复杂,价值在于把命名规则收口到一个地方。参数上 kind 目前两种取值走同一格式,但保留这个分支是为了以后中段文件如果要加前缀(比如“中段_矿体 -1255.str”)时只改一处。中段解译时线串号分配同样建议分段,地层和矿体分开段位,钻孔中段单独一段,和剖面解译的线号表保持同一套逻辑。
4.2 地质剖面旋转与打印图扣合
文档把出图链路拆成三步:地质剖面旋转为东西向、旋转为水平、用于打印的平面图。第一步用“线文件 2D 转换”把勘探线段移到东坐标轴、左端点移到原点;第二步把 Y 坐标和 Z 坐标互换,剖面从铅直面变水平面;第三步把剖面上信息和钻孔剖面信息扣合,打印平面图文件 ID 号为 0,记录剖面图下方小平面中的钻孔轨迹线。
这三步的顺序不能乱。我见过有人先互换坐标再旋转,结果剖面方向整个反了,打印出来钻孔轨迹和地质界线镜像对称,返工重做。正确顺序是:先旋转到东西向,再互换 Y/Z,最后扣合钻孔剖面。扣合之后建议做一次抽查,量一下剖面上两个已知钻孔的间距,和原始坐标算出来的距离对一对,偏差超过图面比例尺允许范围就说明旋转或互换有一步错了。
注意:剖面块模型文件存放的是剖面位置剖切块模型的轮廓,它和打印图不是一回事。切块模型用来校验剖面解译和块模型是否吻合,别把它当成出图文件直接打印。
5. 避坑排查:五条建模现场踩出来的记录
5.1 文件命名补零位数不一致,合并时找不到文件
现象:合并地质剖面时提示部分文件缺失,但目录里明明有对应文件。原因:勘探线_ID 有的补到四位、有的补到五位,脚本按五位去找,四位文件匹配不上。解决:开工前用 2.2 节的make_line_id统一宽度,全项目只用一个 width 和 prefix,历史文件用批量重命名脚本过一遍再入库。
5.2 勘探线端点方向反了,剖面图左右颠倒
现象:生成的剖面图钻孔位置和地质界线左右镜像。原因:勘探线文件记录两个端点时,起点取了北侧、终点取了南侧,与文档要求的“南/南西/西/北西为起点”相反。解决:检查勘探线文件的 D1、D2 属性,按文档规则重排端点顺序,重生成剖面图后抽查两个钻孔间距验证方向。
5.3 斜交剖面套用自动坐标线,图面量距偏大
现象:斜交剖面打印图上量取的距离比实际空间距离大。原因:斜交剖面用了正交剖面的自动坐标线,投影关系不对。解决:按 3.3 节判断剖面类型,斜交剖面手工制作坐标线,做完与钻孔剖面扣合后量距复核。
5.4 测斜表角度带单位字符,导入后无法计算
现象:SURPAC 导入测斜表后倾角、方位角列显示为文本,钻孔轨迹算不出来。原因:EXCEL 单元格里写了“90°”这类带单位的值。解决:录入时只填数值,单位在表头注明;导入前用 2.1 节脚本做类型检查,数值列强制转 float。
5.5 矿体线误入地层文件,切块模型缺轮廓
现象:剖面块模型剖切后矿体轮廓不闭合。原因:解译时把矿体界线画进了地层文件,合并地质剖面时矿体信息缺失。解决:按 3.1 节的文件职责表逐文件核对,矿体线只进矿体文件,D1 属性记矿体号,合并前用线号分配表比对一遍。
6. 一套可复用的建模检查清单与编号表维护习惯
这份文档的价值不在某一个功能按钮,而在它把 SURPAC 建模里那些“约定大于配置”的规则写成了可执行的条目:五张原始数据表的结构、勘探线_ID 和中段_ID 的补位规则、七类剖面文件的职责边界、线串号按类型分段分配、正交与斜交剖面的坐标线差异、旋转出图的三步顺序。把这些条目落成一张检查清单,每次开新项目照着过一遍,比事后返工省的时间多得多。
我自己的习惯是维护一张项目级的编号与命名总表,字段包括 file_type、id_value、line_id、description、status,用 CSV 管,每次解译前更新 status,合并前筛出未完成的条目。下面是一个最小可用的检查脚本,把前面几节的校验串起来:
import pandas as pd def pre_merge_check(line_alloc_csv: str, file_list: list) -> None: """合并前检查:线号表完整性 + 文件存在性 line_alloc_csv: 线号分配表路径 file_list: 待合并文件列表 """ alloc = pd.read_csv(line_alloc_csv) # 检查线号是否有重复 dup = alloc[alloc.duplicated(subset=["file_type", "line_id"], keep=False)] if not dup.empty: print("[FAIL] 线号重复:\n", dup) # 检查待合并文件是否都在分配表里有记录 known = set(alloc["description"]) for f in file_list: if f not in known: print(f"[WARN] 文件未在分配表登记: {f}") print("[DONE] 检查完成,共", len(file_list), "个文件") pre_merge_check("line_id_alloc.csv", ["第四系底界", "基岩顶界", "主矿体上盘界线"])这段脚本做两件事:查线号重复、查文件是否登记。参数上subset按 file_type 和 line_id 组合判重,因为不同文件类型可以共用线号段以外的编号;known集合用 description 匹配,实际项目里如果文件名和 description 不完全一致,可以改成匹配文件名前缀。跑完没有 FAIL 再进 SURPAC 合并,能挡掉大部分“文件找不到、线号撞车”的问题。
从那以后我每次开新项目,第一件事不是打开 SURPAC 画线,而是先把编号表和五张表的列结构定下来,跑一遍校验脚本,确认全绿再动手解译。这套习惯救过我至少两次全项目返工。希望帮到你。
本文还有配套的精品资源,点击获取