news 2026/10/5 1:04:33

m_map绘制地形水深图:MATLAB海洋数据可视化完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
m_map绘制地形水深图:MATLAB海洋数据可视化完整指南

刚接触海洋数据处理的时候,很多人第一步就卡在"怎么把地形水深数据画成一张像样的图"上。直接用MATLAB自带的pcolor、contourf画经纬度网格,出来的图要么海岸线缺失,要么经纬度变形严重,要么投影一塌糊涂。后来我换成了m_map工具箱,彻底解决了这些问题。m_map是海洋科学和大气科学领域用得最广的MATLAB地图绘制工具包,专门用来处理带经纬度坐标的空间数据,从地形水深图、海表温度图到航迹叠加图,一套代码逻辑可以通吃。这篇博文就围绕"用m_map画地形水深图"这条主线,从数据准备、工具箱配置到完整绘图流程,把每个关键步骤和坑点都拆开讲清楚。

1. 为什么画水深图要选m_map而不是MATLAB自带函数

1.1 MATLAB自带绘图的三个老大难问题

很多人一开始都是这么干的:拿到lon、lat、depth三个变量,直接pcolor(lon,lat,depth)或者contourf(lon,lat,depth),然后发现图出来不对味。问题主要集中在三个方面。

第一,投影变形。地球是个球面,而绘图区域是平面,如果直接把经纬度当作平面坐标去画,高纬度地区的东西向距离会被严重拉长。比如画北纬60度以上的海域,直接用pcolor画出的图,看起来一个网格是正方形,实际在地球上东西方向距离只是南北方向的一半。这种变形对于定性看图可能影响不大,但一旦要叠加航迹、测站、等深线,问题就很明显。

第二,海岸线缺失。MATLAB自带的worldmap函数也能画海岸线,但它的海岸线数据分辨率较低,放大到局部海域后,岸线轮廓非常粗糙,很多岛屿细节直接消失。

第三,坐标轴与图框控制太麻烦。用pcolor画完以后,想让经纬度刻度变成度分秒格式,或者让图框变成自己想要的形状,MATLAB原生功能能实现但步骤繁琐,而且不同版本兼容性一般。

1.2 m_map到底解决了什么

m_map是一套基于MATLAB的地图投影工具箱,核心思路是"先设定投影和区域范围,再把所有空间数据通过投影变换绘制在图上"。你不需要自己关心投影公式怎么算,只需要告诉它你用哪种投影、想画哪个经纬度范围,它会把海岸线、等深线、数据网格全部统一投影到目标坐标系里。

和MATLAB自带的Mapping Toolbox相比,m_map最大的优势是免费、轻量、社区成熟。Mapping Toolbox虽然功能更强,但需要额外购买授权,很多课题组并没有安装。m_map体积小,解压即用,只需要把文件夹加入MATLAB路径。在海洋科学领域,大量公开发表的论文附图都是用m_map画的,这意味着遇到问题很容易搜索到解决方案,这一点在实际工作中非常重要。

2. 数据准备:地形水深数据从哪来,怎么整理

2.1 常用的公开水深数据源

画水深图的前提是有数据。公开的全球地形水深数据主要有这么几个,我按推荐程度排个序。

GEBCO 2023 Grid是我最推荐的数据集,分辨率15弧秒,大约是450米左右,全球覆盖,陆地高程和海底水深都有。数据从GEBCO官网免费下载,输出为netCDF格式,包含elevation变量,正值代表陆地海拔,负值代表海水深度。这个产品更新及时,很多海洋研究都用它。

ETOPO1也是经典选择,有ice surface和bedrock两个版本,分辨率1弧分,全全球范围,文件相对小,适合快速出图。缺点是分辨率低一些,近岸细节不足。

**SRTM15+**是海底地形数据里分辨率较高的,约15弧秒,融合了卫星测高和船测数据,比较适合深海区域。不过它在极浅水区的表现不一定比GEBCO好。

