
做土方核算的朋友应该都经历过那种“外业跑断腿、内业算秃头”的日子。多期三维模型的挖填方计算这几年在测绘、施工、矿山、市政领域里已经是比较成熟的技术路线了。简单说就是拿同一块区域不同时间去建出来的两套三维模型套合在一起做差把“高出来的土”和“低下去的部分”分别统计成填方量和挖方量。过去算土方要么靠全站仪散点内插要么靠RTK跑网格外业强度大不说遇到地形破碎、场地陡峭的区域还容易漏算。现在有了三维模型算方量就变成了“整体比表面、精确算体积”这个思路转变带来的效率和精度提升非常明显。这篇文章主要围绕多期三维模型挖填方计算的完整流程来写适合正在做方案选型的人、刚接触多期土方计算的测量员也适合想把手头数据用起来却被细节卡住的朋友。我会把原理、实操步骤、常见坑、以及模型瓦片化和正射影像对比这些扩展应用一次性讲清楚。1. 挖填方计算的底层原理两期模型如何变成方量1.1 核心原理两个表面之间的体积差就是挖填方很多人第一次接触多期挖填方计算时会把问题想复杂觉得要处理点云、网格、纹理这些高大上的东西。其实底层逻辑非常朴素三维模型本质上是用大量三角形或格网逼近地形表面而挖填方计算就是计算两个地形表面之间所夹实体的体积。把两期模型想象成两个形状不同的碗扣在一起中间夹住的空气部分就是这段时间里土方变化的体积。如果第二阶段的地表比第一阶段高说明这个地方被填了反过来比第一阶段低就说明被挖了。把所有“填”的体积累加就是填方量把所有“挖”的体积累加就是挖方量。工程上最常用的操作办法是把表面离散成规则格网DEM。每个格网单元对应一平方米或零点几平方米的真实地面格网上记录的是高程。两期DEM做到同一个格网尺寸、同一个坐标范围后直接相减就得到每个格网的高差。高差乘以格网面积累加起来就是体积变化。你可以理解成把地形切成无数根细柱子每根柱子的体积单独算最后求和这是微积分里积分概念最直观的工程应用。提示这里说的“高差×面积”只是基础模型实际工程还要考虑松散系数、压实系数、表土剥离量、边坡放坡加宽等修正项但基础逻辑不变。1.2 完整流程从现场采集数据到最终报表多期三维模型挖填方计算不是某一个软件单打独斗而是一整条流水线。每个环节都有对应工具环节之间相互影响尤其要注意数据格式和坐标系统一。我习惯把流程拆成七个阶段数据采集无人机倾斜摄影、机载激光雷达、地面扫描依据场地面积和精度要求选择。三维模型生产用Pix4D、ContextCapture这类软件从影像生成密集点云、网格和DEM。数据预处理在CloudCompare里做点云滤波、去噪、地面点分离、网格修复。多期模型套合对齐统一坐标系检查两期模型之间有没有平移、旋转偏差。生成差异面/差异体两期DEM相减或做实体布尔运算得到挖填区域的几何体。方量统计计算挖方量、填方量、净方量按区域、按高程区间分类统计。成果核验与交付正射影像对比、三维瓦片打包、报表输出。这条链路上最容易出问题的不是最后一步计算而是前面两步。原始数据质量和模型一致性如果不过关算出来的方量完全不可信。我在后面几个章节会详细展开每个环节的做法和容易忽略的细节。2. 三维模型生产与预处理pix4d、CloudCompare的配合流程2.1 用Pix4D生成三维模型时这些参数不建议乱调Pix4D是现在无人机测绘领域很常见的摄影测量软件它的核心工作是把一堆带坐标的无人机影像通过空三解算和密集匹配生成点云、DSM、正射影像和三维网格。用的时候三个点最值得注意。影像重叠度直接影响模型完整性。航向重叠度建议控制在75%以上旁向重叠度尽量不低于60%地形起伏大或者建筑物密集的区域重叠度要再往上加。我见过很多翻车案例都是因为飞手图省事降低了重叠度结果墙面和陡坡出现大面积空洞后期怎么补都补不回来。地面控制点GCP绝对不能省。控制点最少不低于5个场地四角加中心均匀分布有条件就多布几个。控制点的作用是把摄影测量解算出的相对模型“钉”到绝对坐标系里。如果两期建模用同一套控制点两期模型之间的系统偏差会小很多这对后续挖填方计算是决定性的。空三成果要看一个关键指标——重投影误差。Pix4D空三处理完成后要把这个误差控制在1个像素以内最好达到亚像素。如果超过1.5个像素说明相机标定或控制点刺点有问题这时候不要急着导出模型先回去检查像控点。2.2 CloudCompare点云转三维模型从散点到能算地形的过程Pix4D导出的是密集点云和模型而挖填方计算需要的是干净的地形表面这里就轮到CloudCompare简称CC出力了。CC是一款开源的三维点云处理软件免费、跨平台功能非常完整。从Pix4D导出的点云通常混着植被、建筑、车辆甚至空中噪点直接拿去算方量结果会离谱。我的标准流程分四步第一步导入点云后先看一眼点云范围和密度。打开“Global Shift”设置好坐标偏移用“Compute geometric feature”或直接目视检查把明显偏离地面的离散点用分段选择工具删掉。第二步去噪滤波。植被、飞鸟、移动物体会产生高程异常点可以用CC的“Filter by Value”或“Statistical Outlier Removal”把孤立噪点剔除。注意统计滤波的参数不能太激进否则会把坡面上的有效点一起删掉。第三步地面点分离。这一步是最容易忽略的。如果不分地面点直接对原始点云插值成DEM植被高点会把地形表面“抬起来”计算结果会有系统性偏差。CC里有一个非常好用的布料模拟滤波算法CSF它的原理是模拟一块布盖到反转的地形上布的形态近似地表通过对比布面与点云点的距离来分离地面点和非地面点。参数可以先用自动模式跑一遍再手动微调。第四步生成地形表面。CC可以把点云栅格化也就是插值成规则格网导出为GeoTIFF格式的DEM。也可以在“Mesh”模块用Poisson表面重建生成三角网模型。对于挖填方计算我建议直接栅格化成DEM后续做差值计算更方便。2.3 三维模型转正射影像为什么比单纯看模型更直观三维模型除了用来算方量还有一个高频用途是转成正射影像。正射影像本质是一张消除了地形起伏和相机倾斜影响的、带有地理坐标的影像图它的比例尺是恒定的可以像看图一样量测距离和面积。生成正射影像的途径有很多。Pix4D在输出阶段可以直接勾选正射影像OrthomosaicCC里也可以用点云做“Rasterize”再贴纹理。更进阶的做法是把已经建好的纹理模型在CC里通过“Render to File”渲染出顶视图再配准到地理坐标上。正射影像最大的价值是用于两期对比和汇报。两期正射影像叠加在一起平移到同一位置Open在GIS软件里做卷帘对比哪里挖了、哪里填了、边界在哪个位置甲方和审计人员一眼就能看懂。我在项目交付时常把“两期正射影像对比图”和“挖填方分布热力图”一起出成图册这份材料在验收和争议处理时会帮上大忙。3. 多期模型套合对齐最容易翻车的一关3.1 坐标系和绝对精度算方量之前先要把“秤”校好挖填方计算的本质是比较两期表面所以它对两期模型之间的相对一致性要求极高。很多人只盯着软件点“运行”按钮却忽视了模型的对齐问题结果两期数据之间有明显的平移或旋转算出来的方量完全失真。举个极端例子一块2万平方米的场地如果两期模型之间存在0.2米的整体高程偏差乘上面积就是4000方这差不多是一台中型挖掘机整整一周的工程量。这种误差不是算法能解决的纯粹是数据源头不对齐。对齐要分两层看。第一层是绝对坐标系如果两期模型用的是不同的坐标系或不同的控制点成果必须先统一到一个坐标系下第二层是相对位置偏移即使坐标系统一了由于空三解算的误差分布不同两期模型在局部仍可能有几厘米到十几厘米的偏差。对于挖填方计算第二层往往是更致命的。3.2 基于稳定区域的配准操作最关键且容易做错的一步处理两期模型相对偏移最常用的工具就是CloudCompare里Align菜单下的配准功能。具体操作分两步先用“Pick points”手动选点在两期模型的稳定地物上硬化路面、未开挖的基岩、建筑物基础、道路标线选3到5组对应点做粗配准然后在此基础上用ICPIterative Closest Point算法精配准把两期模型“吸”到一起。这里有个隐藏的坑配准用的区域绝对不能选在发生挖填变化的区域。假设场地中间有个深基坑如果粗配准时不小心把一期基坑边缘和二期基坑底部当成了对应点ICP会把整个二期模型强行拉过来计算时基坑的开挖量就被“消化”掉了结果偏小。正确做法是只在未扰动的稳定区域选点配准。配准完成后一定要做回检。把稳定区域的差值高程统计出来均值应该接近0。如果稳定区域的平均高差超过了模型高程精度的2倍说明配准还有问题应该重新处理。3.3 统一分辨率和网格对齐两期数据通常不是同一天、同一架次采集的点云密度、网格分辨率可能有明显差异。一期点云平均点距3厘米二期点云只有8厘米这种差异如果不处理直接用原始点云做三维比较模型表面细节的差异会被当成地形变化人为制造出“假挖填方”。推荐做法是把两期点云或模型统一重采样到同一个格网尺寸。格网边长的选取原则很简单取两期点云平均点距中较粗的那个的1到2倍。比如一期点距3厘米二期点距8厘米格网就取0.1米左右。格网太大地形细节被平滑掉算出来的方量不够精细格网太小稀疏点云区域会出现大量插值空洞和锯齿反而引入噪声。重采样后的两期DEM在GIS软件里还需要保证像元网格完全对齐。如果两个DEM的起点坐标、像元尺寸有一点点差异差值运算就会产生错位条纹。解决办法是在ArcGIS或QGIS里用“Resample”同时把输出范围、像元尺寸、捕捉栅格都设置为同一套参数。4. 实操细节从两期模型到挖填方报表4.1 两种主流计算方法栅格差值和实体布尔运算挖填方量计算工程上最常用的有两条路栅格差值法和实体布尔运算法。栅格差值法就是把两期DEM相减每个像素得到高差正值就等于填方区域负值等于挖方区域体积就是各像素高差乘以像素面积的总和。这个方法的优点是非常快能在QGIS、ArcGIS或者直接用Python的GDAL库批量完成适用于大范围场地的快速估算。缺点是对边界细节的表达比较粗糙特别是遇到陡坎、挡墙这种垂直面栅格化会把这些地方平滑掉一部分。实体布尔运算法是先把两期地表面建造成闭合的三维实体体量模型再在建模软件里做布尔差运算直接得到挖方体和填方体。优点是几何精度高能准确表达复杂边界适合基坑、大坝、矿山边坡这类形状复杂且对精度要求高的项目缺点是建模成本高网格模型必须封闭、无自交、无裂缝对数据质量要求苛刻。对比项栅格差值法实体布尔运算法计算速度快适合大批量处理慢需要大量手动检查和修复精度表现受格网尺寸限制垂直面易平滑几何精度高边界表达完整数据要求只需要两期DEM容错性好需要密封三角网模型要求高适用场景大面积场地、矿山、土方快速核算基坑、边坡、复杂构造物开挖量我做过的多数项目先用栅格差值法快速出结果判断量级再挑关键区域用实体布尔运算复核兼顾效率与精度。4.2 挖方量、填方量、净方量的统计口径很多人拿到计算结果后习惯只问一句“净方量是多少”。这是个误区。净方量挖方量−填方量单看这个数字会忽略很多工程问题。比如挖方量和填方量都是5000方、净方量是0看起来土方平衡但如果挖方区域和填方区域距离3公里运输成本和时间成本就是两回事。统计口径上还需要区分自然方、压实方和松散方。挖出来的土是自然状态下的体积回填时要经过运输和压实体积会变化。实际工程中通常用松散系数和压实系数来换算。这些系数和土质、压实要求有关一般按当地定额经验值取不能只用模型算出来的几何体积直接替代。所以标准报表里我一般会列出三张表按区域统计的挖方量、填方量、净方量按高程区间分级的挖填方分布表以及考虑松散系数后的方量换算表。这样数据才具备工程决策价值而不仅仅是一堆数字。4.3 实际操作流程用QGIS做一次完整的挖填方统计下面是我的实际做法完全免费开源适合没有商业软件授权的团队参考。第一步在CloudCompare里把两期点云栅格化导出两期DEM的GeoTIFF。在CC里选中点云点“Rasterize”设置格网步长输出类型选“DEM”导出成GeoTIFF记下坐标系。第二步在QGIS里导入两期TIFF。确认两个图层范围一致如果不一致用“图层属性 → 元数据”检查范围再用“栅格 → 投影 → 裁切”把范围统一到多边形边界。第三步用QGIS的栅格计算器新建一个差值图层公式就是二期DEM减一期DEM比如“dem21 - dem11”。注意方向二期减一期才能正确反映挖填。差值结果为正值表示增高填方负值表示降低挖方。第四步把差值图层按正负重分类。在QGIS桌面版里可以用“栅格计算器”把结果中大于0设为填方小于0设为挖方再分别统计面积。第五步计算体积。每个像元代表的高差乘以像元面积就是该像元的体积。栅格计算器里输入“DEMdiff * 像元面积”然后对全图求和就是总挖方或总填方量。这个求和操作可以用QGIS的“栅格层唯一值统计”或“Zonal Statistics”完成。整套流程熟练后从拿到两期DEM到输出方量报表半小时内就能完成。4.4 精度估算算出来的方量到底能信多少挖填方计算的精度问题很多新手会忽略。我认为可以从两类误差来理解。第一类是随机误差。每个像元的高程测量都有一定误差比如正射影像建模的DSM高程中误差在0.02米到0.1米之间。当大量像元累加时随机误差在统计上会相互抵消体积误差不会无限累加这一点让很多同行误以为“点多就准”。其实大量随机误差叠加后总体影响的往往是方量总值的百分之几以内。第二类是系统误差。这才是真正要警惕的。如果两期模型之间存在一个整体性偏差比如所有高程都比实际高5厘米那所有像元都会贡献同样的误差总体积误差等于偏差值乘以面积几乎不会抵消。对于10万平方米的场地5厘米的系统偏差相当于5000方土。所以配准和中误差回检一定要做尤其是稳定区域的高差均值。我在交付报告里通常会附一段精度说明写清楚格网尺寸、点云密度、高程中误差、稳定区域高差均值并以此做一个体积误差的粗算。这份精度说明在老练的审计人员眼里比任何华丽的图表都更有说服力。5. 常见问题与排查技巧实录5.1 两期模型范围不一致、边缘出现离谱高差这是做多期对比时最先遇到的问题。两期测量范围通常不会完全重合如果直接全图比较边缘区域会生成大片假的高差值看起来像是挖了几米深的巨坑。解决办法是统一裁剪到公共有效范围。在QGIS里用“矢量化”或多边形勾出两期有效数据的重叠区域然后裁切两期DEM再做差值。更稳妥的办法是先查看两期模型的实际覆盖范围生成覆盖范围多边形求交集把交集范围作为计算边界。边缘区域的一期数据如果有点云空洞或密度骤降也会导致插值异常裁剪后仍然发现边缘有可疑高差就要回到预处理阶段检查该区域点云质量。5.2 植被、水面、建筑物造成“假变化”当两期数据采集时间不同季节差异会造成植被高度变化比如春天的灌木丛和夏天的树冠相差半米甚至更多这很容易被当作挖填方。水体在摄影测量里由于纹理缺乏重建出的水面是倾斜或凹凸不平的两期水面形态不同也会产生假变化。处理思路是把这些区域单独分离出来。点云阶段用CSF地面滤波把植被滤掉水面区域用矢量多边形勾勒出来在水面边界处设置为同一高程或者直接排除出计算区域建筑物区则统一剔除除非项目本身就是建筑变形监测。实际操作中我还会做一个“变化直方图”检查。把差值栅格的所有像元值做成直方图正常情况下应该近似正态分布曲线中心在0附近。如果直方图出现明显双峰或长尾说明有大量非地形变化被混进来了需要仔细排查。5.3 模型表面坑洞和噪点模型表面坑洞无法避免特别是陡坡、反光材料屋顶、水面反射这些区域。坑洞如果不处理插值算法会用周围高程乱填结果不可控。我的处理优先级是大范围坑洞优先补测或重新采集中等范围坑洞用周围点插值极小范围可以容忍并在报告中标注。CC里可以选中坑洞边缘点右键“Edit → Mesh”对孔洞进行填充点云阶段也可以用“Tools → Projection”插值。但要注意插值出来的区域不具备真实测量精度报告中务必用醒目标注记录不能混在真实测量值里。5.4 配准偏差导致挖填量整体异常如果你发现计算结果里全场地普遍性挖方特别大、填方特别小而且稳定区域高差均值明显偏离0大概率是配准问题。最好的排查方法就是把差值栅格叠加稳定区域矢量专门统计稳定区域的高差分布。如果稳定区域高差均值超过模型高程精度的2倍必须回到第3章重新配准。6. 交付与扩展b3dm瓦片化、正射影像对比6.1 把模型转成.b3dm批量瓦片用于Web端随时查看三维模型算完方量成果不能只在本地软件里看。近年来业主和监理方越来越希望在网页端直接查看三维模型这就涉及到模型瓦片化。.b3dmBatched 3D Model是Cesium三维地球平台常用的瓦片格式适合把海量三维模型切片加载到浏览器端按需调度做到大场景不卡顿。常见的做法是先用工具把OBJ、GLTF格式的模型转换为.b3dm再配一个tileset.json组成3D Tiles数据集。具体流程上我个人的组合是建模阶段导出OBJ用Cesiumlab或obj2gltf工具把OBJ转成glb再用工具生成.b3dm瓦片最后放到nginx静态服务器里前端用CesiumJS加载。整套流程不复杂做好之后点开网页就能对模型缩小平移旋转非常方便多次核对。如果你是做多期对比更推荐把两期模型做成两个瓦片图层在Cesium里用图层透明度切换直观展示挖填变化区域。6.2 多期正射影像对比图汇报和审计的利器正射影像对比图是我项目交付的标配。它把两期正射影像并排展示或叠加做成半透明卷帘对比直观反映挖填范围和形态。即使是完全不懂测绘的项目负责人也能一眼看出哪里发生了施工活动。制作方法也不复杂在Pix4D里分别导出两期正射影像在ArcGIS或QGIS里加载设置透明度用“布局”工具出图加上比例尺、指北针、图例和影像日期。出图时注意两期影像的对比度和配色尽量一致否则会出现视觉误判。6.3 工具选型建议我的常用组合与理由做多期三维模型挖填方计算不需要迷信昂贵商业软件。我自己常用的组合是Pix4D做影像建模ContextCapture做复杂场景的精细建模CloudCompare做点云处理、配准和栅格化QGIS做差值统计和出图最后用obj2b3dm和CesiumLab做Web端发布。这套组合覆盖了从数据生产到成果交付的全部环节其中CC和QGIS都是免费开源工具几乎零软件成本。现在个别团队习惯用全站仪或者RTK跑网格数据算土方从投入产出比来看当场地面积大、地形复杂、外业条件差时尽早切换到“无人机影像建模多期模型对比”这条路长期收益是非常明显的。同时要清楚这套方法对项目参与者的三维数据处理能力有要求前期花时间把点云滤波、配准这套基本功打扎实后面才能用得更顺手。