QGIS实战:中国百年气温数据可视化技巧(附免费数据获取)

最近几年,气候议题的热度持续攀升,无论是学术研究还是产业规划,对高精度、长时序气候数据的需求都变得前所未有的迫切。作为一名长期与地理空间数据打交道的从业者,我深切体会到,一份好的数据只是起点,如何将它转化为直观、有力、能讲故事的视觉成果,才是真正体现专业价值的关键。今天,我们就以一份覆盖中国全境、时间跨度超过一个世纪(1901-2024年)的月度平均气温栅格数据为例,手把手带你走完从数据获取、格式处理到高级可视化的全流程。

这篇文章面向的是已经具备一定QGIS或GIS软件操作基础的同行,可能是环境分析师、地理信息工程师、气候研究者,或是任何需要将枯燥的栅格数据变为动态地图和深度分析图表的专业人士。我们将避开泛泛而谈,直接切入实战,重点解决几个核心痛点:如何处理原始的NC(NetCDF)格式数据?如何利用QGIS强大的空间插值工具提升数据表现力?更进一步,如何制作出能清晰展现百年气温变迁的时序动画,以及生成揭示区域温差细节的热力图?整个过程,我们都会使用免费、开源的QGIS软件和可公开获取的数据来完成,确保每一步都具有高度的可操作性和可复现性。

1. 数据获取与预处理:从NC到GeoTIFF的跨越

工欲善其事,必先利其器。我们使用的核心数据来源于国家青藏高原科学数据中心发布的“中国1km分辨率逐月平均气温数据集”。这份数据的价值在于其超长的时间序列(1901-2024年)和1公里的空间分辨率,单位为0.1摄氏度,精度足以支撑细致的区域分析。原始数据通常以NetCDF(.nc)格式提供,这是一种在气候和海洋领域非常流行的多维数据格式,但对于日常的GIS分析和制图来说,GeoTIFF(.tif)格式更为通用和便捷。

1.1 理解NetCDF数据结构

在转换格式之前,有必要快速理解一下NetCDF文件的结构。你可以把它想象成一个多维的数据“魔方”。对于我们的气温数据,这个魔方至少包含三个维度:经度(X轴)、纬度(Y轴)和时间(通常是“时间层”)。每一个时间层,比如“1901年1月”,就是一张覆盖全国范围的栅格图像。直接在地图软件中打开一个.nc文件,你可能会看到一堆叠加在一起的图层,或者需要手动选择要加载的“变量”(如气温)和“时间步长”。

在QGIS中,你可以通过 图层 -> 添加图层 -> 添加网格图层 来尝试直接打开.nc文件。QGIS会解析其内部结构,让你选择要加载的变量和维度。这一步主要是为了预览和确认数据内容。

注意:直接从某些数据源获取的.nc文件,其坐标参考系统(CRS)可能不是我们熟悉的WGS84或投影坐标系。在QGIS中加载后,务必检查图层的属性,确认其CRS,并在后续处理中进行必要的重投影,以确保空间位置准确。

1.2 使用GDAL进行批量格式转换

虽然QGIS界面可以处理单个文件的转换,但对于包含124年*12个月=1488个时间层的庞大数据集,批量处理是唯一高效的选择。这里我们依赖QGIS底层集成的GDAL工具。

最强大的命令行工具是 gdal_translate。我们需要写一个简单的批处理脚本(Windows的.bat或Linux/macOS的.sh)来循环处理。思路是:将NetCDF中的每一个时间层(对应一个特定年月)单独提取并输出为一个GeoTIFF文件。

首先,你需要知道NetCDF文件中气温变量(Variable)的名称,例如可能是“temp”或“tavg”。你可以用 gdalinfo 命令来查看文件结构:

gdalinfo your_file.nc

查看输出,找到包含多个“子数据集”的列表,通常格式像 NETCDF:"your_file.nc":variable_name。

假设变量名是“tavg”,下面是一个Linux/macOS Shell脚本的示例框架:

#!/bin/bash
INPUT_FILE="China_monthly_temperature_1901_2024.nc"
VARIABLE="tavg"
OUTPUT_DIR="./tif_output"

mkdir -p $OUTPUT_DIR

# 假设时间层从1到1488,具体数量需根据实际情况调整
for BAND in {1..1488}
do
    # 构建输出文件名,例如 temp_190101.tif
    # 这里需要根据你的数据时间编码来生成有意义的文件名,可能需要额外处理
    OUTPUT_NAME="${OUTPUT_DIR}/temp_band_${BAND}.tif"
    
    # 使用gdal_translate转换指定波段
    gdal_translate -of GTiff NETCDF:"${INPUT_FILE}":${VARIABLE} -b ${BAND} ${OUTPUT_NAME}
    
    echo "已转换波段 ${BAND}"
done

对于Windows用户,可以编写一个类似的批处理文件(.bat),使用 for /l 循环。关键在于 -b 参数,它指定了要转换的波段(即时间层序号)。