如果你是做局部海域研究,比如某个海湾、某段陆架,还可以下载局地高精度数据,比如各个国家的海道测量部门发布的DEM产品。不过通用流程还是推荐GEBCO起步,后续按需替换。

2.2 从netCDF读取并裁剪数据

GEBCO下载下来是一个netCDF文件,用MATLAB读取非常简单。如果你没有netCDF相关工具箱,MATLAB基础环境就自带ncread和ncdisp函数。

% 查看netCDF文件的变量结构 ncdisp('GEBCO_2023.nc'); % 读取经纬度与水深变量 lon = ncread('GEBCO_2023.nc', 'lon'); lat = ncread('GEBCO_2023.nc', 'lat'); elev = ncread('GEBCO_2023.nc', 'elevation');

注意GEBCO的lon是从-180到180,lat是从-90到90,elevation是一个二维矩阵,第一维对应lon,第二维对应lat。读取后往往需要裁剪到你关心的海域范围,否则一个全球数据几GB,MATLAB处理起来会卡到怀疑人生。

裁剪的核心就是做索引筛选:

% 设定目标区域,以一片海域为例 lon_min = 2; lon_max = 12; lat_min = 56; lat_max = 60; % 找到对应索引 lon_idx = find(lon >= lon_min & lon <= lon_max); lat_idx = find(lat >= lat_min & lat <= lat_max); % 裁剪 lon_sub = lon(lon_idx); lat_sub = lat(lat_idx); elev_sub = elev(lon_idx, lat_idx); % 转置,让矩阵维度变成 (lat, lon),方便后续绘图 elev_sub = elev_sub';

这里有一个非常容易踩的坑:GEBCO的elevation矩阵维度是(lon, lat),很多人在裁剪之后忘了调整维度顺序,结果后面画图的时候发现矩阵尺寸对不上。我在代码里直接做了转置,统一变成(lat, lon),这样后面无论是pcolor还是contourf,参数的传入逻辑都清晰。

2.3 经纬度网格与坐标类型的统一

水深数据里的经纬度可能是double类型数组,也可能是single,这本身不影响绘图。但要注意网格的排列方向,有的数据lat是从北往南排的,也就是降序。这种情况下如果直接丢给m_map画图,出来的图上下颠倒,海岸线也对不上。

判断方法很简单:

% 判断lat是升序还是降序 if lat_sub(1) > lat_sub(end) lat_sub = flipud(lat_sub); elev_sub = flipud(elev_sub); end

另外,如果你的水深数据里有NaN值(陆地或者数据缺口),不处理也能画,但会出现颜色空洞。一般处理方式是用shadem或者插值填掉,或者直接把NaN设置为一个固定值。比如让陆地全部显示为同一颜色,可以在绘图时用contourf的Level设置来控制。

3. 用m_map画水深图的完整实操

3.1 m_map的安装与路径配置

m_map没有安装程序,解压即可用。从官网下载最新版本,解压后把整个文件夹放到MATLAB的toolbox目录下,或者任意你方便管理的目录,然后在MATLAB里执行:

% 将m_map路径添加到MATLAB搜索路径 addpath(genpath('D:\Tools\m_map')); % 保存路径,避免下次启动又要重新添加 savepath;

如果你不想永久保存路径,也可以用pathtool图形界面手动添加。注意genpath会递归添加所有子文件夹,m_map里有些示例代码子目录,加进去没有副作用,懒人可以直接genpath。

安装完成后,检查是否成功:

% 检查m_proj函数是否可以调用 which m_proj

如果能返回完整路径,说明安装成功。如果提示找不到函数,多半是路径没加对,重新检查一下目录层级。

3.2 设置投影与绘图区域

m_map把"投影方式"和"区域范围"绑定在m_proj函数上,格式非常固定:

m_proj('mercator', 'long', [lon_min lon_max], 'lat', [lat_min lat_max]);

表示使用墨卡托投影,经度范围从2度到12度,纬度范围从56度到60度。实际使用时要看工作海域的特征选择投影方式。

