
刚接触流场图的人最容易卡住的地方不是“画”这个动作而是数据。流场图这东西看着高端本质上就是把你手上的一堆“哪个位置、哪个方向、哪个速度”的数据用图形方式变成一眼能看懂的方向和强度。ArcGIS 在这件事上最大的优势是数据组织、空间插值、符号渲染、制图输出可以一条龙做完不需要在 Excel 和绘图软件之间反复横跳。这篇文章会从数据准备讲起手把手把箭头流场图的完整流程过一遍再补充连续流线的进阶做法适合刚入门 GIS、又被导师或甲方扔来一套风场数据/洋流数据的朋友。1. 在动手之前先搞懂流场图到底画的是什么1.1 流场图不是一张图而是一类表达流场图的范围很宽气象上叫风场图海洋上叫流场图环境里还会用来表示污染物的输运路径。它表达的是“矢量场”也就是空间中每个点都有一个大小和方向。在 ArcGIS 里你可以把它画成一组箭头也可以画成光滑的流线还可以叠加到遥感影像或底图上形成综合分析图。做这类图之前我建议你先想清楚一个问题你要的是“箭头风场图”还是“流线图”这两者看起来差不多但实现逻辑完全不同。箭头图相对简单它本质上是“点图层 特殊符号渲染”不需要额外扩展模块用 ArcMap 就能做。流线图则是通过追踪整个矢量场生成的线如果只靠 ArcMap 自带功能会比较麻烦通常需要 ArcGIS Pro 的影像分析扩展或者借助 Python 脚本辅助。数据层面流场图最经典的数据结构是 U/V 分量。U 代表东向分量正值表示朝东负值表示朝西V 代表北向分量正值表示朝北负值表示朝南。网上下载的风场或洋流数据比如 NC 文件、GRIB 文件、CSV 导出数据绝大多数都是拆成 U/V 两个字段给你的。不要把这两个字段直接拿来画图你需要先把它换成人能理解的方向和速度。1.2 U/V 分量怎么换算成方向和速度做箭头图的第一步永远是先算两个字段速度大小和方向角度。速度很简单就是向量的模长speed sqrt(u² v²)方向稍微绕一点。我们常说的“角度”有两种一种是数学里的反三角函数角度从东边开始逆时针转另一种是 GIS 里常用的“地理方位角”从北开始顺时针转正北是 0 度正东是 90 度。ArcGIS 在符号旋转时默认支持地理方位角所以我们需要把 U/V 算成“从北方向顺时针的角度”。计算公式是dir_deg atan2(u, v) × 180 / π如果结果小于 0再加上 360我用 Python 写法在 ArcGIS 字段计算器里通常会这样写import math def uv_to_dir(u, v): d math.atan2(u, v) * 180 / math.pi if d 0: d 360 return d举个例子某点的 U5、V0表示矢量朝正东方向这个公式算出来是 90 度。如果你直接把风向数据拿来并且你手上的角度含义是“风从哪个方向来”那就不能用这个结果直接画箭头需要再做一个(dir_deg 180) % 360的操作。这个细节非常容易踩坑后面我会单独再讲。1.3 完整工作流程预览不管数据多花哨用 ArcGIS 画流场图的流程基本是固定的准备数据CSV/TXT/NetCDF/栅格都行但必须包含坐标字段和 U/V 字段。把表格数据变成点要素使用“XY Table To Point”或“Display XY Data”。计算方向和速度字段至少得到一个方向字段和一个速度字段。在图层符号系统里设置箭头方向和大小的映射关系。根据需要做插值、裁剪、投影转换让图面更均匀。布局出图导出成能用的图片或 PDF。这个流程看起来不复杂但每一步都会有几个小坑。下面我把每一步拆开讲。2. 数据准备把表格变成 ArcGIS 能读懂的图层2.1 准备一份标准格式的 CSV 或 TXT很多时候你从气象网站或别人手里拿到的数据就是一个文本文件里面是长这样的一堆坐标lon,lat,u,v 120.5,30.2,4.5,1.2 120.6,30.2,5.1,0.8 120.5,30.3,3.9,-1.5我建议你拿到数据后先做三件事把表头改成简短的英文字段名比如 lon、lat、u、v别用中文也别带空格。检查字段类型坐标、速度都应该是数值类型不能是文本。检查缺测值。很多原始数据里会用 -9999、NaN 或空白表示缺测这些要先清理掉否则后面插值会算出离谱结果。这里的 lon/lat 可以是经纬度也可以是投影坐标。如果是经纬度后面要注意地图单位和制图投影的问题如果你用的是平面直角坐标直接在 XY Table To Point 里选择对应的坐标系。2.2 用 XY Table To Point 生成点要素在 ArcMap 里最快的办法是“文件 → 添加数据 → 添加 XY 数据”或者在 ArcToolbox 里找“转换工具 → 从 XY 表生成点”。选好 X 字段lon、Y 字段lat再把坐标系指定为 WGS84 或对应坐标系点确定就能生成一个临时的点事件。这里有个习惯一定要养成不要直接拿临时点事件去画图。临时事件表不会保存编辑符号设置、字段计算都可能出问题。正确做法是右键图层选择“数据 → 导出数据”把它导出一个真正的 shapefile 或要素类。如果用的是 ArcGIS Pro右键图层 → 数据 → 导出要素是一样的道理。导出之后打开属性表你应该能看到 lon、lat、u、v 四个字段这就说明数据已经被 ArcGIS 真正接住了。2.3 散点数据如何变成规则格点如果你的数据本来就是一个个离散站点比如气象站、浮标、监测点位点位分布稀稀拉拉直接画箭头会出现“有的地方挤成一团有的地方大片空白”的情况。这种情况下我建议先做一步插值把散点变成规则格点。具体做法是把 U 分量和 V 分量分别做插值生成两个栅格。工具在“Spatial Analyst 工具 → 插值 → IDW 或克里金”。用“数据管理工具 → 采样 → 创建渔网”生成规则格网格网范围覆盖你需要的制图区域格网间距根据你图纸比例尺来定。在渔网中生成格网中心点。用“Spatial Analyst 工具 → 提取分析 → 提取多值到点”把插值后的 U 栅格和 V 栅格的值提取到格网中心点。让格网中心点继承 U、V 值再计算方向、速度使用符号系统画箭头。为什么不能直接对速度或方向插值因为方向是个环形变量0 度和 360 度其实是一个方向直接插值会在正北附近出现一条“假的高梯度带”你会看到箭头方向在某个很小的范围里突然转一圈图面像撕裂一样。U/V 分量是连续变量对它们分别插值再反算方向就能完美避开这个问题。插值方法的选择上IDW 计算快、容易出“牛眼”适合站点较密的区域克里金更平滑但参数设置多适合数据质量较好的科研用途。如果你只是为了快速出图看趋势先用 IDW 完全够用。3. 核心实操用符号系统画出箭头流场图3.1 先给图层加方向字段和速度字段数据点准备完成后下一步就是计算字段。建议先添加两个双精度字段一个叫 speed一个叫 dir_deg。然后在字段计算器里用 Python 语法计算。速度字段的表达式math.sqrt(!u! ** 2 !v! ** 2)方向字段的代码块import math def uv_to_dir(u, v): d math.atan2(u, v) * 180 / math.pi if d 0: d 360 return d表达式里写uv_to_dir(!u!, !v!)注意这里算出来的是“流向”也就是箭头指向哪个方向。如果你手里的字段本身就是风场并且你希望箭头的指向是“风往哪吹”那就不用再转了。可如果你更习惯看气象里的“风的来向”并且后续要画风羽图而不是流场箭头就要再加一个字段用这个公式def uv_to_met_dir(u, v): d math.atan2(u, v) * 180 / math.pi if d 0: d 360 return (d 180) % 360我见过很多人把这两个概念混着用结果图上的西风箭头指向了西边。记住一个简单判断标准流场图关心“流到哪”气象风羽图关心“从哪来”。画箭头流场图就用uv_to_dir画风羽图或读气象风速术语时才用uv_to_met_dir。3.2 设置箭头样式、旋转角度和大小算好字段后右键图层 → 属性 → 符号系统。这里有两种常见的做法第一种使用“数量 → 比例符号”让箭头大小跟着速度变化再用旋转字段控制方向。具体操作是在符号系统里选择“数量 → 比例符号”。值选择 speed。点击“高级”按钮打开“旋转”设置。旋转字段选择 dir_deg旋转样式选择“地理”。符号选择箭头类符号比如“ESRI Arrow”。这里关键的坑在旋转样式。ArcGIS 提供了“算术”和“地理”两种旋转样式。“算术”是从东方向开始逆时针计算角度适合数学坐标系“地理”是从北方向开始顺时针计算角度适合地图方向。我们上面算出的 dir_deg 是 0 度为北、顺时针增加因此必须选“地理”。如果你发现所有箭头都朝一个方向不对先检查是不是旋转样式选错了。第二种做法更精细使用“数量 → 分级符号”按速度把箭头分几个等级每级设置不同颜色和大小。等级少的图例更清爽适合 PPT 汇报等级多的图信息量大适合科研论文。具体分级方式可以用自然间断点法也可以用分位数根据你的数据分布来选。箭头大小的设置也要有度。如果所有箭头都按真实比例缩放小风数据可能小到看不清。我的经验是先以速度中位数或平均值的箭头大小为标准把符号调到图上约 0.3 到 0.5 厘米再让最大值控制在 1 厘米左右。实际操作中可以在“比例符号”的“背景”里设定参考单位或是在分级符号里手动修改各级大小。3.3 用格网点画图时如何避免箭头叠成一团数据点如果太密箭头会互相压盖图面一团糟。即使你做了规则格网点如果网格太细也照样叠。这时有几种处理办法调整渔网间距让格网密度和图面比例尺匹配。比如 1:100 万的图格网间距 0.5 到 1 个经纬度就够了要是 1:10 万的图可以适当加密。使用随机抽样或按字段选择一部分点不把全部箭头画上去。制图讲究的是表达趋势不是把每个数据都摆出来。增加符号透明度和箭头内部填充色减少视觉拥挤感。还有一个制图小技巧可以把箭头符号分成两层外层用白色描边内层用主色这样即使有轻微压盖箭头轮廓也不会糊在一起图面会干净很多。3.4 把图做成能交付的样子出图时别直接在数据视图里截图。切到布局视图加上图例、指北针、比例尺再考虑加一个经纬网或公里网。图例标题建议写清楚“风矢量(m/s)”或“流速(cm/s)”避免别人看图时还得猜单位。导出格式方面科研用途建议导出 PDF 或 EPS矢量格式后期还能编辑PPT 或网页展示可以导出 PNG分辨率至少 300dpi。ArcMap 里在“文件 → 导出地图”中设置ArcGIS Pro 在“共享 → 导出布局”中设置。4. 进阶连续流线图怎么做4.1 箭头图与流线图的区别箭头图是“离散抽样”每个箭头的方向和长短代表该点的流场流线图则是“连续追踪”线从起点开始顺着流场方向延伸可以表现出流线弯曲、汇聚和发散的趋势。两者各有优劣箭头图数据含义清晰适合定量表达流线图视觉更顺滑适合大尺度环流或洋流展示。ArcMap 本身没有一个直接叫“流线图”的工具很多人想做流线图时会卡住。如果你有 ArcGIS Pro 且安装了影像分析扩展可以直接找工具箱里的 Wind Streamline 工具这个工具专门用来从栅格化的速度场生成流线。基本思路是先把 U/V 栅格转成速度栅格和方向栅格再让工具沿着方向追踪流线。4.2 用栅格计算器准备流线工具需要的输入如果你没有现成的 U/V 栅格只有一个点图层可以通过插值生成。顶一步操作完你可以得到 U 栅格和 V 栅格。然后在栅格计算器里做两步速度栅格SquareRoot(Square(u_raster) Square(v_raster))方向栅格假设方向是从北顺时针的角度180 / 3.14159265358979 * Atan2(u_raster, v_raster)计算完以后如果栅格像元值有负数再用条件函数把小于 0 的值加 360。具体到不同 ArcGIS 版本栅格计算器语法会略有差异建议在文本框里先小范围试算再去验证输出值的范围。有了速度和方向栅格就可以打开 Wind Streamline 工具选择对应的栅格设置起始点密度、流线最大长度、平滑度等参数。工具说明里一般会要求你选择角度单位是弧度还是度一定和你栅格计算时的单位保持一致否则流线会乱成一团。4.3 没有影像分析扩展时怎么办如果手头只有 ArcMap 或没有扩展授权还有一个比较灵活的办法用 Python 生成流线轨迹再导入 ArcGIS 成线要素。原理很简单就是从一个种子点出发按照 U/V 方向反复迭代推进一小段距离把走过的点连成一条线。这一步可以用 SciPy、matplotlib 的 streamplot 甚至一个几千行的 Python 脚本实现。生成轨迹后再用 ArcPy 的要素写入接口把轨迹点数组转成 Polyline 要素类。我经常用这个办法做洋流路径虽然代码量多一点但完全可控也比扩展工具更灵活。如果你不熟悉 Python还有一个“土办法”把方向栅格的值作为旋转角度把箭头符号做成细长线状然后把箭头密度调到很密视觉上也能模拟流线效果。这个方法精度一般但胜在快放在项目汇报里完全够用。5. 高频问题与避坑指南5.1 常见问题速查我把实际画图过程中经常遇到的问题整理成了表格你在排查时可以对照着看现象常见原因解决办法所有箭头方向一致且不像实际流场旋转字段选错或者旋转样式选成“算术”换成 dir_deg旋转样式选“地理”箭头指向和常识相反方向公式用错把“来向”当成了“去向”确认是要画流向还是风向用对应公式箭头大小没有区分度速度字段类型为文本或符号比例设置不当检查字段类型调小最小值或调整比例大片区域没有箭头缺测值未处理或插值后提取到空值先清理 -9999/NaN再检查提取结果箭头方向在某个区域突然乱转直接用方向插值0/360 断裂改用 U/V 分量分别插值后反算方向导出图片后线很糊分辨率低或符号太细设 300dpi加粗箭头轮廓图例显示的都是小数但想显示整数图例格式没设置在图例属性里调整小数位数5.2 坐标系统和投影方向的问题流场图最容易出现系统性错误的地方就是坐标系统。如果你的数据是经纬度而底图用的是墨卡托投影在高纬度地区箭头方向会明显偏转。因为 U/V 分量是定义在地理坐标的东/北方向上的地图投影后正东正北方向本身就被投影曲线扭曲了。我的处理习惯是先确定制图区域选择适合该区域的投影坐标系把点要素投影后再计算方向和速度或者至少在出图前再投影一次。对于大范围的天气图常用等距圆锥投影或极地立体投影对于海洋洋流等距圆柱投影也常见。你要保证最终箭头“看起来”和底图方向一致。实际工作中如果数据范围不大影响可能不明显但一旦范围跨几个省甚至半球方向偏差就很严重。5.3 关于流场图制图的一些个人习惯最后分享一个我自己的制图习惯。每次拿到流场数据我不会马上画图而是先画一张“速度分布图”看看整体量级再决定箭头符号的颜色分级方式。很多人的流场图不好看不是因为软件操作不对而是因为速度分布极不均匀比如中心一个大值周边全是小值这时候如果按线性分级周边箭头会全部小到看不见。遇到这种数据我一般会先取对数或者用分位数分级尽量让图面不同区域都有可读的箭头。如果时间充裕我还会给箭头图层加一个透明度较高的速度填色背景一般是以速度栅格为底图做半透明渲染再叠加黑/白色箭头。这样读图的人既能看出大尺度速度分布又能看清局部流向比单纯画一层箭头实用很多。做环境评估或环流分析时这种“底图等值面 上层流线/箭头”的组合也是很多行业报告的常见版式。你要是也经常被要求出这类图不妨早点把这个模板固定下来后面做同类项目能省一半时间。