提示:直接按波段序号生成的文件名意义不明。更佳实践是,先提取NetCDF文件的时间维度信息,将每个波段与具体的年月(如1901-01)关联起来,再用日期命名输出文件。这可能需要用到Python的netCDF4库或GDAL的Python绑定进行更精细的编程处理,但一次性投入可换来长期的管理便利。

转换完成后,你将得到上千个独立的.tif文件。建议按年份创建子文件夹进行管理,例如 ./1901/, ./1902/,每个文件夹内存放该年12个月的数据。

2. 空间插值技巧:从离散点到连续表面

我们获得的栅格数据本身已经是网格化的,似乎不需要插值?这里存在一个常见的误解。原始数据虽然是1km网格,但在某些分析场景下,我们可能只有稀疏的气象站点数据,或者需要对现有栅格进行重采样以匹配其他分辨率更低/更高的数据集,亦或是原始数据在某些区域(如高原、边境)存在缺失值(NoData)。此时,空间插值技术就派上了用场。

QGIS提供了多种插值算法,我们以“反距离权重法”(IDW)和“克里金法”(Kriging)为例,假设我们手头有一份中国主要气象站点的点状气温数据(CSV格式,包含经度、纬度和温度值),演示如何生成一张平滑的全国气温分布图。

2.1 数据准备与加载

首先,将你的站点数据(如 stations.csv)以“分隔文本图层”的形式添加到QGIS中,确保X、Y字段(经度、纬度)正确,并设置好坐标系统。

2.2 执行插值分析

转到 处理 -> 工具箱,在搜索栏中输入“插值”。

  • 反距离权重法 (IDW): 算法简单,计算速度快。它假设未知点的值受邻近已知点的影响,且影响程度与距离成反比。

    • 在工具界面,选择你的点图层和要插值的字段(温度)。
    • 设置输出栅格的范围、像素大小(例如,与我们的1km数据保持一致)和输出文件路径。
    • “距离系数”参数(P值)通常默认为2。增大P值会使较近的点权重更高,表面更不平滑;减小则更平滑。
  • 普通克里金法 (Ordinary Kriging): 更高级的统计方法,不仅考虑距离,还通过变异函数分析数据的空间自相关性,能提供插值结果的误差估计(方差图)。

    • 选择点图层和字段。
    • 关键步骤是配置“变异函数模型”。点击“变异函数”旁的按钮,进入模型设置。QGIS可以自动拟合一个模型(如球状模型、指数模型),但建议有经验的用户根据半变异函数云图手动调整“块金值”、“基台值”、“变程”等参数,以获得更符合数据空间结构的插值结果。
    • 同样设置输出范围、像素大小和路径。

下表简要对比了两种方法的特点:

插值方法核心原理优点缺点适用场景
反距离权重法 (IDW)距离加权平均原理简单,计算快速,易于理解。无法估计误差,可能产生“牛眼”效应(围绕站点出现同心圆状分布)。数据点分布均匀且密集,对精度要求不极端,需要快速出图的场景。
普通克里金法 (Kriging)基于统计和变异函数的最优无偏估计能提供插值标准差(不确定性表面),理论上能给出最优线性无偏估计。计算复杂,需要用户理解并配置变异函数模型,对初学者门槛较高。数据存在空间自相关性,且需要评估插值结果可靠性的科学研究。

点击运行后,你将得到一张全新的、连续的全国气温栅格图。可以将其与我们原始的月度栅格数据叠加,进行对比验证。

3. 时序动画制作:让百年气温变迁“动”起来

静态地图难以表现时间维度上的变化。将124年的月度数据制作成动画,是直观展示气候长期趋势和季节循环的绝佳方式。QGIS本身没有内置的动画制作器,但我们可以利用其“时间管理器”插件配合截图,再借助外部软件合成动画。

3.1 配置QGIS时间管理器

首先,确保你的月度数据图层(最好是转换好的Tif文件)有一个属性能代表时间。对于按 YYYYMM 命名的文件,在加载时可能没有时间字段。

  1. 为图层添加时间字段: 如果你是按“按目录添加栅格图层”的方式批量加载了所有Tif文件,生成的虚拟图层可能没有时间信息。一个变通方法是使用“按扫描模式添加栅格图层”,并确保文件名包含时间(如temp_190101.tif)。在加载时,QGIS可能会自动从文件名中提取时间。
  2. 安装并启用时间管理器插件: 在 插件 -> 管理和安装插件 中搜索“TimeManager”,安装并启用。
  3. 设置图层时间: 打开时间管理器面板(视图 -> 面板 -> TimeManager)。点击“设置”按钮,添加你的气温栅格图层。在配置对话框中:
    • “时间类型”选择“单一时间”。
    • 在“时间字段”或“表达式”中,你需要构建一个能唯一标识每个图层时间的表达式。如果图层名包含日期,可以使用类似 replace(@layer_name, 'temp_', '') 的表达式来提取“190101”这样的字符串,再通过 to_date 函数转换为日期。这是最具挑战性的一步,可能需要根据你的文件命名规则自定义表达式。
    • 设置“时间格式”以匹配你的表达式输出。
  4. 配置动画: 在时间管理器面板中,设置动画的“时间帧长度”(如1个月)和“总时间范围”(1901-01-01 到 2024-12-01)。你可以拖动时间滑块预览动态效果。