墨卡托投影(Mercator)用得最多,适合低纬和中纬度海域,形状保持好,且经纬度网格正交,看起来舒服。高纬度地区(例如极地附近)应该选极方位立体投影(Stereographic),避免变形严重。等距圆锥投影(Lambert Conformal Conic)适合中纬度东西跨度大的区域。通用原则是:中低纬度海域用mercator,极地用stereographic,区域不规则时先用mercator试试,不满意再换。

m_proj设置的区域范围会成为整个图的坐标系基准,在这之后所有m_map相关函数(m_pcolor,m_contour,m_line)都会自动进行投影变换。需要说明的是,这个投影设置是针对"当前图窗"的,一幅图只能有一个m_proj设置,重复设置会覆盖前一次。

3.3 绘制底图与水深填色

设置好投影后,先画海岸线,再画水深数据。海岸线用m_gshhs或者m_coast,区别是海岸线数据分辨率。m_gshhs需要额外下载GSHHS全球海岸线数据集,但效果好;m_coast用的是内置数据,胜在方便。实际使用中我默认用m_gshhs的'high'分辨率,近岸细节完整,但第一次绘制可能要联网下载数据文件。

绘制水深的经典代码:

figure('Color', 'w'); m_proj('mercator', 'long', [lon_min lon_max], 'lat', [lat_min lat_max]); % 先画海岸线 m_gshhs('high', 'patch', [0.7 0.7 0.7]); hold on; % 画水深填色 m_pcolor(lon_sub, lat_sub, elev_sub); shading flat; % 叠加等深线 [c, h] = m_contour(lon_sub, lat_sub, elev_sub, [-500 -1000 -2000 -3000], 'k'); clabel(c, h, 'fontsize', 8); % 添加colorbar caxis([-3500 0]); % 根据数据范围调整 colorbar; colormap(flipud(jet(256))); % 或者用自定义色带

这里m_pcolor和普通的pcolor逻辑一样,只是内部做了投影变换。shading flat最好紧跟其后,否则网格线会影响观感。如果你希望填色过渡平滑,可以用shading interp,但注意使用interp后,离散网格之间的颜色会插值,遇到NaN边界可能出现淡淡的颜色条纹。

3.4 等深线参数的选择逻辑

等深线不是随便选的,它要服务于你的展示目的。比如你关心的是陆架坡折,那等深线的间隔就应该在200米、500米、1000米附近加密;如果你要看深海平原,则要重点画3000米、4000米等深线。

我这里给出一个实用的选择策略:先用contourc计算数据范围内的等深线值,看直方图,再决定画哪些层级。简单来说,浅水区等深线可以画得密一些,深水区等深线可以画得疏一些,让图面信息量均衡。

% 查看水深数据的分布 histogram(elev_sub(-elev_sub>0), 50);

根据分布情况,再设定合适的等深线数组。比如某个区域水深主要分布在-50到-500米之间,那等深线选[-50, -100, -200, -300, -500]就比较合理,而不是硬套固定的[-500, -1000]。等深线的标注也要注意别让文字互相重叠,如果标注太多,可以设置clabel(c, h, 'manual')手动选择标注位置。

3.5 自定义色带,让深水浅水一眼区分

MATLAB内置的jet色带虽然鲜艳,但有一个致命问题:浅水区和深水区之间的色差不够直观,而且色带本身有彩虹纹。海洋领域比较推荐的是蓝色系渐变色带,从浅蓝到深蓝,深度越大颜色越深。也可以用cmocean工具箱(Name, 2023)里的deep、deep_r、matter这类专为海洋数据设计的色带。

如果你不想额外装cmocean,自己手动构造一个蓝色渐变色带也很简单:

% 自定义一个从浅蓝到深蓝的色带 mycol = [0.9 0.95 1; 0.6 0.8 1; 0.3 0.6 0.9; 0 0.3 0.7; 0 0 0.4; 0 0 0.2]; colormap(mycol);

