ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ArcGIS流场图绘制全攻略:从U/V分量到箭头符号化

ArcGIS流场图绘制全攻略:从U/V分量到箭头符号化 干这一行的人应该都有过这种经历拿到一套海洋或者气象的 U、V 分量数据比如某个海区的海流数据或者某片区域的风场数据领导丢过来一句话——“把这图画出来看看”。你以为很简单不就是画个箭头嘛结果打开 ArcGIS 一折腾箭头要么乱指要么长短不分要么密到糊成一片。最后还得硬着头皮用 AI 描半天做出来的图还被人说“不够专业”。其实用 ArcGIS 画流场图这件事核心套路就那么几步只是很多教程要么只讲“怎么做”不讲“为什么这么做”要么给了一段字段计算器代码就让你自己悟。这篇我来把从数据准备、角度换算、符号化到出图的全过程拆开揉碎讲一遍包括我踩过的坑和一些常规文档里不会写的细节。不管你是 ArcMap 10.x 的老用户还是已经转到 ArcGIS Pro原理都是通用的照着做就能出图。1. 先想清楚你要的流场图是哪种“场”我见过不少新手一上来就到处找“流场图工具”结果找半天没找到然后跑来问我。问题往往出在第一步就没搞清楚你要画的到底是哪种流场图。1.1 网格箭头图与流线图的区别最常见的需求是“网格箭头图”就是在研究区域内按一定间隔布上点每个点上画一个箭头箭头的朝向表示流向箭头的长短或颜色表示流速大小。这种图做起来最直接适用于表达某一时刻、某一层次的速度场分布比如海表流场、某个高度的风场。如果你手上已经有 U、V 分量这种图用的就是最经典的做法算角度、算大小、然后符号化。另一种是“流线图”也就是从一系列种子点出发沿着流场方向延伸出平滑曲线的轨迹图。流线图更像“流体真的在动”的感觉适合展示流场的整体走势和路径比如大洋环流、季风轨迹。ArcGIS 里也有对应的工具可以生成但它的数据要求、参数设置和箭头图不太一样我后面单独用一章说。1.2 数据形式决定你的工作量第二个要确认的是数据本身的形式。同样是 U、V 分量有的数据是 NetCDF 或者 GRIB 格式的栅格有的则是带经纬度和 U、V 字段的文本 CSV还有的是已经做好了的点要素类。如果是 NetCDF/GRIB 栅格需要先用“多维数据”相关工具把 U、V 提取成普通栅格再转成点。如果是 CSV/Excel直接“添加数据”导入 XY 生成点要素然后投影到合适的坐标系。如果已经是点要素类那就省事很多直接跳到角度计算和符号化。我常用的办法是不管原来是什么格式最终全部统一成“带投影坐标和 U、V 属性字段的点要素类”。这样做的好处是后面每一步操作都能复用同一套流程换数据以后直接套用。2. 数据准备从 U、V 分量到可计算的点要素这个阶段是最无聊但也是最重要的很多人在这一步偷懒后面全盘崩。下面按最常见的几种情况分别说。2.1 从 NetCDF 栅格提取 U、V 并转点海洋和气象数据里 NetCDF 非常常见用 ArcGIS 处理时有两个思路。一个思路是直接用“多维工具”里的“创建 NetCDF 要素图层”然后把 U、V 变量提取出来。这个工具的好处是比较快但它在坐标系处理上经常不太听话如果你对 ArcGIS 的多维数据处理不够熟很容易得到一堆乱码一样的属性表。另一个思路是我更推荐的“朴素”做法用【栅格转点】把每个像元转成点。操作路径是【ArcToolbox】→【转换工具】→【从栅格转出】→【栅格转点】。这里有个关键细节如果 U 和 V 是两个单独的栅格你需要分别对它们做一次转点然后用【空间连接】或者【连接字段】把 V 值关联到 U 的点上。更简单的方式是先把 U、V 两个栅格用【复合栅格】或者直接【栅格计算器】合成一个多波段栅格再转点这样一次就能把两个值都带出来。2.2 从文本 CSV 生成点要素并投影如果你拿到的是一张 CSV 表里面是经纬度、U、V 三列操作就分两步用 ArcMap/Pro 的“添加数据”直接选中 CSV 文件右键选“显示 XY 数据”X 字段选经度Y 字段选纬度坐标系按数据的实际地理坐标系填通常是 WGS84。右键生成的事件图层 →【数据】→【导出要素】存成点要素类。这里要特别强调一点导出之后立刻做投影。为什么因为流场箭头的方向对投影变形极其敏感。经纬度坐标系在不同纬度上 X、Y 方向的比例是不一样的如果你直接拿经纬度去算箭头角度在赤道附近可能看不出来到了高纬度地区箭头方向能偏出十几度去这在专业图件上是不能接受的。一般建议选择研究区域所在的合适投影坐标系比如中纬度区域用阿尔伯斯等积圆锥投影或兰伯特等角圆锥投影沿海局部区域可以用 UTM 投影。局部小范围图其实用高斯-克吕格或 UTM 都行关键是要保证箭头方向和实际地理方向一致。2.3 先搞清楚你的 U、V 到底是什么方向这是整个流程中最容易出错、但最容易被人忽略的一点。不同学科对 U、V 分量的定义习惯不同在海洋学里通常 U 是东向分量正值朝东V 是北向分量正值朝北u、v 合成后指向流去的方向。在气象学里U 也通常是纬向风正值代表西风即空气自西向东运动V 是经向风正值代表南风即空气自南向北运动。但是也有一些数据集用了特殊约定比如把 V 定义为向北为正或者把风向定义为“来向”而不是“去向”。这特别容易搞混。我的习惯是拿到数据后先在属性表里手动看几行——找一个“明显应该向东流”或者“明显应该向北流”的样本点计算一下 atan2(U,V) 之后箭头应该指的方向先验证约定再开始批量处理。千万别假设所有数据的 U、V 约定都一样。3. 方向角度计算这一步绝不只是在字段计算器里写个 atan2角度计算是画流场图的核心也是最容易翻车的地方。很多人知道要算角度但不知道 ArcGIS 的符号系统里“角度”有数学角度和地理角度之分直接用错箭头就会整体旋转 90 度或者方向反掉。3.1 数学角度、地理角度与 ArcGIS 符号角度的关系首先明确三个角度的概念角度类型0 度方向旋转方向典型用途数学角度正东X 轴逆时针为正math.atan2 的返回值地理角度正北Y 轴顺时针为正罗盘、气象风向ArcGIS 算术角度正东X 轴逆时针为正符号旋转“算术”选项ArcGIS 地理角度正北Y 轴顺时针为正符号旋转“地理”选项如果你用 Python 的 math.atan2(V, U) 算方向得到的是正东为 0 度的数学角度。这个值可以直接用在 ArcGIS 符号系统的“按角度旋转”里前提是你把旋转类型选成“算术”。如果你习惯用“地理”角度很多教程默认都是地理角度就需要换算一下地理角度 (90 - 数学角度) mod 360别问我怎么记住这条公式的我当年是画了一张坐标图把四个方位都列出来才搞明白。这里我也建议你有耐心的话画一下一个平面直角坐标系X 轴朝东Y 轴朝北数学角度逆时针增加而地理角度顺时针增加两者其实是对同一个方向的不同度量。数学角度 90 度对应正北地理角度 90 度对应正东这么一对就清楚了。3.2 字段计算器里的完整 Python 表达式假设你的点要素类里已经有 U、V 两个字段现在添加一个 DOUBLE 类型的字段 Angle然后在字段计算器里用 Python 解析程序写import math # 计算流向的数学角度范围 -180 到 180 math.atan2(!V!, !U!) * 180 / math.pi但这样得到的角度有正有负符号化时可能出现角度为负数而在旋转显示上出错的情况稳妥做法是再添加一步把角度统一转到 0–360 之间。可以用import math deg math.atan2(!V!, !U!) * 180 / math.pi if deg 0: deg 360 deg如果你打算用“地理”角度来旋转符号那就不要用上面这段而是把它再转一次import math deg math.atan2(!V!, !U!) * 180 / math.pi if deg 0: deg 360 geo_deg (90 - deg) % 360 geo_deg这一步做完后最快的验证方法是找一个 U1、V0 的点如果用的是算术角度Angle 应该等于 0如果用的是地理角度Angle 应该等于 90。同理找一个 U0、V1 的点算术角度为 90地理角度为 0。直接看属性表就能判断你有没有用错公式。3.3 流速大小也要算出来别只顾着算方向流速大小同样重要。右键添加一个 DOUBLE 字段 Vel字段计算器写math.sqrt(!U! ** 2 !V! ** 2)这个值后面有两个用处一是作为箭头符号的缩放依据让箭头长的代表流速大二是作为分级渲染的依据把流速分成几个等级用颜色深浅表示。我强烈建议不要只靠箭头长短来表达流速因为制图输出后箭头长短在视觉上不够直观而且小流速区域几乎看不清。比较专业的做法是“长短 颜色”双重编码箭头的长度按流速缩放同时颜色也按流速分级。这样即便在黑白打印稿上也能靠箭头长短分辨大小。3.4 常见错误排查方向反了、角度错位、箭头乱转我在群里帮人看流场图时遇到的报错翻来覆去就这么几类方向全部反了比如实际应该向东的箭头指到了西。多半是 U、V 的符号约定和你理解的相反把其中一个取负即可“U 取负”或“V 取负”试一下基本能解决。整体旋转了 90 度几乎可以断定是数学角度和地理角度混用了。检查你的符号旋转类型设置和字段里存的角度是否配套。箭头乱转没有规律大概率是输入 U、V 时字段顺序搞反了或者字段计算器里 !U! 和 !V! 的位置写反了。这个在数据字段多的时候特别容易发生。角度看起来没问题但箭头还是不对检查一下点要素有没有投影。前面说过用经纬度直接算角度在高纬度区域方向会偏这个很难一眼看出但在同纬度带的多点对比时你会发现箭头方向在不同经度上“不整齐”这就是投影变形在作怪。4. 符号化把箭头摆正、摆对、摆好看角度算完流速大小也出来了接下来就是见真章的地方怎么把这些数值变成一张能看的流场图。4.1 设置箭头符号与旋转字段在 ArcMap 里右键图层 →【属性】→【符号系统】→【类别】选“唯一值 / 分级符号”等之后在【高级】→【旋转】里把角度字段选为你算好的 Angle旋转类型按你算角度时用的类型选“算术”或“地理”。在 ArcGIS Pro 里路径略有不同但逻辑一样选中图层 →【符号系统】→ 选择“箭头”相关符号 → 在【旋转】设置里选角度字段和旋转类型。这里有个很多教程不讲的细节ArcGIS 里用来画箭头的符号有好几种有的是线符号带箭头有的是点符号箭头。画流场图建议用点符号的箭头并且把“箭头符号方向”属性设置正确。你可以先不关联角度字段手动旋转一个符号看看它的“原始朝向”有些箭头默认朝东有些默认朝北。默认朝向不同即便角度字段算对了最终显示也可能偏了 90 度。解决办法就是把角度字段统一加或减 90 度补偿或者换一个朝向匹配的箭头符号。4.2 让符号大小跟着流速走箭头长度不能一成不变。在符号系统里可以基于 Vel 字段做比例符号但要注意比例符号是按某个固定值等比缩放的如果你的流速跨度特别大比如从 0.01 到 2.5 m/s直接等比缩放会导致大部分箭头都是针尖大个别地方又长到出格。我的做法是先把流速分成几个等级比如分 5 级极慢、较慢、中等、较快、极快然后每一级给一个箭头的长度区间再配合分级颜色。这样在视觉上既稳定又有层次感图例也好出。具体等级间隔可以用【符号系统】的“分级”自动分类也可以手动设置自然断点。如果是输出精度要求高的科研图不想要人工分级的主观性那就用“比例符号”加上最小和最大显示尺寸限制。多数制图软件都允许你设一个最小尺寸和一个最大尺寸避免箭头过小或过大。4.3 底图与配色让流场不“飘”在纸上流场图如果只有一片箭头再专业也显得没根基。通常需要叠底图常见做法是加载陆地多边形数据把陆地填成浅灰色海洋部分留白或淡淡的天蓝色。加上海岸线和等深线会让流场图有“海洋”的语境。如果是对照分析再叠加地形晕渲作为背景。配色上箭头本身建议用高对比度的颜色。最常见的搭配是深色底图/浅色箭头或者浅色底图/深色箭头。如果你用流速分级色带推荐蓝→青→黄→红这样的序列低流速冷色调高流速暖色调符合一般人的认知。另外提醒一句如果你用了在线底图比如加载天地图或者影像图务必检查一下出图时的坐标系是否已经正确投影。在线底图默认是 Web 墨卡托投影在纬度较高的区域箭头角度会被拉伸变形专业出图时不要让底图数据流直接用 Web 墨卡托要统一投影到目标坐标系里。4.4 箭头太密怎么办渔网抽稀与最近点采样实际数据往往分辨率很细转出来的点要素可能有几十万个直接全部符号化结果就是一团黑。这时候必须做抽稀。我试过几种方案最稳定的是用【创建渔网】工具生成一套间距合适的网格点然后用【提取多值到点】把原始点到网格点的 U、V 值插值提取出来或者用【空间连接】把网格点范围内的原始点做平均。操作上可以这样确定你的研究区范围用【创建渔网】生成格网渔网的像元大小建议根据最终输出比例尺决定比如 10 公里网格。对网格中心点要素和原始 U、V 点做【空间连接】连接操作选“平均值”。或者用插值工具把 U、V 分别插值成栅格再用【多值提取到点】把网格点提成属性。这里要特别提醒如果是用空间连接求平均值一定要确保落入每个网格内的点数足够多如果网格很小而原始点很稀疏会出现大量空值网格需要后续过滤清理。如果研究区内点位分布不均我建议先用插值生成规则栅格再做抽稀得到的箭头分布会更均匀好看。5. 进阶玩法用栅格流线工具画出真正的流线轨迹箭头图适合表达“某个时刻、某个面上”的速度分布但如果你想展示流场整体走势比如大洋环流那种一根根长曲线就需要流线图了。ArcGIS 里生成流线图核心是 Spatial Analyst 的“流线”工具。5.1 流线工具的原理与输入要求这个工具的逻辑是你先准备一个“流向栅格”每个像元的值表示该处流体运动的方向然后给定一批种子点工具从每个种子点出发沿着流向栅格逐步追踪直到到达边界或满足停止条件最后生成一条条线要素。它本质上是一个数值追踪算法很像在地形图上沿最陡坡方向画水流线。但注意这里的“流向栅格”并不等同于水文分析里的 D8 流向栅格。水文 D8 流向只允许 8 个方向用于流场会非常粗糙。更专业的做法是准备一个以角度值表示的连续方向栅格0–360 度并配合流速作为追踪的权重要素。实际操作上我一般这样构造用 U、V 两个栅格做栅格计算器运算生成方向栅格# 输出单位为度0 为东逆时针为正 (180 / math.pi) * atan2(V, U)处理无效区域如果流速太小或数据缺失方向栅格那里的值没有意义需要把这些像元设为 NoData。用【栅格计算器】Con(Vel 阈值, 方向栅格, NoData)用【创建随机点】或【创建渔网】生成种子点种子点相当于流线的起点。运行【流线】工具输入方向栅格、种子点设置最大追踪长度可以理解为限制流线最长多少像元或多少公里生成线要素。对生成的线要素做平滑处理然后按平均流速做分级符号化。需要注意ArcGIS 对流线工具的输入栅格类型有严格约定不同版本对“流向”的定义可能不同。我建议你在第一次跑通前先用一个简单的模拟数据测试手工构造一个方向全部朝东的栅格看看生成的流线是不是全部水平往东。如果方向不对就去检查方向栅格的单位是弧度还是度以及 0 度方向的定义。5.2 把流程做成模型构建器换数据直接重跑流线图制作最烦的不是跑一次而是反复调参种子点密度、最大追踪长度、平滑尺度每改一次参数都要全流程重来一遍。所以等你把参数调得差不多了花 10 分钟把整个流程用模型构建器串起来是非常值得的。我的模型一般包含这么几步【创建渔网】生成种子点。【栅格计算器】用 U/V 合成方向栅格。【栅格计算器】用流速阈值过滤掉无效像元。【流线】生成轨迹线。【平滑线】做制图优化。输出到指定数据库。这样下次拿到同一区域的新时间数据只需要替换输入栅格整个模型自动跑完能省下大量重复劳动。要是你还想输出不同时间段的多张图再把模型套进循环里批量出图也不是问题。6. 制图输出时最容易被忽略的细节图做好了不等于能直接交差。以下这几个细节是我在最终出图时反复栽过跟头之后总结出来的每一个都能让成图效果差出一截。6.1 同一套数据换了个范围箭头方向怎么又变了很多人遇到过这个问题在 A 区域画箭头一切正常换到 B 区域后箭头看起来歪了。这通常是投影坐标系在“不同位置”的变形特征不一样。任何地图投影都不能完全保持所有区域的方向完全正确在中纬度用兰伯特等角圆锥投影局部范围方向变形很小但你一旦把显示范围放大到全国甚至全球同一个投影在不同纬度的方向变形就体现出来了。解决办法不是某个技巧而是“明确制图范围再选投影”。我的经验是省级及以下尺度的局部流场图用 UTM 或者其他高斯类投影方向基本没问题大范围比如整个南海或者整个太平洋的流场图要选择适合该区域的等角投影并在图例或说明里注明投影参数避免误读。6.2 地图整饰里的指北针和图例最容易误导人流场图上用的“角度”是地理角度还是投影平面角度很多人不关心但在地图整饰时这个问题会被放大。当你在 ArcGIS 里摆放一个指北针它表示的是“正北”方向如果你的流场角度是在某个投影坐标系下计算的那指北针也要对应到该投影的真北方向。好在多数局部图中投影北和真北偏差很小但当范围很大时你最好放一个网格北向或角度校正说明。图例方面如果你用了分级符号表达流速图例里要清楚标明每一级对应的流速区间和箭头长度代表的意思不要让读者自己去猜。如果是多时间层叠放出来的流场还要在图名和说明里写清楚是哪个时间、哪个深度/高度的流场。6.3 导出图片时别为了省空间牺牲分辨率ArcGIS 默认导出图片分辨率有时候会很低尤其当你用“复制图形”方式粘贴到 Word 里图一压缩就糊了。我的建议是使用【导出地图】功能格式选 TIFF 或 PNG分辨率设到 300 DPI 以上。如果涉及矢量符号箭头导出 PDF 或 AI 格式效果会更好放大后也不会变虚。导出前先把布局视图里图层的显示范围开到最后输出状态避免图例和内容比例失衡。6.4 选择合适的渔网间距和箭头缩放最后一条经验是关于“密度 vs 可读性”。很多人在箭头图上纠结半天其实核心就是渔网格间距和箭头长度之间的比例关系。网格间距大、箭头短图是清爽但信息量明显不足网格间距小、箭头长图又密得没法读。我目前用的一个比较稳定的经验值是渔网间距取箭头平均长度的 2 到 3 倍。比如研究区平均流速对应的箭头长度大约 15 公里在制图比例尺下那渔网间距就取 30 到 45 公里。这样既能看到流场的空间变异性又不会糊成一片。具体数值还是看你的数据尺度但“箭头长度和网格间距之间留出空隙”这个思路是通用的。画流场图这件事说到底就是把一组数值转成能被眼睛直观理解的空间语言。第一个图可能要多折腾几轮角度和符号设置但只要你把投影、角度约定、抽稀密度这几件事想明白了后面哪怕是换一套完全不同的数据也就是替换字段名称和参数量级的事。我在实际工作中把这一套流程固化下来之后做一张标准流场图基本控制在十几分钟内。希望这篇能把你在 ArcGIS 里画流场图的路再铺平一点。
返回列表