1. 项目概述
作为一名长期从事InSAR数据处理的研究人员,我经常需要将形变监测结果可视化呈现。今天要分享的是使用MATLAB的m_map工具箱绘制InSAR形变速率图的完整流程。这个方案特别适合处理长三角、京津冀等平原地区的沉降监测数据,能够清晰展现毫米级的地表形变特征。
在实际项目中,我发现很多同行虽然会处理InSAR数据,但在可视化环节常常遇到以下痛点:
- 地图投影变形导致形变场失真
- 海岸线等地理要素与形变数据错位
- 颜色映射无法突出形变梯度变化
- 比例尺、指北针等地图要素缺失
本文将基于一段实际项目代码,详细解析如何用m_map制作专业级的InSAR形变图。这个方案在我参与的多个地面沉降监测项目中都取得了很好的效果,图形质量完全满足学术论文和项目报告的出版要求。
2. 核心工具与环境配置
2.1 m_map工具箱简介
m_map是MATLAB环境下最专业的地图绘制工具包之一,相比内置的mapping toolbox具有三大优势:
- 支持30+种地图投影(特别是适合区域研究的Mercator投影)
- 自带高精度海岸线数据库(GSHHS)
- 与MATLAB原生绘图函数完美兼容
安装步骤:
matlab复制% 下载地址(需手动添加到MATLAB路径)
unzip('m_map1.4.zip');
addpath(genpath('m_map1.4'));
2.2 数据准备要点
InSAR形变数据通常存储为N×3矩阵:
matlab复制vel_CZ_24_new = [经度, 纬度, 形变速率(mm/a)];
重要提示:数据需预先进行:
- 粗差剔除(|速率|>100mm/a的异常点)
- 坐标统一(WGS84坐标系)
- 时间基准归一化(如转换为年速率)
3. 地图绘制全流程解析
3.1 投影设置与底图绘制
matlab复制clf;
m_proj('mercator', 'long', [119 120.2], 'lat', [31.1 32.1]);
- 投影选择:Mercator投影在纬度变化<5°的区域变形可忽略,特别适合长三角这类平原地区
- 范围设置:经度跨度建议控制在3°以内,避免边缘畸变
底图绘制采用GSHHS高清海岸线数据:
matlab复制m_gshhs_f('patch', [0.7 1 0.7]); % 陆地填充浅绿色
m_gshhs_i('color', [1 1 1]); % 水体设为白色
避坑指南:必须按先陆地后水体的顺序绘制,否则白色填充会覆盖陆地
3.2 形变数据可视化
数据坐标转换是关键步骤:
matlab复制[lonm, latm] = m_ll2xy(ll_v(:,1), ll_v(:,2)); % 经纬度→投影坐标
散点图绘制技巧:
matlab复制hold on;
h = scatter(lonm, latm, 5, ll_v(:,3), '.', 'MarkerFaceAlpha', 0.8);
hold off;
- 点大小设为5像素,在800×600图像中表现最佳
- 透明度0.8可缓解数据重叠处的饱和现象
3.3 颜色映射方案
推荐使用翻转的jet色带:
matlab复制colormap(fliplr(jet)); % 蓝→红表示沉降→抬升
caxis([-30 30]); % 对称色标突显形变方向
专业建议:城市沉降监测通常将caxis设为[-50 50],矿区抬升可调整为[-100 100]
4. 地图整饰与输出
4.1 坐标网格设置
matlab复制m_grid('box', 'fancy', 'tickdir', 'in', 'gridlines', 'no', 'fontsize', 12);
- 'fancy'样式自动优化刻度标签
- 关闭网格线(gridlines='no')避免视觉干扰
4.2 比例尺与指北针
matlab复制m_ruler([0.08 0.4],0.1,4,'color','b','linewid',2); % 4km比例尺
m_northarrow(120.1, 32.0, 0.1, 'type', 4); % type4为简洁箭头
位置参数说明:
- m_ruler前两个参数为归一化坐标位置
- northarrow的经纬度需在绘图范围内
4.3 图形输出设置
matlab复制set(gcf, 'Position', [100, 100, 800, 650]); % 优化显示尺寸
print('-dpng', '-r300', 'deformation_map.png'); % 300dpi输出
5. 常见问题解决方案
5.1 数据与底图偏移
现象:形变点落在海洋上
解决方法:
- 检查数据坐标系是否为WGS84
- 确认m_proj范围包含所有数据点
- 重装GSHHS海岸线数据
5.2 颜色映射异常
现象:色标与数据不匹配
排查步骤:
matlab复制disp([min(ll_v(:,3)), max(ll_v(:,3))]); % 验证数据范围
imagesc([-30 30]); colorbar; % 测试色标
5.3 图形元素遮挡
调整绘制顺序:
- 底图(m_gshhs)
- 形变数据(scatter)
- 网格与装饰(m_grid, m_ruler)
6. 进阶技巧
6.1 形变等值线叠加
matlab复制m_contourf(lonm, latm, griddata(...), 'LineStyle', 'none');
需先用griddata将散点数据网格化
6.2 多图幅拼接
matlab复制subplot(2,1,1);
m_proj(...); % 第一幅图
subplot(2,1,2);
m_proj(...); % 第二幅图
6.3 动态形变展示
matlab复制for yr = 1:10
scatter(..., 'CData', vel_data(:,yr));
title(['Year ',num2str(yr)]);
drawnow;
end
在实际应用中,我发现将形变速率图与卫星影像叠加能显著提升成果表现力。这需要先用geotiffread导入遥感影像,再通过m_image函数叠加显示。一个典型的应用场景是分析高铁沿线沉降,通过时序动画可以清晰看到沉降漏斗的扩展过程。