注意colormap要在colorbar之前调用,否则色带的颜色映射可能不对。另外,设置色带范围用caxis([cmin cmax])在新版MATLAB中部分场景已被clim取代,建议写clim([cmin cmax]),兼容性更好。

如果想让地形和水深在一张图里同时显示,可以做一个正负值分离的双色色带,比如陆地用棕色系,海底用蓝色系。这样图的信息量更大,但代码要多几行,后面在进阶部分展开。

3.6 经纬度网格、标注与图框美化

m_map可视化非常容易出效果的另一个原因是m_grid,一行代码就能生成符合学术规范的经纬度网格与边框标注。

m_grid('box', 'fancy', 'tickdir', 'out', ... 'fontsize', 10, 'xtick', 2:2:12, 'ytick', 56:1:60, ... 'xlabeldir', 'end', 'ylabeldir', 'end');

几个参数说明一下。box设置边框样式,'fancy'会带一个自然的刻度副框,'on'代表标准方框。tickdir控制刻度线方向,'out'是向外,学术图常用。xtick和ytick手动指定刻度位置,避免默认密度太密或者太疏。xlabeldir设置为'end',可以让经度标注只出现在图的右侧末端,更清爽。

需要提醒的是,m_grid必须在所有绘图元素绘制完成后调用,否则网格线会覆盖在数据之上或者被数据覆盖。正确顺序是:先画数据、等深线、航迹,最后调用m_grid加框加刻度。

3.7 导出高清图的几个细节

论文投稿时图的分辨率有硬性要求。MATLAB导出图片,我最常用的是exportgraphics函数,它比print更稳定,对中文字体和fig大小控制友好。

exportgraphics(gcf, 'bathymetry_map.png', 'Resolution', 600);

如果要导出矢量图(投稿经常需要),推荐导出为PDF或EPS:

exportgraphics(gcf, 'bathymetry_map.pdf', 'ContentType', 'vector');

导出前把图形窗口尺寸设置好,避免输出尺寸不对。一般设置为横向构图,比如:

set(gcf, 'Position', [100 100 1000 700]);

注意exportgraphics在MATLAB R2020a及以后版本支持,如果还在用老版本,退而求其次用print(gcf, '-dpng', '-r600', 'bathymetry_map.png')。

4. 常见报错与排查技巧实录

4.1 m_proj投影设置报错或图形空白

最常见的问题是调用m_map系列函数时提示Projection not initialized。原因非常直接,你还没有调用m_proj就想画图。m_map所有绘制函数都依赖当前的投影信息,必须先设置投影,再调用其他m开头函数。

另一种情况是已经调用了m_proj,但图形窗口里什么也没有。这时候先检查两点:第一,m_proj指定的经纬度范围里有没有实际数据;第二,数据范围是否与投影区域重叠。比如你下载的是全球数据,但目标海域在大西洋东侧,而lon变量范围是-180到180,你设置的经度是2到12,这些经度在数据中存在,那就是绘图函数的问题。反过来,如果你的数据lon范围是0到360,而m_proj设置的是-180到180,那所有数据点都落在投影区域之外,图自然空白。

解决方案是统一经纬度体系。如果数据是0到360,可以用wrapTo180函数(MATLAB Mapping Toolbox提供),或者手动转换:

lon(lon > 180) = lon(lon > 180) - 360;

4.2 数据维度不匹配的提示

m_pcolor(lon_sub, lat_sub, elev_sub)报维度错误,几乎都是因为elev_sub的尺寸和lon、lat的网格不匹配。pcolor要求elev_sub是length(lat_sub) x length(lon_sub)的二维矩阵,少一维都不行。

我习惯在绘图前加一行断言检查,方便快速定位问题:

assert(size(elev_sub, 1) == length(lat_sub), '行数必须等于lat长度'); assert(size(elev_sub, 2) == length(lon_sub), '列数必须等于lon长度');

