早些年我第一次用ArcMap做出自己的第一张流域图时盯着屏幕上那条弯曲的蓝色河网和闭合的集水区边界说实话愣了好一会儿。从一堆原始影像和DEM数据到最终能放进报告里、能拿去汇报的成果图中间隔着的不是一两个工具按钮而是一整套对地理数据、空间分析和制图表达的完整理解。这篇就复盘我当时从零开始做第一张流域图的全过程包括数据怎么准备、流向怎么算、边界怎么提、图怎么出以及那些文档里不会写但实测非常关键的细节。文章偏实操用的就是ArcMap的常规工具适合刚接触水文分析或者被项目逼着要出一张流域图的朋友。1. 内容整体设计与思路拆解1.1 流域图到底是什么做出来要干什么用在动手之前先把“流域图”这件事想清楚。流域又叫做汇水区或者集水区通俗地讲就是落到地面的雨水顺着地形往低处流最终汇聚到同一个出水口的那一整片区域。做流域分析核心就是模拟雨水在地表的走向然后圈出“哪些地方的水会流到我要关注的河段或点位”。我做第一张流域图的目标很明确给一条山区小河流域做水文分析的前置底图需要明确这条河在什么位置有分水岭流域边界走到哪河网大概是什么形态。有了这张图后面不管是做淹没模拟、面源污染估算还是划定生态管控范围都有了空间上的基础框架。ArcMap里做这件事的完整工具链其实相当成熟核心就是Hydrology工具集再加上前期数据的准备和后期成果的修饰。整条链路可以拆成几个环节准备DEM数据、对DEM做填洼处理、计算水流方向、计算汇流累积量、提取河网、确定出水口、生成集水区流域边界、把栅格转成矢量、配准坐标系、修饰出图。每一步之间都有严格的因果关系前面错一点后面全白做。1.2 为什么选ArcMap而不是其他工具市面上能搞流域分析的工具有不少比如QGIS里也有对应的水文分析模块还有专门的水文模型软件如HEC-HMS、SWAT甚至ArcGIS Pro现在也已经是主流。但为什么我当时选择了ArcMap其实有一个很现实的原因项目组当时已有的数据、插件和同事的经验都是基于ArcMap这套环境的而且ArcMap的Hydrology工具集从10.x开始就非常稳定网上教程和问题解决方案也海量遇到问题能快速找到答案。说实话ArcMap确实有它“老气”的一面界面不算现代处理大数据时偶尔卡顿但它做流域分析的工具链条逻辑清晰每一步都有独立的工具入口特别适合新手理解“水流方向是怎么来的”“累积量是怎么算的”这些底层概念。相比之下有些一键式工具虽然快但把中间的物理过程全封装了出了问题根本不知道错在哪。对第一次做流域图的人来说能把每一步打开来看中间结果比图快更重要。这也是我后来带人做项目时始终坚持的观点先用手动流程把原理跑通再用模型构建器去批量化和自动化。1.3 整体流程的技术路线设计做流域分析的常规技术路线可以归纳为“数据准备—地形预处理—水流模拟—河网与流域提取—成果表达”五个阶段。数据处理这部分核心是DEM数字高程模型可以理解成一张记录了每个栅格单元海拔高度的网格数据相当于把真实地形的起伏变成了数字矩阵。水往低处流的模拟就是在这张海拔矩阵上做的。需要提前说明的是DEM的质量直接决定了后面所有分析结果的可靠性所以拿到数据第一件事就是检查坐标系、分辨率、高程范围和数据是否有空洞。地形预处理阶段最重要的操作是填洼。真实世界里地形里会有很多低洼的地方比如坑塘、采石坑、甚至DEM本身的噪声这些洼地会让水流模拟停在原地没法继续往下游走。如果不处理水流方向会乱掉最后提取的河网和流域边界全是错误的。填洼工具就是把这些低洼区域的高程抬高抬到和周围地形能顺畅流出去的水平。水流模拟阶段包含流向分析和汇流累积量计算。流向分析的核心是算出每个栅格单元上的水会流向8个邻居中的哪一个ArcMap用的算法是D8单流向法就是找周围坡度最陡的那个方向。汇流累积量则是统计每个栅格单元上游有多少个单元的水会汇过来这个值大的地方就是河道小的地方就是坡面。2. 核心细节解析与实操要点2.1 DEM数据的获取与预处理我用的数据是项目方提供的某机构公开影像生成的DEM栅格分辨率是30米坐标系是WGS84地理坐标系。这里先要吐槽一个重要的问题很多人拿到的DEM坐标系是经纬度也就是以度为单位这会导致后面所有的坡度和流向计算数值怪怪的因为1个纬度的距离和1个经度的距离在不同地方完全不一样。所以拿到数据第一步我习惯先看看DEM的属性确认坐标系。如果原始数据是地理坐标系我一般会投影成适合当地的高斯-克吕格投影或者UTM投影让每个栅格单元在X和Y方向上都对应真实的地面距离。填洼之前还要做一步很多人忽略的操作检查DEM有没有负值或者异常值尤其是沿海或者河谷地区有些DEM在河床位置会出现比周围低得特别离谱的“钉子点”。这种异常值如果直接参与填洼会把下游的大片区域全填成平地。我处理这种数据的方法是先用栅格计算器做一个简单的筛选把低于某个绝对高程的值替换成周边平均高程或者用焦点统计做一个平滑。当然这个方法要谨慎用不能把真实地形改坏了但处理明显的异常值是必要的。2.2 水流方向计算的原理与实操流向分析之前要先填洼填洼工具在ArcToolbox的Spatial Analyst Tools—Hydrology—Fill里参数很简单输入DEM输出填洼后的DEM还有一个Z limit参数。这个Z limit可以理解为填洼的最大深度限制默认是空值意思是所有洼地都填平。但实际地形中有些洼地是真实的比如喀斯特地区的落水洞如果全填掉水流方向会失真。我当时处理的是普通山区流域地形相对连续就保持默认全填了。如果遇到喀斯特地形或者矿区塌陷区建议根据实地情况设置一个合理的填洼深度上限把过于深的、明显异常的洼地排除掉。填洼完成后接着用Flow Direction工具计算流向。这里需要留意一下工具输出有两种可选一种是D8方向的整数编码1、2、4、8、16、32、64、128另一种是可选的输出为流向权重的浮点栅格。平时我们看流向图用的就是整数编码。这些编码的含义需要知道1表示东2表示东南4表示南8表示西南16表示西32表示西北64表示北128表示东北。这个规则是为了用二进制位图的方式让程序快速处理方向关系不是随便编的数字。实操上有一个小技巧算完流向栅格建议拿它和填洼后的DEM叠在一起看一眼如果流向箭头和等高线看起来是“垂直往下”的说明地形预处理没太大问题。如果流向混乱检查一下投影是否正确再回头看是不是有未处理的异常值。我那次做项目时第一次算出来的流向图在河谷段出现了大量的平行乱流排查了半天发现是原始DEM在某河谷区域有一块横向条带状的噪声。2.3 汇流累积量与河网提取的阈值选择流向栅格做好之后用Flow Accumulation工具计算汇流累积量。这个输出结果表示的是每个栅格单元上游有多少个单元的水汇入到它这里数值越大说明水流越集中越像真正的河道位置。河网提取的核心操作就是给这个累积量栅格设一个阈值。大于等于阈值的像元被认为是河道小于阈值的像元是坡面漫流。阈值的设定没有统一标准完全取决于你要表达什么尺度的河流。比如30米分辨率下阈值设1000相当于上游汇水面积约0.9平方公里能提取出比较细的沟道设5000相当于上游约4.5平方公里提取出的河网就比较精简接近常说的常年流水河道。我当时用了一个比较笨但有效的方法先生成几个不同阈值的河网叠加在影像和等高线底图上对比看哪个阈值下的河网与影像上肉眼可见的河道最接近。最终我选了一个既能体现支流分布又不会让图面过于破碎的阈值。这里特别提醒不要把阈值设得太低否则整个山体坡面都会被提取成密密麻麻的细线图面没法看而且在后面的流域分析中会把每一条小冲沟都当成河道出水口选点会很痛苦。2.4 出水口选择与集水区生成河网生成之后就可以确定出水口Pour Point然后用Watershed工具生成流域边界。出水口的意思就是流域汇水的最终出口可以是整个河流的入河口、某个水文监测断面、或者你关心的某个具体控制点。选出水口的操作其实最考验经验。我当时是用“捕捉”的思路先在河网上选一个汇流累积量很大的栅格作为出水口但手工点的位置往往和栅格中心对不齐解决办法是用Snap Pour Point工具把出水点捕捉到指定范围内累积量最大的像元上。这个工具参数里有一个捕捉距离我一般设为DEM分辨率的3到5倍比如30米分辨率就设90到150米太小了捕捉不到太大了可能跳到别的河道上去。流域边界算出来之后会得到一个栅格每个流域赋予一个独立编号。这时候需要把栅格转成矢量用Raster to Polygon工具。转换时会发现边界都是锯齿状的阶梯线这是因为栅格数据本身就是网格结构。如果需要平滑的边界用于制图可以用Simplify Polygon工具做一定的简化但切记不要过度平滑把真实的流域形态弄没了。我个人是不太建议在成果图里对流域边界做太强的平滑的看起来漂亮了但经不起专业推敲。3. 实操过程与核心环节实现3.1 数据加载与工作环境的搭建正式操作前ArcMap的工作环境设置会影响后续所有自动生成的临时文件的存放位置和坐标系。我的习惯是开工之前先做一个完整的环境配置打开Geoprocessing—Environments把当前工作空间和临时工作空间都指定到一个专门的工程文件夹输出坐标系设成和DEM一致的投影坐标系栅格分析中的像元大小保持和DEM一致。这一步看着不起眼但实际非常重要。如果不设置工作空间ArcMap默认会把中间过程生成的栅格文件丢到默认的临时目录下下次清理系统缓存或路径变化时你的数据源就可能变成断链状态整个地图文档里的图层全体“罢工”。我早期就吃过这个亏做了一半关掉软件第二天打开地图文档所有栅格图层都因为临时路径失效而显示不出来只能重新跑一遍流程。设置一个干净的工程文件夹所有中间结果都写到里面这是保证可追溯、可复盘的前提。3.2 填洼到河网提取的完整操作序列接下来把核心流程按顺序操作一遍。第一步填洼。打开ArcToolbox定位到Spatial Analyst Tools—Hydrology—Fill输入是预处理好的DEM输出我命名为dem_fill。这里要注意选的DEM必须是单波段浮点型或整型数据如果是多波段影像工具会直接报错。填洼的原理可以理解成用一个“水往低处流”的规则不断检查每个洼地的最低缺口高程然后把低于这个缺口的区域整体抬升到缺口高程让水能继续流出去。过程比较耗时30米分辨率、面积几百平方公里的区域通常几分钟内能完成。第二步流向分析。用Flow Direction工具输入dem_fill输出流向栅格方向编码选择D8。D8算法是假设水流只有一个流向即流向8个邻域中坡度最陡的方向。这种算法简单高效在大多数地形条件下都能得到合理结果但也有一些局限性比如在平坦区域或者人为整平的地面上流向计算会不稳定容易产生平行流。如果后面发现河网在平原段特别的平直和机械大概率就是这个问题。第三步汇流累积量。用Flow Accumulation工具输入流向栅格输出累积量栅格。如果不做任何设置工具默认对所有流入单元做统计权重栅格可以不填表示每个单元贡献一份流量。如果希望考虑降雨空间分布或者不同地类的产流差异可以准备一个权重栅格每个像元值代表该像元的产流权重但第一次做的话建议先用默认。第四步阈值提取河网。栅格计算器中输入公式Con(flowacc 4000, 1)意思是累积量大于等于4000的设置为1其他为NoData。这个操作生成一个二值栅格值为1的位置就是河道。随后用Stream to Feature工具把河网栅格转成矢量线这个工具会同时考虑流向把栅格连接成连续的多段线。这一步非常关键因为它生成的河网线是带有正确上下游拓扑关系的绝不是简单的像元转点连线。第五步生成流域。先要在河网层上选一个或者多个出水口。如果只有一个出水口可以直接在河网最下游的位置建一个点要素然后选择【Spatial Analyst工具—Hydrology—Snap Pour Point】进行捕捉如果需要划分多个子流域可以在河网上按节点均匀布点再用Watershed工具一次性生成多个集水区。我当时是为了做整条河的完整流域边界所以只选了一个总出水口就选在河流流出研究区边界前的那一个栅格上。3.3 栅格流域转矢量与制图要素的整理Watershed工具输出的栅格每个流域像元的值代表了该像元所属的流域编号。Raster to Polygon转矢量后还要注意属性表里可能会多出一个grid_code字段这是流域编号。接下来做制图前处理把流域边界要素和河网要素套合到同一坐标系下检查有没有细碎的、面积过小的面要素。制图要素的整理是很多人容易忽略的重头戏。流域图不只是给一个封闭的边界线和一条蓝线还需要补充一些基础地理要素来支撑读图。我当时加了几类要素流域边界、河网、等高线由DEM生成但要做抽稀、主要居民点、道路、以及图框内的指北针和比例尺。这些要素分别来自不同数据源必须保证投影坐标系一致不然叠加后会错位得离谱。等高线的生成用Contour工具我当时设置的是每隔50米一条计曲线、10米一条首曲线。但实际制图时发现如果全部显示线条太密会盖住河网于是我把首曲线关掉只显示计曲线并且给主要河流的河谷区域做了一点透明度处理让地形和河网的主次关系清晰起来。3.4 出图布局与成果导出的关键设置制图出图是在Layout View里完成的。很多人分析做得很好一到出图就随便拉一个图框导出了事这样出来的图既不符合专业规范也很难放到正式报告里。我当时总结了几个必须检查的项数据框的坐标系必须与内容一致比例尺要是整数倍比如1:50000、1:100000不要出现1:37123这种奇怪的比例。指北针放在图的右上角或左上角但如果你出的是小比例尺的流域位置图而且图面有经纬网或有明确的河流流向指示指北针也可以放在图例下方。图例的内容要精简流域边界、河网、等高线、居民点、控制点等有选择地放不是所有打开的图层都要在图例里出现。导出之前还要在图面空白处放上制图信息图名、坐标系统说明、数据来源、制图日期、制图人。这些信息是专业制图的基本素养尤其如果图要提交给政府或业界单位缺少这些信息容易被退回修改。导出图片时我用的是File—Export Map格式选PNG或TIFF分辨率至少300dpi。有的同事图省事直接截图打印出来全是锯齿这个习惯一定要改。4. 进阶延展与空间数据库和外部数据的衔接4.1 用PostgreSQL空间库管理流域分析成果流域图做完之后面临的现实问题是怎么管理这套数据。尤其当项目涉及多个流域、多期DEM、多条河网数据时简单地把shapefile存在文件夹里很快就会乱套。我当时在项目中尝试过把成果数据统一入库到PostgreSQLPostGIS再通过ArcMap的ArcSDE或者直接数据库连接去读取和管理。这里提一下我踩过的坑PostGIS的空间数据和ArcMap的兼容性要注意版本匹配尤其是早期版本需要特别注意数据库驱动与客户端位数一致否则连半天都连不上。部署PostgreSQL空间库简单来说就是先把PostgreSQL安装好再在安装目录下找到Stack Builder选择安装PostGIS扩展然后在数据库中启用PostGIS扩展。ArcMap连接PostGIS通常有两种路径一是在Catalog窗口里添加数据库连接选择PostgreSQL大小时填主机、端口、数据库名和凭据二是通过ArcSDE技术做企业级地理数据库。对于个人项目或小团队直接添加数据库连接就够了不需要专门搭ArcSDE服务成本和维护复杂度都能大幅降低。把流域图成果导入PostGIS有个好处就是可以用SQL空间查询直接做统计比如快速地算出每个子流域的面积、中心点、与指定点位的距离。这些在ArcMap的属性表里也能做但数据量一大、规则复杂了SQL明显更高效。比如我想批量算每个子流域内大于25度坡度的面积占比在ArcMap里要先做坡度分级再按流域区域统计步骤繁琐而在PostGIS里用ST_Intersection加条件统计几秒钟就能出结果。4.2 Excel经纬度数据导入生成点位图层流域图里往往要标注已有的水文监测断面或者雨量站点而这些站点坐标常常以Excel表的形式存放在项目库里。把Excel中的经纬度数据导入ArcMap并生成shp是一个高频到不能再高频的场景。操作并不复杂但有不少细节值得注意。Excel数据准备好之后要保证里面至少有两列分别是横坐标和纵坐标而且要和你的地图坐标系统匹配。如果地图是投影坐标系比如高斯-克吕格投影Excel表里存的却是经纬度那么导入后点位会跑到海里或非洲去这是很多新手最容易犯的错误。正确做法如果Excel里是经纬度就先通过ArcMap的Add XY Data按地理坐标系WGS84生成临时事件层然后使用Project工具转换到目标投影坐标系再导出成shp。如果Excel里是投影坐标那就直接按对应的投影坐标系导入。还有一点烦人的是Excel里的坐标列格式经常有文本型的数字带着空格或者单位后缀比如“108.35度”这种导入前需要在Excel里把这些清洗干净统一转成数值型。我在实际项目中还遇到过一列坐标混有度分秒格式112 12 33的情况这种必须先拆列换算成十进制度数后再导入。总而言之坐标数据的规整和坐标系识别是所有空间分析工作的地基地基不正后续全歪。4.3 模型构建器实现流域分析流程自动化当流域分析要做不止一次、或者要对比不同阈值下的河网方案手动在工具面板里一次次点会非常低效。ArcMap自带的ModelBuilder是一个很好的自动化工具可以把前面讲的填洼、流向、累积量、河网提取、流域生成这几个工具串联成一个模型。模型建好后每次只需要输入一个新的DEM改一下阈值参数就能自动跑完全流程输出结果。我当时的做法是先在ModelBuilder里把河网提取流程拖出来把阈值参数设置为模型参数Model Parameter这样在模型运行时可以直接弹出输入框填写。对于子流域划分场景还可以把出水点也做成模型参数用循环的方式对多个出水点批处理生成流域边界。这套自动化模型我把文件保存在工程文件夹里后续团队其他人复制过去只要数据路径没问题就能直接复用。5. 常见问题与排查技巧实录5.1 坐标系不匹配导致分析结果完全错位的排查做流域分析时最常碰到的问题之一就是各种数据坐标系不一致导致叠加错位。我接手过一个案例河网线明明和DEM是同一个区域但叠在一起发现河网整体向东偏了几百米。最后排查发现DEM用的是WGS84地理坐标未投影而河网是从另一个工程里导出的坐标系是WGS84 UTM Zone 49N投影两者虽然基准面一样但坐标表现方式不同直接叠加自然是错位的。解决的办法不复杂统一坐标系。建议把涉及分析的所有数据都通过Project Raster或者Project工具转换到同一个投影坐标系不要图省事直接加载原始未投影数据。判断数据是否投影看图层属性里的Source选项卡如果线性单位显示是Degree就是地理坐标如果是Meter或者Foot则已被投影。还有一个高频错误是单位看错了两个栅格看起来坐标系一样但一个是米一个是英尺导入后整个区域缩放比例就会很奇怪。5.2 流向栅格出现大片异常或全为边界值的处理如果计算出来的流向栅格在平坦区域出现大量“东”方向值1的平行直线多半是地形过于平坦或者DEM经过了过度平滑。这时候要从原始DEM找原因。常见的是人为平整过的农田区、盐田、城市建成区等。这些区域现实中往往有专门的排水工程干预用D8算法做自然模拟本来就不合理但如果你必须要让分析在这些区域也能出结果可以尝试在填洼前对DEM做一次“地形抬高微调”比如加入一个很小的正负随机噪声例如±0.1米打破平地像元的绝对等高状态让流向算法有明确的下坡方向。这个方法对长条形区域效果还可以但使用前要明白这是人为干预不是自然真实情况。如果流向栅格出现大片区域全是流向边界方向比如全是1或全是8还有一种可能是DEM的分辨率太粗导致整个山谷就一两个像元宽。这种情况下建议重新获取更高分辨率的DEM。网上有不少公开的高精度DEM数据源但具体数据获取渠道和授权方式需要注意我不在这里展开。5.3 填洼后DEM与原始地形差异过大的判断填洼后一定要对比填洼前后的DEM。ArcMap里可以用Raster Calculator直接相减得到填洼厚度分布图。如果发现某个区域填洼厚度高达几十米甚至上百米那基本可以判断这个区域可能存在DEM数据错误或者真实地形中有巨大的人工改变比如露天矿坑、大型水库大坝。这种情况下直接使用填洼结果是不靠谱的。我当时的处理方式是对于水库大坝这种人工障碍先用ArcMap的手动编辑在DEM上“开一个口子”把坝体位置的高程按坝下水位的平缓路径修改后再填洼。这一步操作需要谨慎最好有实测的河道断面高程数据做参考否则就是在拍脑袋。但如果只是做初步的流域范围圈定把这种特定点位的问题单独处理掉对整个流域边界的影响是可以接受的。5.4 ArcMap崩溃或工具运行报错的常见原因ArcMap做水文分析时如果数据量很大比如几十GB的高分影像或者大范围高分辨率DEM工具运行过程中偶发崩溃是正常的不必恐慌。我从经验中总结了几个降低崩溃概率的措施尽量关闭其他占用内存大的程序不要在一个地图文档里同时加载太多大数据图层中间结果及时清理以及定期保存地图文档最好设置自动保存插件或用CTRLS养成肌肉记忆。此外ArcMap对中文路径的支持一直不佳工程文件夹和文件名称尽量用英文和数字不要带中文和特殊符号。这一点真的非常重要很多莫名其妙的工具报错最后都是中文路径惹的祸。如果某个特定工具反复报错比如Flow Accumulation提示“ERROR 010067”一般是输入数据问题先把流向栅格检查一遍看看有没有NoData区域的混乱交错。另一个高频报错是“999999”这种一般都不是具体算法问题而是操作环境导致的重启软件、清空临时目录后往往能解决。6. 从第一张流域图到可复用成果的总结思考6.1 数据管理和路径规范的血泪教训做完第一张流域图我最大的收获不是点击了多复杂的工具而是认识到从项目一开始就建立一套规范的数据管理和路径体系有多么重要。ArcMap工程里所有数据必须放在同一个根目录下相对路径替代绝对路径这样即使整个工程文件夹移到另一台电脑上也不会出现图层断链。地图文档属性里勾选“Store relative pathnames to data sources”导出成mxd文件后团队同事打开就不会出现一排红色感叹号。另外所有栅格工具的中间结果建议在命名时统一加上阶段后缀比如原始DEM命名为dem_raw填洼后的命名为dem_fill流向为dir_fill累积量为acc_fill。这样一旦流程需要重跑能很快定位到问题出在哪个阶段。如果命名随意比如final_dem_final_最终版这种过两个月回头看你自己都想不起来文件是什么内容。6.2 制图审美与表达规范的提升路径制图出图这一块很多人觉得是体力活没什么技术含量但实际上一张流域图能不能在汇报场合让领导或甲方一眼看懂取决于制图者的表达能力和审美水平。我个人的经验是出图前先问三个问题这张图的核心信息是什么观众是谁图的阅读顺序应该是什么比如面向水务部门的流域图核心信息是流域边界和河网那么这两个要素就必须是视觉焦点颜色要比背景地形明显突出其他要素如道路、居民点只能弱化不能抢戏。还有配色的问题ArcMap自带很多色带但不是所有色带都适合学术和专业制图。水体用蓝色系从浅蓝到深蓝流域边界用深红色或紫色粗线条背景的DEM渲染用山体阴影加透明度这样层次感明显强于直接把DEM用彩虹色带拉伸出来。彩虹色带虽然色彩丰富但会让图面显得很“花”而且不同色带之间的等高差信息不直观。6.3 后续可扩展的方向与真实体会做出第一张流域图只是水文分析这条路上开了一个头。后续可以扩展的方向很多比如在流域图的基础上继续做子流域划分、计算每个子流域的面积和坡度统计、结合土地利用数据做径流系数估算、甚至把河网和流域导出到HEC-HMS里做降雨径流模拟。就我个人的实际经历来说第一次做流域图最值得投入时间的地方一是理解填洼、流向、累积量这几个核心步骤的原理二是养成从头到尾规范操作的习惯。工具本身并不复杂复杂的是数据质量的控制和每一步结果合理性判断。我踩过很多坑也推倒重来过很多次但现在回头去看正是这些试错才把一个“会用工具的人”变成了“能判断结果对不对的人”。最后再分享一个小技巧定完流域出水口后先在ArcScene里把填洼后的DEM和流域边界三维叠加一眼你会发现流域实际是一个“碗状地形”视觉效果非常直观。这个操作能帮你快速判断出水口是否选在真实地形的最低出口处同时也让抽象的分析结果变得非常有说服力。做项目汇报的时候拿出这张三维流域图比对着平面图苦口婆心解释大半天要高效得多。