
这几年做地质、环境、气象相关项目的朋友大概率都遇到过同一个尴尬手头数据要用等值线表达但单靠ArcGIS的插值效果总差口气而Surfer出的图虽然漂亮后续的空间分析又离不开ArcGIS。我一直在用Surfer 10配合ArcGIS 10.3走完整条插值—成图—分析—出图的链路这套组合在我手上跑了七八个项目从土壤重金属污染评估到地下水位埋深分布再到降雨量空间插值几乎没有失手过。这篇就专门聊聊怎么把这两个软件串成一条稳定、可控、还能反复复用的流水线。需要说明的是这套流程更偏向实用主义——不是在跟你讨论哪个软件更优秀而是把两者最擅长的部分拆出来组合使用。对于需要出高质量的等值线图、又要利用ArcGIS的空间分析能力做后续处理的场景这套方法基本就是目前最顺手的方案。1. Surfer负责插值、ArcGIS负责成图两个工具分工的底层逻辑1.1 为什么一定要折腾两个软件很多人一开始会有疑问ArcGIS本身就能生成等值线Spatial Analyst里有个Contour工具给定一个栅格就能自动提取等值线为什么还要先去Surfer里绕一圈答案其实藏在插值算法的差异里。ArcGIS内置的插值方法包括IDW反距离权重、Kriging克里金、Spline样条函数等算法本身并不少。问题出在两个地方一是ArcGIS的Kriging参数设置界面相对复杂对普通用户不太友好很多人就是用个默认参数插出来的结果飘得离谱二是ArcGIS出等值线之前需要你先创建出一个形状规整的栅格表面而这个栅格的分辨率、范围、像元大小设置不当直接决定最终等值线的质量这一步如果不够讲究后面的等值线必然出现锯齿、断头、边界外扩等毛病。Surfer在这方面的优势非常明显。它本身就是为等值线图而生的软件插值引擎经过多年迭代Kriging、最小曲率、自然邻域等方法都非常成熟尤其是KrigingSurfer的界面把变差函数模型的设置做得很直观你可以清楚地看到拟合曲线和参数变化带来的影响。更重要的是Surfer生成等值线之前会让你直观地预览网格表面的三维形态发现异常可以直接回退调整这种所见即所得的工作方式在ArcGIS里要费不少周折。但反过来Surfer在空间分析和制图出版方面的能力远不及ArcGIS。Surfer处理不了复杂的投影系统对地理数据库的支持基本为零出图时叠加行政区划、道路、水系、采样点这些要素的效率很低。所以现实的做法就是插值和等值线生成交给Surfer等值线导出后在ArcGIS里完成裁切、赋属性、叠加底图、出图排版等后续环节。这样既发挥了Surfer在插值上的精度优势又用上了ArcGIS在数据管理和制图上的生态能力。1.2 两个软件处理坐标系统的本质差异这条要单独拿出来强调因为这两个软件在坐标的底层逻辑上差别很大不少人第一次做的时候就栽在这里。Surfer 10对坐标系的支持颗粒度比较粗。它的坐标概念基本就是X列、Y列两个数值列不关心你是经度纬度还是平面坐标也不关心你用了什么投影。也就是说你在Surfer里画出来的图本质上是在一个无投影的笛卡尔平面上进行的。如果你的数据是经纬度坐标那Surfer默认会用等距圆柱投影来显示这在低纬度地区问题不大但在中高纬度地区图形会产生明显的南北向拉伸等值线的形态也会跟着失真。ArcGIS 10.3对坐标系的要求则严格得多。每个要素类都有明确的坐标系统定义空间参考可以是地理坐标或投影坐标。当Surfer导出的数据进入ArcGIS时如果没有定义正确的坐标系ArcGIS会把它当作未知坐标系处理后面的投影转换、面积计算、叠加分析全部都会出问题。所以我在实际项目中定了一个铁规矩进入Surfer之前先把原始数据统一到投影坐标系。如果是全国尺度的项目用Albers等积圆锥投影或Lambert等角圆锥投影如果是省级以下尺度的项目用UTM投影或高斯-克吕格投影。说白了要保证X、Y坐标的单位是米而不是度。这样做有两个好处一是插值过程中距离计算是真实的地面距离不会因为纬度变化导致权重失真二是ArcGIS后续操作省去投影转换的麻烦。2. 数据准备与格式规范前期整理决定了后期80%的图纸质量2.1 原始数据表格的整理要点很多人拿到采样数据就开始做图结果后面反复返工。以我的经验最稳妥的方式是先在Excel里把数据整理成一个标准的三列结构第一列是X坐标经度或投影坐标第二列是Y坐标纬度或投影坐标第三列是Z值你要插值的那个属性值比如污染物浓度、水位埋深、降水量等。如果有高程、样点编号、采样日期等额外信息放在后面的列里Surfer反正只认前三列。这里有几个细节值得注意坐标列必须使用数值格式不能是文本。有时候从GPS设备导出的数据会带着度分秒符号比如116°2345这种格式Surfer完全读不了需要先转换成十进制度数。Z值列不允许有空单元格。Kriging插值对缺失值非常敏感空值会被Surfer当作无效数据处理导致插值表面出现异常空洞。遇到缺失值宁可把整行删掉也不要留着空值。重复坐标点尽量合并。同一个坐标位置有多组Z值时取平均值或者全部保留都行但绝对不能让它以重复点的形式参与插值因为有些插值方法对重复点的处理会出现数值振荡。数据量方面Surfer 10对数据量并没有特别严格的限制但实际测试下来超过5万个散点后Kriging的运算时间会明显增加。对于大范围高密度的数据建议先对数据进行抽稀或者分区块插值后再拼接这个后面在问题排查部分会展开。2.2 文件格式的选择与保存路径Surfer 10能够读取的数据文件格式很多包括.xls、.xlsx、.csv、.dat、.txt等。我常用的方案有两种小型数据几百个点把Excel另存为.CSV格式文件简洁读取速度快而且内容透明可以用记事本直接打开检查。中大型数据几千到几万个点直接使用Surfer自带的.dat文件格式在Excel里通过另存为选择文本文件制表符分隔再把后缀改成.dat。注意Surfer 10对.dat文件中的列头非常敏感如果你在表格第一行写了列名导入时需要在第一行是否包含列头的选项中打勾否则Surfer会把列名当作一个数据点处理。文件保存路径看似小事但在两个软件间切换时特别容易出问题路径中不能包含中文和空格。Surfer 10对中文路径兼容性不好有时候图能打开但保存或导出时会莫名其妙地报错ArcGIS 10.3虽然对中文路径的兼容性好一些但在地理数据库File Geodatabase和某些地理处理工具中仍然存在隐患。所以我的项目文件夹统一用英文命名比如E:\GIS_Projects\Soil_HeavyMetal子文件夹分开存放原始数据、Surfer工程、ArcGIS工程各用各的目录互不干扰。2.3 缺失边界数据的预处理做等值线时有一个容易被忽略的问题采样点范围往往不等于你实际要出图的范围。比如你要做整个县的土壤污染分布图但采样点只覆盖了其中几个乡镇Surfer默认生成的网格会把插值范围扩展到采样点的外包围盒在你没有采样的区域也会强行插值出一堆等值线来。处理方式是在进Surfer之前先准备一个边界文件BLN格式。BLN是Surfer的白化Blank文件本质上是一个闭合的多边形坐标序列用来限定插值或成图的范围。你可以在Surfer里手动创建也可以从ArcGIS里把研究区的边界Shapefile导出坐标序列后整理成BLN格式。有了BLN文件在做网格化或出图时可以指定Outer Boundary参数让等值线只在你圈定的范围内显示边界之外的区域保持空白。这个步骤对最终效果的影响非常大尤其在跟行政区划图叠加时如果等值线冲出研究区范围看起来非常不专业后面在ArcGIS里裁切也是一堆麻烦。所以我的流程里BLN边界是数据准备阶段必做的一项不做完不进下一步。3. Surfer 10里生成等值线的完整操作链路3.1 网格化方法与参数设置的实操建议打开Surfer 10后菜单栏选择Grid → Data选中整理好的数据文件软件会弹出网格化参数设置窗口。这个窗口里最核心的选项有三个网格化方法Gridding Method、网格范围Grid Line Geometry、变差函数参数仅Kriging。网格化方法的选择。Surfer 10提供了12种插值方法包括Kriging、反距离加权、最小曲率、改进谢别德、自然邻域、最近邻点、多元回归、径向基函数、三角剖分线性插值等。这里面我最常用的是Kriging它在多数地学场景下效果最稳既有空间相关性的数学支撑又有可调节的变差函数参数来控制平滑度。当数据量较大且分布均匀时我也会用自然邻域法速度比Kriging快很多效果接近但参数更少适合快速试算。IDW方法虽然通俗易懂但它的插值结果容易在采样点周围形成牛眼状同心圆视觉效果不好我一般不推荐。Kriging参数的实用设置。选好Kriging后点击右侧的Advanced Options进入高级参数设置。这里你会看到变差函数模型Variogram Model的下拉框里面有线性、球面、指数、高斯等多种模型。我在实际操作中的经验球面模型Spherical适合绝大多数地学数据是最通用的选择。指数模型Exponential当数据的空间连续性较弱、短距离内变化很快时用指数模型拟合效果更好。高斯模型Gaussian适用于表面非常光滑的数据比如经过平滑处理的高程数据。其他参数如Number of Structures、各向异性Anisotropy角度和比率除非你有明确的专业知识否则保持默认即可。值得注意的是Variogram Model部分的Slope和Nugget Effect参数Nugget块金效应表示距离无穷小时的方差如果你的数据测量误差较大可以适当调高这个值但一般保持默认就好。在网格范围设置中有一个关键操作在Grid Line Geometry里把网格密度设置得适当一点。网格太稀如100行×100列会导致等值线过度平滑细节丢失网格太密如1000行×1000列则会大幅增加运算时间而且在等值线提取时还可能因为网格单元过小产生细小碎线。我的实践经验是按照数据覆盖范围的大小把网格行列数设置在300~500之间既保证了细节也不至于太慢。3.2 等值线图的生成与样式控制网格化完成后选择Map → New → Contour Map选中刚才生成的网格文件.grd格式Surfer会立即生成一张等值线图。这个时候不要急着导入ArcGIS先在Surfer里把图调整到满意状态。双击等值线图打开属性管理器你会看到Levels、Layer、General等几个选项卡。其中Levels是设置等值线间隔和起止值的地方。点击Levels的Set Limits/Interval按钮可以设置等值线的最小值、最大值和间隔。比如要绘制降雨量等值线范围是400到800毫米间隔设为50毫米就会生成8条等值线。等值线的高程标注也在这里调整。在Levels列表中选择Labels选项卡勾选Visible让等高线标签显示出来设置标签的字体、大小和位置。如果等值线太密导致标签互相重叠可以增大Label Offset值让标签沿等值线偏移或者直接把已显示的标签数量减少。线条的样式控制对整个图的专业度影响很大。我通常会把等值线分为如下几级用不同粗细和颜色区分首曲线细线默认颜色线宽0.5计曲线加粗线每隔5条或10条加粗一次线宽1.5辅助线虚线用于特定值如边界线、异常区在Levels列表中你可以选中某一条等值线单独修改线型也可以通过Default选项卡中按数值区间设置样式。这个方法在出图效果上很有用尤其是当等值线比较多、需要突出主线时视觉层次感一下就出来了。3.3 导出等值线为ArcGIS可用的Shapefile格式等值线调整满意后开始导出环节。Surfer 10提供了多种导出方式但对于要进入ArcGIS继续处理的情况我推荐直接导出为Shapefile格式。实际操作步骤菜单栏选择File → Export在文件类型下拉框中选中Esri Shapefile (*.shp)指定文件名和保存路径后点击保存。Surfer 10会弹出导出选项窗口需要注意的有一个关键参数Graticule选项必须选Map Coordinates这样才能让导出的Shapefile使用你原始数据的坐标值而不是图形坐标。如果选成Page Coordinates页面坐标导出后的要素就变成了一堆无意义的相对坐标在ArcGIS里完全没法用。导出后的Shapefile包含三个文件.shp几何信息、.shx索引、.dbf属性表。其中.dbf属性表里有一个名为ELEV的字段记录着每条等值线的值。这个字段名是Surfer自动生成的进ArcGIS后你可能需要重命名为更具语义的名字比如RAINFALL或CONCENTRA以便后续分析和标注。还有一个需要注意的细节在导出为Shapefile之前先检查一下等值线图的范围与你的BLN边界是否匹配。如果等值线图范围明显大于研究区导出的Shapefile里也会包含范围之外的等值线。虽然可以在ArcGIS中裁切但多一步就多一个出错的可能。我通常在Surfer的Map属性中设置Fault Lines或Blank相关参数让绘制范围严格限制在BLN边界之内。4. ArcGIS 10.3中等值面的生成与自动化处理4.1 数据导入与坐标系定义Surfer导出的Shapefile进入ArcGIS前第一步是定义坐标系。我在ArcMap中点击ArcToolbox → Data Management Tools → Projections and Transformations → Define Projection选择这个Shapefile然后定义一个与原始数据一致的投影坐标系。如果你的原始数据是WGS84经纬度坐标坐标系就选WGS 1984如果是投影坐标选对应的投影坐标系。这一步千万不能省略。哪怕你已经知道图层本身是有坐标的ArcGIS也无法自动识别Surfer导出的Shapefile中的坐标信息必须要你手动指定。指定后再叠加底图检查一下位置是否正确确认无误后再进行后续分析。4.2 从等值线生成等值面的两种路径ArcGIS 10.3中生成等值面也就是通常所说的面状填色图的方法有两条路径我分别说下各自的适用场景。路径一先转TIN再从TIN转栅格最后生成等值面。这个方法适合等值线比较平滑、且数据本身来自高质量插值的情况。操作步骤如下打开3D Analyst工具条选择Create/Modify TIN → Create TIN From Features输入Surfer导出的等值线Shapefile高程字段选ELEV。在TIN创建的参数中设置Height Field为ELEVTriangulation选择Hard Line硬约束线这样可以保证TIN表面严格沿等值线变化不会在等值线之间产生过度平滑的插值。TIN创建完成后在ArcToolbox中选择Spatial Analyst Tools → Interpolation → TIN to Raster把TIN转换为栅格表面。栅格像元大小根据你的数据精度要求设置一般取等值线间隔的1/4到1/2即可。比如等值线间隔是50毫米栅格像元大小可以设置成20米如果空间分辨率允许或更小。栅格表面生成后用Spatial Analyst Tools → Surface → Contour List或Contour工具按指定的等值线间隔生成等值面多边形。如果你只是想要一个分段的填色面可以在栅格表面的Symbology中选择Classified设置分类方法手动、等间隔、分位数等和类别数量ArcGIS会自动生成不同颜色的填色区这也是一种等值面的可视化效果但它是栅格分类的效果并不是真正的矢量面。路径二利用ArcScan或数据转换工具直接由等值线生成面。这个思路是把等值线视为闭合或非闭合的多边形边界用面要素构建工具填充等值线之间的区域。ArcGIS 10.3中可以用Topology工具构建等值线之间的拓扑关系再转成面要素。但这条路径操作复杂、拓扑构建容易出错对于有明确数值分层的等值线来说还是路径一更可控。实际项目里我80%的情况用的是路径一并且直接在栅格数据上用Classified显示模式来自动生成等值面效果。因为最终出图时ArcGIS的布局视图可以直接把栅格分类显示的图例、统计信息都调出来省时省力。4.3 等值面的平滑与边界剪裁从TIN转栅格后再生成的等值面往往存在两个问题边界锯齿明显、区域内部有小碎斑。边界锯齿主要来源于栅格的像元形状。解决方法是生成栅格时把Cellsize适当调小或者使用Filter工具Spatial Analyst Tools → Neighborhood → Filter对栅格做一次低通滤波选择LOW将表面平滑化然后再生成等值线或分类显示。小碎斑通常是因为等值线本身存在微小的波动或者转换过程中产生了误差。通用的rulembda解决方法是在栅格分类显示后用Spatial Analyst Tools → Generalization → Majority Filter工具将面积过小的斑块合并到相邻的大斑块中。Majority Filter中你可以设置替换阈值如4或8数值越大小斑块越容易被合并。我一般设置成4避免过度合并导致真实细节丢失。边界裁切是在ArcGIS里收尾的关键步骤。等值面生成后一定要用研究区边界进行裁剪。ArcGIS 10.3中可以使用Analysis Tools → Extract → Clip工具把等值面图层按行政区边界裁剪。裁切前注意把输入要素Input Features选中为等值面图层裁剪要素Clip Features选中为边界多边形环境设置中把Output Coordinate System和Processing Extent都设置为与边界一致。这样裁剪出来的等值面边缘会严格贴合研究区界线不会再出现跨界或缺口的情况。5. 项目实战中踩过的坑排查链路与解决方法5.1 边界区域等值线异常外扩有一年做某河流域的土壤重金属分布调查采样点沿河分布形成了一个狭长的条带。我在Surfer里生成Kriging等值线时发现河流两侧的等值线异常外扩形成了大片的扇形区域看过去完全不符合实际情况。排查过程是这样的我先检查了数据分布确认采样点坐标没有错误然后回到Surfer的网格化设置勾选了Blank选项并加载了河流流域的BLN边界文件重新生成网格。结果等值线依然外扩。后来我意识到问题出在BLN边界与采样点分布的不匹配——BLN边界范围远远大于采样点的实际覆盖范围导致插值时边界区域的权重信息不足Kriging在没有数据支撑的区域会倾向于把表面拉平表现为等值线大幅外扩。最终解决方法是把BLN边界修改为采样点外扩一定缓冲距离后的范围而不是直接使用整个流域边界。具体操作是在Surfer里新建一个BLN文件将采样点的最外边界外推500米作为网格化时的Outer Boundary然后再叠加流域边界出图。这样生成的等值线既不会冲出采样点的信息范围又保证了研究区边界内的数据覆盖完整。5.2 等值线穿越异常区域的处理另一个常见问题是当研究区内存在障碍物如采矿塌陷区、污水处理厂、大型水体时等值线不应该穿越这些区域但软件不会自动识别这些断裂带。遇到这种情况我的做法是在Surfer中利用Breakline断裂线功能。将障碍区边界作为断裂线导入参与网格化运算。Grid Data的Advanced Options中有一个Breaks选项卡可以加载断裂线文件.bln格式指定其为硬断裂这样插值表面会在断裂线两侧产生不连续的变化等值线也会在障碍区边缘断开不再穿越。这个方法在处理有断层、河流、道路等线性障碍的数据时非常有效。比如做地下水位等值线时如果有断层带作为阻水边界必须加入断裂线才能模拟真实的水文地质条件。5.3 投影冲突导致的图形错位还有一次在ArcGIS里把等值线叠加到底图上时等值线形状完全正确但和底图的位置偏差了好几公里。排查了半天才发现问题是Surfer导出Shapefile时坐标值确实是投影坐标但我在ArcGIS中定义坐标系时误选了WGS84地理坐标系导致ArcGIS用地理坐标来渲染投影坐标的数据图形自然就错位了。解决方法很直白先在ArcGIS中右键点击图层 → Properties → Source选项卡查看数据源显示的坐标单位和范围判断数据的真实坐标系再在Define Projection里定义正确的坐标系。如果已经定义了错误的坐标系就先用Define Projection改回正确的再用手动方式检查数据范围是否与底图匹配。这里也提醒一个易错点Define Projection和Project工具的区别一定不能混淆。前者只是告诉ArcGIS这个数据是什么坐标系不改变实际坐标值后者是坐标转换改变实际坐标值。如果数据本身已经有正确坐标值你只是没告诉ArcGIS它是什么坐标系用Define Projection如果是数据坐标本身需要从WGS84转到UTM用Project。搞反了就会出现坐标值大幅变化、数据跑到非洲的情况。5.4 等值线重叠与断线问题在Surfer里看等值线很正常导出到ArcGIS后却发现局部区域等值线重叠、交叉或者断线。这个问题主要出在网格分辨率设置不当和等值线间距太小上。我之前处理一组高程数据时网格设置成800行×800列等值线间距2米结果在陡峭地形区域等值线完全重叠在一起ArcGIS里看过去一片黑。后来把网格降到400行×400列并把等值线间距调大为5米问题就消失了。如果有局部区域确实需要更精细的等值线间距但整体又不想变密有一个变通方法在Surfer中采用Small Scale的网格化方式把整个研究区分成若干个区块每个区块分别插值并生成等值线最后再在ArcGIS中合并。这个方法比较繁琐但能有效避免重叠断线适合对局部精度要求极高的项目。6. 制图输出的细节打磨与协同配合6.1 ArcGIS中的符号化与标注优化等值面和等值线进入ArcGIS后制图效果的优化是关键环节。我个人习惯在ArcMap的图层属性中用以下方式调整等值面的色带选择如果是渐变型数据如降雨量、温度使用Classified分类显示色带建议用从浅到深的单一色系如浅蓝到深蓝不要用彩虹色彩虹色在学术出版中已经不太被接受。如果是离散型属性如土壤类型编码使用Unique Values逐类设色。等值线的标签控制在Label选项卡中用Placement Properties来避免标签重叠。ArcGIS 10.3的Maplex Label Engine非常好用在Labeling工具条上开启Label Engine为Maplex并在放置规则中选择Contour Placement标签会沿等高线方向排列效果非常专业。图例的精细调整图例不一定要放在布局的角落也可以根据等值面的分布调整位置。图例中的分类数量最好控制在5~7级太多则视觉混乱太少则丢失细节。这个在栅格分类时就要想好。6.2 Surfer与ArcGIS之间的数据往返注意事项在我做项目的经验里数据在两个软件之间的往返越少越好。每多一次导出和导入就多一次出错和精度损失的可能。我总结了一套单向流程尽量保证数据从Surfer只走一次数据整理 → Surfer导入原始数据 → 网格化插值 → 生成等值线 → 导出Shapefile → ArcGIS导入 → 定义坐标系 → 栅格化/分类 → 裁剪 → 出图。如果确实需要从ArcGIS反馈数据再回Surfer重新插值比如在ArcGIS中发现研究区边界需要调整不得不重新生成等值线也尽量只改变BLN边界和插值参数其他流程保持不变以此确保结果的可比较性。6.3 大批量数据的处理经验和性能建议最后聊一下数据量的处理。如果你的数据点有数万个甚至更多Kriging的计算速度会变得非常慢。我实测过4万个点做Kriging网格化设置500×500的网格在普通办公电脑上运行可能要20分钟左右如果是更复杂的变差函数模型可能要半小时以上。如果遇到这种场景有两个优化方向一是数据抽稀在保持空间分布的前提下按网格随机抽选一部分点参与插值比如选1/3到1/2的点通常能保留绝大部分空间结构信息同时显著缩短运算时间二是分块插值将研究区划分成多个重叠的区块每个区块分别插值后在Surfer中使用Mosaic功能拼接但区块重叠区域容易产生接缝痕迹需要后期平滑处理。ArcGIS那一侧如果数据量大主要瓶颈在栅格转等值面的速度。这里记得在运行工具之前先在Geoprocessing → Geoprocessing Options中开启后台处理Background Geoprocessing这样你还能继续操作界面不至于干等。另外输出的栅格数据尽量存储为GRID格式或TIFF格式不要存为地理数据库栅格后者在后续读取时速度明显慢于文件型栅格。这种Surfer插值 ArcGIS出图的组合核心思想是用合适的工具处理合适的环节。做插值分析时不要纠结哪个软件更高级能用最稳定、最高效的方式得到正确结果才是唯一标准。我自己在这条流程上踩过不少坑写出来也是希望大家少走弯路。如果你在操作中遇到其他问题先别急着怀疑数据多数情况下是网格参数或坐标系设置的问题——这两个地方多花点时间检查比什么都管用。