还有个容易忽略的点:如果lon_sub、lat_sub是从netCDF直接读出来的原始数组,它们是列向量还是行向量都可能,但m_pcolor不会帮你自动转置。统一在数据准备阶段就把维度理清楚,形成固定套路,比每次画图前临时去试效率高得多。

4.3 海岸线绘制太慢或数据缺失

m_gshhs('high')第一次使用时会尝试下载GSHHS数据库,如果网络不稳定,可能卡住或者报错。解决方法是手动从GSHHS官网下载GSHHS数据文件,放到m_map的gshhs目录下,或者改用m_coast绘图。

m_coast的优点是快,内置了基础海岸线数据,不需要额外下载。缺点是分辨率不够高,放大到局部海域后,岸线会显得棱角分明。如果你以近岸细节为主要展示内容,还是建议用gshhs的高分辨率版本。

一个实用技巧:先m_coast快速预览区域范围和数据叠加效果,确认无误后,再切换到m_gshhs('high')出终稿,节省等待时间。

4.4 colorbar显示异常和坐标刻度冲突

有时你画完图,colorbar显示出来了,但颜色范围和数据的实际范围对不上,或者colorbar标签堆叠混乱。这通常是因为caxis/clim设置和colormap调用顺序问题。记住一个原则:先设定colormap,再设colorbar。同时,如果你用m_grid设置了边框,colorbar默认出现在右侧,如果改用了colorbar('southoutside')之类的位置,注意别和m_grid的纬度标注重叠。

还有一个隐蔽问题:m_grid画出来的经纬度刻度文字如果用了默认字体,在Linux下可能显示为方框。解决方法是统一设置字体:

set(gca, 'FontName', 'Helvetica');

或者中文环境里设置'SimHei'。

4.5 负值水深和陆地掩膜问题

如果你的数据里陆地高程是正数,你在画水深图时直接把所有值都pcolor出来,陆地区域会被画成浅蓝,看起来像浅滩,不符合习惯。处理办法是给陆地一个单独的掩膜,让它显示为灰色或者不显示。

% 把陆地高程设为NaN,这样陆地区域显示为透明 elev_plot = elev_sub; elev_plot(elev_sub > 0) = NaN; % 绘图 m_pcolor(lon_sub, lat_sub, elev_plot);

不过设成NaN后,陆地区域会露出底下的白色,和海岸线填充的灰色可能不一致。更好的办法是先把海岸线填充成陆地色,再画水深数据,并且水深数据中陆地部分设为NaN。这样水层颜色和陆地颜色完全分离。

m_gshhs('high', 'patch', [0.7 0.7 0.7]); hold on; elev_plot(elev_sub > 0) = NaN; m_pcolor(lon_sub, lat_sub, elev_plot);

由于m_pcolor的数据会在陆地填充之后绘制,陆地从视觉上被覆盖在灰色面之上。如果你希望陆地色不透明,则需要把透明度和绘制顺序配合好。

5. 进阶:让水深图不只是"一张图"

5.1 在地形图上叠加测站与航迹

用m_map画地形底图最重要的实际场景,是作为其他海洋数据的底图。比如你在研究海域布设了CTD测站,或者船载走航观测的航迹,都可以叠加在这张水深图上。

% 假设有测站经纬度 sta_lon = [3.2 4.1 5.5 7.8]; sta_lat = [57.1 57.8 58.2 59.0]; % 叠加测站符号 m_plot(sta_lon, sta_lat, 'r^', 'MarkerSize', 8, 'LineWidth', 1.2); % 叠加航迹线 track_lon = 2.5:0.1:10; track_lat = 56.5 + 0.2 * sin(0.3 * (1:length(track_lon))); m_plot(track_lon, track_lat, 'b-', 'LineWidth', 1.5); % 标注站点名称 for i = 1:length(sta_lon) m_text(sta_lon(i)+0.1, sta_lat(i)+0.1, sprintf('C%d', i), 'FontSize', 8); end

