
上篇我写到了 GoCAD 的安装、基本界面认识和钻孔数据准备很多朋友在评论区提到“数据已经导进去了下一步该干嘛”说实话这个阶段是最容易迷茫的。数据一堆堆躺在树上工具面板密密麻麻鼠标点来点去不知道从哪下手。这篇“下”我就接着上篇的进度把从“有数据”到“出模型”的完整过程拆开揉碎讲清楚断层怎么建、层面怎么生成、SGrid 网格怎么搭、属性怎么往网格里塞以及最后怎么导出成果。这篇文章的定位是给已经装好 GoCAD、也把基础数据整理得差不多的朋友看的。如果你还在安装和导入阶段卡着先去翻上篇把几个核心坑填平再回来。下面的内容全程基于 GoCAD 2015 及以上版本的菜单结构不同版本界面表述略有差异但核心逻辑完全一致。我会尽量按真实操作顺序走关键是解释清楚每一步“为什么这么做”因为你只有理解了意图才能在遇到报错时知道怎么改。1. 建模前的数据准备与格式转换1.1 坐标系统统一与投影带核查很多人建模建到一半发现层面扭曲得不能看十有八九是坐标系统出了问题。这里我必须再说一次GoCAD 不会主动帮你去判断坐标系统它显示什么就是什么。如果一个钻孔用的是经纬度单位是度另一个钻孔用的是投影坐标单位是米放在同一个视图里点位会跑到天上去。我自己的习惯是在导入之前先用 Excel 或者 Python 把数据检查一遍。看三列X 值范围是不是在一个合理的区间内Y 值范围是不是正常Z 值有没有出现明显的异常比如负值代表高程基准面以下。如果坐标数据里混了多个投影带哪怕都是米制模型也会出现错位这时候唯一的办法就是回到原始数据重新处理。具体来说项目里常见的是地方独立坐标系或者国家标准坐标系。无论哪种只要所有数据源统一到同一个坐标系下就行。检查方法也很简单把钻孔的孔口坐标和地形点云画在一起如果两者没有重叠先别急着调模型回头查数据源。提示整张表里出现个别点位飞到千万级数值多半是经纬度被人为乘了比例系数或者加了带号前缀。宁可多花半小时清理也不要拿脏数据进模型。1.2 钻孔表结构设计与分层数据清洗GoCAD 的 Well 结构虽然支持你直接右键新建但更稳妥的做法是在外部把数据表做扎实。我的通用模板分成两张表一张是孔位表WellWell ID, X, Y, Z, 深度, 孔深另一张是分层表Well MarkerWell ID, 层位名, 顶深, 底深, 岩性编码。两张表通过 Well ID 关联导入后用 Query 查询功能做联查。这里有一个容易被忽略的细节分层表中的顶深、底深一定要用“孔深”而不是“高程”。孔深是从地面往下量的长度高程是从海平面往上算的数值两者相差一个孔口高程。GoCAD 在处理 Well Marker 时默认你给的是深度值它会用孔口高程换算成 Z 坐标。如果你把高程直接填进去那个标志点就会被放到完全错误的位置。数据清洗方面最常见的问题是层位名不统一。“①层粉质粘土”“粉质粘土①”“ZC-1层”这种写法如果不做归一化后面建层位的时候就等着一个个改吧。我的做法是准备一张字典表把现场记录的别名统一映射成标准层位代码。这个工作看起来笨重但能避免你建出来一个层位图层里出现几十个孤立小碎块。1.3 点云与曲面数据的格式转换实操地形数据、层面散点数据经常以 txt、csv、Surfer GRD 或者 ESRI shapefile 的形式提交。直接拖进 GoCAD 不一定被识别需要做一步转换。我自己最常用的是把 txt/csv 转成 GoCAD 的 ASCII 格式也就是 .gp 文件。格式非常简单第一行写对象类型后面跟坐标点列。手工整理容易错推荐用一段小脚本完成。下面给一个参考基于 Python 3pandasimport pandas as pd # 读取原始点云或者散点文件 df pd.read_csv(input_points.csv, encodinggbk) # 只保留需要的三列 df df[[X, Y, Z]].dropna() # 写出 GoCAD ASCII Points 文件的头部 with open(output.gp, w, encodingascii) as f: f.write(GOCAD PPoints 1\n) f.write(HEADER {\n) f.write(name:GroundPoints\n) f.write(}\n) f.write(TFACE\n) for _, row in df.iterrows(): f.write(VRTX 0 {} {} {}\n.format(row[X], row[Y], row[Z])) f.write(END\n) print(转换完成共 {} 个点.format(len(df)))这个脚本生成的文件可以直接用 File Import GOCAD ASCII 导入。如果你的数据里有重复点建议先用 df.drop_duplicates() 处理一下如果点特别密超过几十万个可以先做抽稀比如按坐标网格每 0.5 米留一个点否则后面生成曲面时卡到你想哭。Surfer GRD 或者 TIF 高程模型也可以导入GoCAD 提供了专门的导入过滤器导入后自动生成 Surface 对象。要是导入后表面朝向反了记得用 Surface 菜单里的 Invert Orientation 翻转一下这不影响几何形状但会影响后续体积计算和剪切操作的正负号。2. 核心建模流程断层建模与层面构模2.1 从断层数据到断层面对话框的完整操作断层建模是地层建模里最“师傅领进门”的环节。如果你手里有断层解释数据比如地震解释的断层多边形、野外测量的断层面产状那么目标就是生成一张或多张连续、互不交错的断层面。GoCAD 里面建断层有两条路一条是直接从点数据拟合称为 Surface from points另一条是使用专门的 Fault 对象从断点数据构建。我先讲通用思路。在 Objects 目录下右键新建一个 Surface 对象然后利用 Edit Surface Edition Create surface from scattered points选中断层散点数据。这时候对话框里有个关键参数叫网格大小Grid Size。网格太大断层面会像一块块平板拼的网格太小边缘会出现大量毛刺。我一般先根据点密度估算一个值比如点间距的中位数乘以 1.5跑一版看效果再做微调。断层建模还有个特殊参数叫“走向延伸长度”。这是因为野外实测断层往往只露出地表一小段但地下深处它是延续的。你不能让断层面在边缘处突然截止那样后面切割地层时会把地层切出一个突兀的豁口。解决方法是把断层线沿走向方向外推一定距离这个距离我习惯取断层长度的 20%-30%具体看你要不要保留断层尖灭形态。注意断层建模最忌讳把多条产状不一致的断层揉进同一个 Surface 里。一个 Surface 只能代表一个断层面要是数据里出现多个断层分别建后面再设置交切关系。2.2 层位数据插值带断层约束的曲面生成层位建模的核心思路是用钻孔里的分层点、地表的地形点拟合出每一个层位的顶底面曲面。这听上去像数学插值题但地层建模讲究的是“构造合理”不是“数值精确”。GoCAD 建层面用的工具在 Surface 菜单下叫 Surface from points with faults。为什么特别推荐带断层的版本因为如果你先建了断层面再用这个工具它可以保证生成的层面在断层两侧是断开的而不是硬生生穿过断层表面。这一点在逆断层或者高角度正断层地区极其关键。实操时你需要在对话框里指定三样东西参与插值的散点集选择某个层位的所有分层点断层约束勾选对应的断层面对象边界范围选择一个闭合的 Polygon 或者 Rectangle 限定拟合区域。参数区有两个值需要重点调一个是平滑因子Smooth factor另一个是容差Tolerance。平滑因子我默认给 0.5值越大曲面越圆润但越偏离原始点值越小曲面越贴点但越毛糙。容差则控制拟合曲面上的点到原始点的最大允许偏差这个我一般给 0.1 到 0.3 米如果跑出来超差了就说明原始数据里有打架的点回头查分层表。生成好的层面对象名称建议带前缀比如 “Top_Quaternary”、“Base_Quaternary”别用默认的 surface-1 这种名字。项目模型做到后期会有几十个对象命名混乱直接导致自己都找不到数据。2.3 层面相交与边界裁剪的处理多个层面生成之后它们天然是互相穿越的。比如第四系底界和三叠系顶界理论上在所有位置都应该是叠置关系但因为插值算法不同拟合出来两个面下部可能有交叉。处理这种相交问题的标准动作是用一个“边界混合面”作为辅助。假设你把它理解成一块海绵蛋糕的顶部和底部顶部曲面和底部曲面通过同一个侧边曲面围起来就形成一个封闭层壳体。GoCAD 里这个操作叫 Closed Surfacic Model也就是用若干个 Surface 围成一个封闭体。我做区域地层体时会先画一个矩形范围然后用 Project/Clip 把每个层位面都裁剪到这个矩形范围内再给各个层位面之间添加侧面封边面最后组合成封闭体。这个环节很容易出“不闭合”的错排查方法也很直观用 View Show Boundary 查看每个面的边界线如果边界线之间没有完全重合就没法闭合。3. 网格化从层面体到 SGrid3.1 SGrid 的基本逻辑与行列深度设置到了这一步你已经有了一个由曲面构成的“壳子”下面要做的是往壳子里塞网格这就是 GoCAD 里的 SGrid 对象。你可以把它想象成一个魔方魔方整体占据一块体积但内部被切成了整齐的小方块。每个小方块就是一个单元Cell后续的岩性、孔隙度、渗透率等属性值就挂在单元上。右键新建 SGrid 时第一个对话框会让你指定区域范围和层位约束。区域范围需要你框选一个边界多边形Polygon这个范围不能超出你已经建好的层面范围否则网格会出现空腔。层位约束就是你希望以哪些曲面作为网格顶底边界通常从上到下按地层顺序依次选入。行列深度设置有三个数字I 方向网格数、J 方向网格数、K 方向网格数。前两个是水平方向的划分第三个是垂直方向的层数。层数不是越密越好我的建议是水平方向上控制每个单元在 10 米到 25 米左右垂直方向上每个地层至少分 3-5 层。之前做过一个小区块面积约 1.5 平方公里我设成 40×40×30总共 4.8 万个单元跑起来完全不卡。你要是做到百万级单元每次旋转视角都能明显感到卡顿。3.2 网格的约束控制与断层截断处理SGrid 对话框里有个容易忽略但极其重要的选项叫 Boundary Adjustment 或者类似的“贴合边界”功能。它会让边界上的网格单元自动收缩或者扩张以贴合你的控制面断层和层面。如果你不做这一步生成的网格是规整长方体的断层位置会出现台阶状锯齿后续属性建模和体积计算都会受到影响。断层截断的意思是让网格单元在断层两侧完全断开两侧各自独立编号。操作上是在 SGrid 创建向导的 Fault 选项卡里勾选对应的断层面然后指定“断开”模式。这样生成的网格在做储量计算时就能分别统计断层上盘和下盘体积。这一步出现的典型报错是“Unable to compute valid grid due to constraint conflict”本质上是断层面和层面之间的拓扑关系有冲突。排查方法把断层面和被约束的层面都显示出来用剖面视图Clipping Plane沿着断层走向切一刀检查面与面之间是不是有交错。如果有先回到层面建模阶段把相交关系理顺再重新生成网格。3.3 网格质量检查正交性、负体积与单元退化网格生成后不要急着填属性先做一次网格质量体检。GoCAD 里可以查看单元体积分布我习惯用颜色渲染单元体积重点检查有没有体积为零或负值的单元。负体积单元本质上就是单元绕了网格节点的顺序反转了这类单元会导致后面的储量计算和数值模拟全面崩盘。另一个指标是单元正交性。网格单元理想情况下是长方体但贴断层和层面时单元会被压扁或者拉伸。当单元的内角偏离直角太多时数值模拟软件会报告收敛困难。我给自己定的标准是平均正交性不低于 0.41 是完全正交低于 0.3 的区域必须局部加密网格重新生成。如果检查中发现某一层被严重压缩比如厚度只剩 5 厘米这通常是你生成层面的时候把两层曲面做到几乎贴在一起了。这时候别在网格里硬调回到层面模型把曲面的 Z 值关系修好再做网格。4. 属性建模把化验数据塞进每个网格4.1 属性对象的创建与数据关联方式SGrid 建好了里面是空的现在要往里填属性。属性建模的目的是给每一个网格单元赋予一个物理值比如岩性编码、含水率、渗透率、品位等。这个属性信息来自稀疏的钻孔样品因此本质上是“用已知点推断未知点”的数学过程。GoCAD 的做法是右键 SGrid 对象新建一个属性Property。属性创建后你有两个输入来源一个是钻孔的属性曲线数据Well Log另一个是离散的点集数据比如化验品位分析点。我推荐把样品数据整理成一张带 XYZ 坐标的表格然后用 Point Set 导入。这样不但可以用于属性插值还可以先做出散点视图直观看到高品位区或者低渗透区的空间分布趋势再据此判断要不要调整插值参数。4.2 插值算法选择克里金、距离反比加权与最近邻GoCAD 属性建模的插值算法主要在 Properties 菜单下。我用得最多的有三种克里金Kriging、距离反比加权IDW、最近邻法Nearest Neighbor。克里金其实是个家族里面细分有简单克里金、普通克里金、协同克里金。对于地质属性建模普通克里金是最常用的。它的最大优点是利用了变差函数Variogram来描述空间相关性理论上给出的估值方差最小。缺点是上手门槛高变差函数调不好结果反而不如 IDW。距离反比加权IDW就直白多了离未知点越近的已知点权重越大公式是权重的 p 次幂。p 值给 2 是最常见的p 越大远距离点的影响衰减越快模型就越“局部”。最近邻法基本就是把每个单元赋予给它最近的那个已知点的值结果看起来像马赛克。我只在给岩性这类离散变量做分区赋值时用它连续型物性参数不用这个方法。我自己的经验是连续型参数如孔隙度、渗透率、品位先试普通克里金如果变差函数拟合效果差就退回 IDW p2离散型参数岩性、风化程度分级用最近邻法或者直接按距离场分类。下表是三个算法的适用场景对比算法连续属性适用性离散属性适用性参数复杂度插值速度普通克里金高低高慢距离反比加权IDW中高中中中最近邻法低高低快4.3 变差函数的直观理解与调参经验提到变差函数很多初学朋友直接懵了我试着用大白话拆解一下。变差函数做的事情很简单统计所有已知点对之间距离越近的点对属性值是不是越接近。把你的已知点投影到某个方向上去每隔一定距离数一数这些点对的方差把方差画成随距离变化的曲线就是实验变差函数。这里有两个关键参数你必须懂一个叫变程Range它表示在这个距离范围内点与点之间才有相关性超过这个距离两边数值就完全是独立随机了。另一个叫基台Sill是变差函数在变程处趋于平稳的那个值大致对应数据的整体方差。调参时我一般这样做先让 GoCAD 自动计算实验变差函数看曲线的大致形态再用球状模型Spherical拟合。如果你发现变程特别小比如只有 10 米但钻孔距离已经到 50 米了那说明钻孔网度太稀插值结果可信度很低这时候最优解是加密钻孔或者采集更多样品而不是硬调参数。提示变差函数是有方向性的。如果地层有明显的层理沿层理方向的变程往往远大于垂直方向的变程。这时候要设置各向异性不能拿同一个变程用到所有方向否则插出来的属性会把层理抹平。4.4 插值结果验证与交叉验证方法属性插值完第一件事不是高兴而是验证。我有个习惯把 10%-15% 的样品点抽出来不参与插值插完之后再把这些点位的估值和实际化验值对比。算一下绝对误差和相对误差误差过大就要回头调参数或者怀疑数据里有录入错误。GoCAD 里还有更省事的方法就是用 Cross Validation 工具它会自动轮流把每个已知点当作未知点去估输出每个点的估值误差。误差大的点位会高亮显示你顺着去看常常能抓到异常值或者分层错误。我经历过的典型案例某个钻孔的样品位数在一个位置突然冒出一个高得离谱的品位值之前散点图没仔细看交叉验证时那个点误差爆表一查原始记录发现是样品编号错行。这就是不做验证就会带进模型的系统性错误。5. 模型可视化、出图与成果导出5.1 显示样式、色标与三维场景调优模型建完之后关键是把三维视图调到一个能看的程度。这里所谓“能看”不是审美问题而是要让不同层位、不同属性值在屏幕上一眼就能区分开。在 GoCAD 里每个对象都有独立的显示属性。配置步骤是右键对象 Properties Visualization Parameters调整颜色、透明度和光照。我的常见做法是断层显示为红色半透明层面用带透明度的渐变色属性网格用色标渲染。色标设置的技巧是不要用彩虹色阶推荐用地质行业通用的蓝-绿-黄-红序列冷色代表低值、暖色代表高值。你还要注意设定数据范围不要让色标被几个异常值拉满否则正常区域的颜色差异会非常小。这时直接在色标属性里锁定最小最大值或者去掉超出数据的 5% 分位数。三维场景调优方面记得打开垂直比例Vertical Exaggeration尤其在平原地区地形起伏只有十几米时不做垂直放大根本看不出层次。我常设在 5-10 倍之间视项目而定。5.2 剖面切割与标准图件导出流程剖面图是地质报告中必不可少的图件。GoCAD 里切割面用的是 Clipping Plane 功能。你会画一个剖面位置线Line然后以它为基准生成一个垂直剖面系统会把所有对象沿着这个面切开显示。要导出一张清晰可用的剖面图我的流程是先把视图调成剖面视角然后关闭网格轴线和多余的对象只保留要展示的层面、断层和属性网格。接着设置 View 的背景颜色为白色默认灰色容易让打印效果脏兮兮的打开图例Legend显示色标和比例尺。最后用 File Export Image选 PNG 格式分辨率设 300 dpi导出的图片直接能放进报告。不要用截图键截图那样分辨率不够放大就糊。剖面图在报告里通常需要标注孔号和孔口高程如果 GoCAD 里嫌麻烦我一般都在 CAD 或 PPT 里二次叠加标注效率更高。5.3 成果导出SGrid 输出与通用格式转换建模的最终目的是多端使用。模型要给数值模拟软件用就得导成塔层LGR或者角点网格格式要给绘图软件出图就导成 DXF要给别人只读浏览就导成 PDF 或者图片。GoCAD 里最常用的导出选项包括SGrid 导出成 CMG、Eclipse 等数值模拟格式导出前检查单元数与属性命名是否规范避免一方软件里出现空格或者非法字符。层面导出成 Surfer GRD 或者 ESRI TIN用于二维绘图软件叠加分析。点集和井数据导出成 CSV回算给数据库系统归档。有一个细节导出到数值模拟软件之前记得做一次属性离散化。原生的连续属性每层可能有几十个数值分段数值模拟软件通常要求每个网格单元只能有一个代表值。GoCAD 里可以用 Property 菜单下的 Upscale 工具按哪个主要体积占比的原则给每个单元赋一个代表值。这个环节偷懒的话模拟结果肯定是要被返工重搞的。注意每次导出前都要重新检查一遍属性所在的空间范围。右键属性对象查看 Z 范围如果出现比钻孔深度还深得多的值说明插值算法在局部外推过度了这类区域要么裁剪掉要么把超范围值置为无数据Void不要带进下游。6. 常见问题与排查技巧实录6.1 高频报错信息速查表自己在建模过程中踩坑无数也帮同事排查过不少问题整理了一张高频问题速查表。这里列的“报错信息”是表现层看到的提示原因是实际逻辑解决办法是我亲自验证过有效的。表现/提示可能原因解决措施导入点集后坐标跑到几十万上百万数据混用了经纬度和投影坐标统一坐标系后再导入检查 X、Y 位数层面平滑后完全不贴合钻孔点平滑因子给得过大将平滑因子降到 0.2-0.3并检查容差边界裁剪后层面出现破洞边界多边形与层面没有闭合检查 Polygon 的闭合状态用 Curve 修复工具SGrid 生成报约束冲突断层与层面有穿透关系用剖面视图检查拓扑调整断层和层面交切关系属性插值结果出现大片负值数据存在离群异常点剔除异常点或对数变换后插值再反变换导出 Simulator 格式后运行报错属性命名含非法字符或单元数不一致改名并重新离散化属性6.2 性能卡顿与崩溃处理经验大场景数据在 GoCAD 里拖动视角非常慢这是所有桌面版三维软件的通病。我的优化心得大概可以归纳为三条抽稀显示、分块建模、关闭全局渲染。先说抽稀显示。很多卡顿源于你把百万级点集全部显示在屏幕上。可以在显示设置里把点的显示方式改成每隔 N 个点显示一下或者只显示包裹体Bounding Box等到需要精细处理再切换回来。再说分块建模。如果你负责的是几十平方公里的大区域模型不要试图把全区的数据一次性做成一个 SGrid那样电脑再强也会很吃力。按区块或者按层位分别建立子模型最后用 Data Merge 工具拼起来。宁可拼接时多花功夫也不要让主程序直接跑十几小时最后崩溃。最后操作 SGrid 这类大对象时把动态透视Picking功能关掉。有时候你只是想旋转视角GoCAD 却在实时计算鼠标下面那个单元格的属性CPU 瞬间就满了。在 Settings 里把 Pick 功能设为手动需要查询单元数据时再打开。6.3 安装与授权常见坑最后必须提一嘴安装和授权因为后台私信被问爆了基本集中在“双击图标没反应”“打开闪退”“显示无法连接授权服务”这三类。“双击没反应”大部分是安装目录有中文路径或者权限不够把安装目录换到纯英文路径比如 C:\GoCad2015 下。“打开闪退”常见原因是显卡驱动太老去显卡官网更新 OpenGL 驱动即可。“无法连接授权服务”则先检查本机 License Manager 服务有没有启动。在 Windows 服务管理器里找到对应的许可证服务右键启动再重启软件基本能解决。提示如果软件启动后一直卡在初始化界面大概率是系统里残留了旧版本配置删掉安装目录下的 cache 文件夹再重启一次注意这个操作不会影响你存放在其他路径的模型文件。写在最后的体会这套流程前前后后我自己跑了不下五六个项目从最初的钻孔表整理到最终的属性网格导出每一步其实都有绕弯的地方。要说印象最深一定不是某个高深的算法而是“数据质量决定模型质量”这句话的分量。你花两周调出来的变差函数可能还不如花两小时把钻孔分层表里的错层位改掉来得有效。所以我始终建议无论你想把 GoCAD 玩得多花哨先在数据清洗上多投入时间。建模软件只是一个翻译器把现场钻探、测试、测绘的数据翻译成一个三维的地质认知框架输入的数据错了后面再怎么调参数也只是在把错误装饰得更漂亮。如果你手头正在跑自己的项目卡在某一步不知道什么意思欢迎带着截图和数据描述来问。下一篇我预计会写一写模型精度评估和不确定性分析毕竟三维地质模型的价值到底有多大不能光凭“看着像”说了算。