3.2 导出动画帧与合成

时间管理器可以自动导出帧。

  1. 在时间管理器面板,点击“导出视频”按钮(实际上是导出图像序列)。
  2. 设置输出目录、图像尺寸(建议与你的地图窗口比例一致,如1920x1080)、文件前缀和格式(PNG)。
  3. 点击“导出”,QGIS会按照时间序列,自动将每一帧地图渲染为图片并保存。

得到图片序列后,我们需要用外部工具将其合成为视频。这里推荐使用FFmpeg,这是一个强大且免费的命令行工具。

打开命令行终端,导航到存放图片序列的目录,执行类似下面的命令:

ffmpeg -framerate 10 -pattern_type glob -i 'frame_*.png' -c:v libx264 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" china_temperature_timelapse.mp4
  • -framerate 10: 设置视频帧率为每秒10帧。数值越大,动画播放越快。
  • -i 'frame_*.png': 指定输入图片,frame_*.png 需要匹配你导出的图片文件名模式。
  • -c:v libx264: 使用H.264编码,兼容性好。
  • -pix_fmt yuv420p 和 -vf "scale...": 确保输出视频的像素格式和尺寸能被广泛播放器兼容。
  • 最后是输出视频的文件名。

运行命令后,你将获得一个名为 china_temperature_timelapse.mp4 的视频文件,生动展示了百年气温的时空演变。

4. 温差热力图生成:揭示区域气候异质性

除了看绝对温度,温度的变化(温差)往往更能揭示问题。例如,我们可以分析同一月份在不同年份的温差,或者分析特定年份内冬夏的温差(气温年较差)。这能帮助我们发现气候变暖趋势中的“热点”区域,或理解地形对气候稳定性的影响。

4.1 计算温差栅格

以计算“2023年7月”与“1990年7月”的温差为例,展示全球变暖背景下的三十多年变化。

  1. 加载两个时期的栅格图层: 将 temp_202307.tif 和 temp_199007.tif 加载到QGIS。
  2. 使用栅格计算器: 打开 处理 -> 工具箱,搜索“栅格计算器”。
  3. 构建计算表达式: 在表达式框中输入简单的减法公式,例如:
    "temp_202307@1" - "temp_199007@1"
    
    这里的 @1 表示栅格的第一波段(通常也是唯一波段)。确保图层名称与你的实际图层名一致。
  4. 设置输出: 指定输出结果的路径和格式(如GeoTIFF),点击运行。

得到的新栅格图层,其像元值就是温差(单位仍是0.1℃)。正值表示2023年7月比1990年7月更暖,负值则表示更冷。

4.2 设计热力图渲染风格

直接查看差值栅格的原始值并不直观。我们需要通过色彩渲染将其变为一张“热力图”。

  1. 打开图层样式面板: 双击温差图层,进入“图层样式”。
  2. 选择渲染类型: 将“渲染类型”从“单波段伪彩色”改为“单波段伪彩色(差值)”,或者使用“单波段伪彩色”并手动定义色带。
  3. 配置色带:
    • 差值渲染: QGIS会自动以0值为中心,对称地分配冷暖色。例如,用蓝色系表示负值(变冷),用红色系表示正值(变暖)。你可以调整色带的颜色和边界值。
    • 手动定义: 在“单波段伪彩色”下,选择“颜色渐变”为“自定义”。点击“分类”按钮,选择一种分类方法(如“等间隔”或“分位数”),设置分类数量。然后,为最小值和最大值分别指定颜色(如深蓝和深红),中间值会自动渐变。
  4. 优化显示:
    • 可以适当调整“对比度增强”为“拉伸到完整范围”,让色彩对比更鲜明。
    • 考虑将极端值(如温差大于3℃或小于-3℃)归为一类,并用更强烈的颜色表示,以突出变化剧烈的区域。
    • 添加图例、比例尺、指北针等地图元素,并标注清楚这是“2023年7月相较于1990年7月的温差图”。

通过这样的热力图,你可以一眼看出过去三十多年里,中国哪些区域在夏季增温最为显著(可能是西北干旱区或城市群),哪些区域相对稳定甚至略有降温(可能是个别山区或受其他气候因子影响的区域)。这种分析对于评估气候变化的风险分布极具价值。

整个流程走下来,从处理上千个数据文件到生成动态视频和专题分析图,虽然步骤不少,但每一步都紧扣实际需求。我最深的体会是,前期数据整理和元数据(尤其是时间信息)的规范化,能为后续所有可视化分析节省大量时间。与其在QGIS里手动调整上百个图层的时间属性,不如花点时间写个脚本,在数据转换阶段就把文件名和图层时间属性一次性处理好。另外,GDAL命令行工具和FFmpeg这类“瑞士军刀”式的软件,是提升GIS工程师工作效率的利器,值得投入时间学习其基本用法。

更多推荐