这里m_plot和普通plot的用法几乎一致,区别是它会做投影变换。测站符号和航迹线会随着投影正确变形,这是m_map相比手动plot经纬度数据的绝对优势。

5.2 做一版陆地水陆分离的双色图

如果你想一张图同时看清陆地高程和海底地形,双色色带是很好的选择。核心逻辑是把高程和水深分成两个数据集,分别用两个colormap绘制。

% 复制数据 elev_land = elev_sub; elev_land(elev_sub <= 0) = NaN; elev_ocean = elev_sub; elev_ocean(elev_sub > 0) = NaN; % 先画陆地 m_pcolor(lon_sub, lat_sub, elev_land); colormap(gca, [0.8 0.7 0.6; 0.6 0.5 0.3]); % 简化示意 hold on; % 再画海洋 m_pcolor(lon_sub, lat_sub, elev_ocean); colormap(gca, [0.9 0.95 1; 0 0.2 0.5]); % 简化示意

用两个colormap同图时需要技巧,因为MATLAB的figure只能有一个colormap,一般做法是用colormap结合数据范围的偏移(把陆地和水深映射到同一颜色轴的不同区段)来实现。这个过程相对复杂,如果只是做初步看图的图件,可以用透明度叠加近似实现。不过我认为对这个需求更高效的方案是:用两个axes叠加,或者在同一个axes里把色带合并。这里不展开太多,但建议优先用透明度叠加:

m_pcolor(lon_sub, lat_sub, elev_ocean); shading flat; alpha(0.9); hold on; m_pcolor(lon_sub, lat_sub, elev_land); shading flat;

因为透明度的关系,陆地和水深会自然融合,视觉上够用,代码简单,适合快速中间图。

5.3 把图画成动图或者多子图

水深图经常要配合时间序列数据用。比如你要画连续多天的海流模拟结果,用同一张水深图当底图,循环输出多帧图片,最后合成GIF。

% 预先设置投影与底图 figure; m_proj('mercator', 'long', [lon_min lon_max], 'lat', [lat_min lat_max]); m_gshhs('high', 'patch', [0.7 0.7 0.7]); hold on; % 循环绘制 for t = 1:10 cla; % 清空当前axes % 重新绘制水深作为背景 m_pcolor(lon_sub, lat_sub, elev_sub); shading flat; hold on; % 在这里绘制动态数据,例如流速场 m_quiver(lon_sub(1:5:end), lat_sub(1:5:end), u_t(:,:,t), v_t(:,:,t)); m_grid(...); exportgraphics(gcf, sprintf('frame_%02d.png', t), 'Resolution', 150); end

cla清空的是当前axes的内容,但m_proj的投影设置是否保留需要验证。稳妥的做法是在循环外只设置一次投影,循环内不要再次调用m_proj,否则图像位置可能会跳动。

5.4 图例、比例尺与指北针

论文图件里,比例尺和指北针是加分项。m_map提供了比例尺函数m_scale,可以在图内添加一个地理比例尺。

m_scale('location', 'southwest', 'width', 20, 'fontsize', 8);

width表示比例尺代表的实际距离(单位是km),location控制位置。指北针可以用m_northarrow(部分版本有),或者直接m_text手动写一个'N'加箭头。如果m_map版本没有现成指北针,也可以用MATLAB的annotation函数叠加一个简单的箭头。

annotations, arrow, text;

比例尺在局部海域图上特别重要,能让读者直观感知尺度。别嫌麻烦,加上之后图件的专业度立刻上一个档次。

6. 实操心得与踩坑总结

6.1 画水深图的"黄金三步"工作流

经过大量实践,我整理了一个适合绝大多数海域的工作流,照着走基本不会出错。

第一步,数据准备。用ncdisp查看netCDF结构,确认维度顺序和变量名;按目标海域裁剪;处理NaN和陆地正值;统一lon/lat方向。

第二步,投影与底图。根据纬度选投影方式(中低纬度mercator,高纬度stereographic);调用m_proj设置区域;绘制海岸线并填充陆地色;绘制水深填色,设置色带范围和colormap。

第三步,完善与导出。调用m_grid美化边框刻度;添加等深线、测站、航迹等要素;添加colorbar、比例尺;设置图形尺寸后导出高清图。

这三步看起来简单,但每一步都有细节。最怕的是流程颠倒:先画数据再设置投影、先colorbar再colormap,这种顺序问题改起来费时。

6.2 控制图形变量,别在内存里裸奔

GEBCO全球数据量不小,如果你一次读入全球分辨率15弧秒的数据,内存占用可能达到几百MB甚至更多。实际绘图前先裁剪到目标区域,再传进绘图函数,这是最省心的内存管理方式。

同时,绘图时尽量用elev_sub或者elev_plot这样的局部变量,不要反复把整个global数据传来传去。MATLAB本身有写时复制机制,但大数据在循环里处理时,提前预分配和裁剪能减少内存碎片,减少卡顿。

6.3 配色好,图就成功了一半

很多同学把重心全放在代码和图层上,忽视了配色。实际上水深图好不好看,80%取决于色带选得对不对。深海蓝、浅海青、陆地棕灰是比较经典的三段式配色。用cmocean工具箱的话,直接调用cmocean('deep')就是专门为水深设计的色带。

如果一定要用jet,建议至少把jet翻转一下,让深水区是深色而不是红色,否则视觉上深水区像高温区,非常容易误导读者。

6.4 做任何图之前,先画一张"快速预览图"

实际工作中,我几乎不会一开始就用高分辨率海岸线、精致色带和所有标注画终稿。那样如果数据有问题,光等gshhs下载和渲染就浪费不少时间。我的习惯是先用m_coast配合pcolor快速出一张预览图,检查数据范围、投影方向、水深分布是否符合预期,确认无误后再换高分辨率出正式图。

这个习惯帮我省了很多时间。水深处处理最折磨人的就是"看着好像哪里不对,但说不上来是什么问题",一张快速预览图往往能立刻暴露问题。

6.5 最后分享一个填充海岸线的小细节

m_gshhs('patch', color)填充海岸线时,patch里传入的颜色会被用于所有陆地多边形,但如果你的数据范围里包含大的湖泊,这些湖泊也会被当作陆地填充。这在某些局部海域图里可能是堆积的大量湖泊色块,很碍眼。解决方法是使用GSHHS数据的'l'(湖泊)属性区分,或者在m_gshhs调用时传入一个更细心构造的patch结构:对'land'和'lake'分别指定颜色。

m_gshhs('high', 'patch', struct('land', [0.7 0.7 0.7], 'lake', [0.8 0.9 1]));

这样陆地和湖泊的填充色分开,图面更自然。类似地,你还可以把river的属性标出来,画河流线条。不过这一步按需使用,不要为了炫技反而把图弄得太复杂。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 1:03:58

横条纹噪声怎么去掉?四阶巴特沃斯陷波滤波器原理与MATLAB实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 1:03:20

dsh-waker插件:让AI从问答变成自动干活的数字员工

你有没有算过&#xff0c;自己每天要重复多少句“帮我写个周报”“这个数据整理一下”“把这段代码解释一遍”&#xff1f;我反正算过&#xff0c;光是这类机械式的AI提问&#xff0c;一天就能耗掉我两三个小时。后来我把dsh用成了主力AI工作台&#xff0c;再给它装上一个叫dsh…

作者头像 李华
网站建设 2026/10/5 1:02:50

ANSYS Workbench O型圈密封泄漏仿真完整流程与关键判据

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 1:02:46

PythonOCC倒角倒圆实战:从API调用到二维三维场景

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 1:02:46

STM32 PWM+DMA驱动WS2812灯带:参数计算与呼吸灯实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 1:02:41

浏览器里编译烧录ESP32:WebAssembly嵌入式开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华