中国高精度年均气温栅格数据集(1901-2024)解析与应用 1. 数据集整体设计与构建思路做气候数据处理这块的人应该都体会过那种“找数据找到怀疑人生”的感觉。要么分辨率太粗省级尺度都够呛要么时间跨度短想做点长序列分析根本没有底气要么就是格式五花八门投影坐标系乱七八糟拿到手还得花大量时间做预处理。所以当我第一次接触这套中国高精度年度平均气温栅格数据集1901-2024的时候第一反应是这玩意把很多痛点一次性解决了。这套数据集的核心价值简单说就是三个词长序列、高精度、栅格化。空间范围覆盖中国全境时间跨度从1901年一直延伸到2024年分辨率到了1km左右能直接拿来分析百年尺度的气候变化趋势。对做生态学、水文学、农业区划、环境健康研究的人来说它相当于一个基础底盘数据——你不一定直接用它出结论但很多分析都离不开它。先说清楚一个容易混淆的点这个数据集不是某一年某一期的快照而是一个逐年更新的长时间序列产品。每年一个栅格把全中国的地表平均气温按照空间网格组织起来每个网格里存的是该年份的平均气温值。1901年到2024年一共124个图层这在气候数据集里算是非常难得的资产。从数据类型上看它属于空间插值类气候产品不是站点观测数据。什么意思观测站只能告诉你某个点的气温而这个数据集通过一定的空间插值方法把有限的站点观测值推广到整个面上每个像元都有一个估算值。这也就是为什么它叫栅格数据集——所有信息都是以规则的格网单元组织的每个格网对应一个数值天然就跟GIS软件、遥感软件兼容。我之前在项目里用过一个覆盖范围比较小的区域气候数据那次踩了不少坑。首先是投影不统一后来又发现部分年份的缺失值处理方式前后不一致搞得整个时间序列分析差点推倒重来。所以当看到这套数据集在时间连续性、空间一致性上下了功夫说实话是挺认可的。尤其是对做长时序分析的人来说数据一致性比单年精度更关键。这套数据集能做什么举一些实际例子研究过去一百多年中国的升温趋势、分析农业热量资源的变化、评估极端冷暖年份的空间分布、构建物种分布模型的气候变量、做城市规划中的热环境分析……基本上凡是需要“面状气温”而不是“点状气温”的研究场景它都能派上用场。适合的读者也很明确——地理学、生态学、农学、气候学方向的研究生和科研人员以及从事自然资源管理、灾害风险评估的行业从业者。如果你只是想要某几个城市的具体年份气温那直接查气象站数据就好了不必费劲用栅格。当然作为一个基于插值方法的再分析型产品它不可能替代观测数据本身也有自己的适用边界。这恰恰是我想在本文里展开聊的——数据集的结构、原理、操作细节、避坑经验以及实际使用中的判断标准。2. 数据集核心参数与空间理解说句实话拿到一套栅格数据集最先该搞清楚的并不是算法而是四个基本参数分辨率、坐标系、时间范围、单位。这四个参数决定你能不能直接用、怎么用、以及跟其他数据叠加的时候要不要做转换。缺一个搞错了后面全是坑。2.1 空间分辨率与坐标系这套数据集的标称空间分辨率是1km左右。这里用“左右”两个字是因为栅格数据在实际存储中分辨率往往受投影方式和纬度影响不是一个绝对的整数。以常用的Albers等面积投影为例标准纬线设置不同实际像元尺寸在南北方向上会有微小差异。很多新手拿到数据后直接用ArcGIS里的“像元大小”字段去做面积统计结果偏了就是没搞懂这个细节。坐标系方面这套数据集提供的是预设的Albers等面积圆锥投影中央经线通常是105°E标准纬线一般是25°N和47°N——这是中国区域数据常用的配置。做面积分析、分区统计的时候这种投影比较合适但如果你要做经纬度匹配、跟MODIS等卫星产品叠加就得先做投影转换。需要提醒的是转换的时候别忘了设置正确的栅格重采样方法双线性内插适合连续型变量如气温最近邻法则适合土地利用这类类别变量用错了会带来不小的误差。还有一点让我比较在意的是数据集的掩膜边界处理。有些气候产品在国界和海岸线附近经常出现“飞点”也就是明明应该是陆地的像元却显示成NoData或者海洋区域被插值出了虚假的低温区。从实际使用情况来看这套数据集在陆地边界掩膜上处理得比较干净沿海岛屿和国境线的数据缺口很少。这对需要做全国尺度统计的分析来说省了不少事。2.2 时间范围与逐年图层组织1901年到2024年124个年度图层是这套数据集的另一个核心特征。时间维度的完整性直接影响研究设计的可行性。全球变暖背景下的气温变化趋势至少需要30年以上的连续数据才有统计意义如果想分析年代际波动甚至百年尺度的冷暖周期那数据跨度越长越好。124年的时间长度足以支撑起多种尺度的时间序列分析。我拿到数据后习惯做的第一件事是把文件名列出来检查一遍看看有没有缺年或者文件名年份与内部属性不一致的情况。这听起来很基础但真有人踩过。某个同行曾跟我说他做黄河流域气温趋势分析时合并了十几年的年度栅格最后发现其中有两年的文件名写的是2005和2006图层属性却是2004和2008导致趋势分析直接出现了一个异常的冷谷。所以无论数据源声称质量多高个人层面的质量检查都省不了。图层命名方面这套数据集基本遵循“变量_年份.tif”的格式批量处理的时候很方便。用R或者Python做批量运算时可以直接用正则表达式提取年份循环处理不用手动一个一个去选。2.3 气温单位的细节问题气温数据的单位看起来很基础但细节上容易出问题。多数全球产品和这套数据集类似存储时为了压缩体积会放大10倍后用整型来保存。什么意思原始值15.6摄氏度的气温在栅格文件里可能是数字156需要除以10才还原成摄氏度。如果你忽略这个缩放因子拿到的所有数值都偏大10倍分析结果自然全错。当然也有可能某些版本直接以浮点型存储无需缩放。那怎么判断最简单的方法是用GIS软件查看某个像元值再跟附近气象站的实测年均温对比一下。如果量级在几十到几百之间大概率是缩放过如果在一二十附近波动那基本就是原始摄氏度值。另外统计整个图层的直方图也是个好办法——中国年均温的合理范围大约在-20到25摄氏度之间如果数据范围明显超出这个区间就务必要检查缩放因子。3. 数据生成原理与关键处理逻辑理解数据是怎么来的对判断“这数据能不能用在我的研究里”至关重要。很多用户习惯把数据当成黑箱符合格式就直接拿去分析。我不太建议这样因为插值产品有自己的假设和局限用错了场景结论的可靠性会打折扣。3.1 站点观测到空间栅格的核心转换路径这套数据集的生产流程本质上遵循气候数据空间化的经典路径。第一步收集整理气象站点的观测数据包括气温、海拔、经纬度等信息第二步结合高精度的数字高程模型对气温进行海拔订正把站点观测值从实际海拔“矫正”到基准面上第三步利用空间插值算法将离散的站点数据转化为连续的空间分布第四步用独立站点的实测值做交叉验证评估插值精度。这里面的关键环节是第三步的插值算法选择。理论上用于气温插值的方法很多比如反距离权重法、克里金法、薄板样条法等各有优劣。反距离权重法简单直接但容易在站点稀疏区域产生“牛眼”现象普通克里金能给出置信区间但需要仔细拟合变异函数薄板样条法能同时纳入经纬度和海拔多个协变量在复杂地形区域表现更好。从这套数据集的实现思路来看用的是基于协变量的薄板样条插值并重点引入了海拔因子。这也解释了为什么它在青藏高原、横断山区这类地形起伏大的区域表现仍然相对合理——单纯靠经纬度做插值的产品在这些区域经常出现空间异质性被平滑掉的问题。3.2 海拔订正为什么如此重要气温随海拔升高而降低平均而言每上升100米气温大约下降0.6摄氏度也就是通常说的气温直减率。在平原地区这个因素的影响可能不大但在中国西部和高原地区海拔落差动辄几千米如果不做海拔订正插值结果会出现系统性偏差。我举个例子。假设青藏高原某区域内有两个站点一个海拔3000米年均温5摄氏度另一个海拔4500米年均温-3摄氏度。如果不考虑海拔只按经纬度距离插值那海拔4000米的点可能被插值出接近0度的值但如果做了海拔订正就可以结合DEM推算出约-1.5摄氏度左右这个值更符合实际。对于年尺度气温数据来说海拔订正做得是否到位直接决定了山地地区的可信度。3.3 精度验证与不确定性任何插值产品都必须回答一个核心问题你的估值跟真值差多少这套数据集在生成过程中通常采用交叉验证方式即把一部分站点数据先隐藏起来用剩余站点建模插值再用藏起来的站点验证精度。在中国东部站点密度高的区域年均温的验证误差大概在0.5摄氏度以内西部站点稀疏区域误差会略大一些。理解这个精度特征对实际应用很重要。如果研究区域恰好是站点密度较高的东部直接使用这套数据是相对可靠的如果是站点稀疏的藏北无人区那么数据反映的主要是空间趋势具体数值的不确定性会大很多。所以我不建议在精细尺度上把这个数据集当作站点观测的替代品更适合的还是区域尺度、宏观尺度的分析。我也习惯在论文里明确写出数据精度验证的基本情况——因为审稿人经常问。4. 实际使用与操作全流程下面这部分我尽量写得像一份可以直接抄作业的操作手册。不同的应用场景使用的工具链不同但总体思路是通用的选数据、做投影检查、提取目标区域、执行分析、可视化。我分别用ArcGIS和Python两条路径来讲。4.1 准备工作文件清单与运行环境动手之前先把必备的文件和软件环境列清楚年度气温栅格文件若干GeoTIFF格式研究区域的矢量边界文件shapefile或GeoJSON桌面GIS软件ArcGIS Pro或QGIS均可或Python环境建议安装rasterio、geopandas、numpy、matplotlib在Python环境下推荐用conda创建虚拟环境避免包版本冲突。conda create -n climatedata python3.10 conda activate climatedata conda install -c conda-forge rasterio geopandas numpy matplotlib这种虚拟环境的管理方式我一直在用尤其是有多个项目并行时各项目依赖互不打扰省心很多。4.2 数据检查从文件名到属性的一整套校验清单解压数据后不要急着画图。先建立检查清单逐项核对文件数量是否与年份数一致空间范围是否覆盖完整研究区像元大小和投影信息是否符合预期像元数值范围是否合理是否存在大片NoData区域我一般会写一个小脚本批量检查。import rasterio import glob files glob.glob(tem_*.tif) for fp in sorted(files): with rasterio.open(fp) as src: print(fp, src.crs, src.res, src.bounds, src.nodata)这一步能快速发现问题。比如我之前就遇到过某年份数据的投影信息缺失如果直接后续处理产生的所有结果都有隐患。4.3 年度平均温度序列提取实际应用中最常见的需求是给定一个区域比如某个流域、省份提取该区域在124年间的平均气温变化序列。操作思路是逐年用区域边界裁剪栅格然后计算区域平均值。在Python里核心逻辑如下import rasterio import geopandas as gpd from rasterio.mask import mask import numpy as np import pandas as pd region gpd.read_file(study_area.shp) results [] for year in range(1901, 2025): fp ftem_{year}.tif with rasterio.open(fp) as src: out_image, out_transform mask(src, region.geometry, cropTrue) data out_image.astype(float32) data[data src.nodata] np.nan # 如果数据经过尺度缩放这里除以10 mean_temp np.nanmean(data) / 10.0 results.append({year: year, mean_temp: mean_temp}) df pd.DataFrame(results) df.to_csv(annual_temp_series.csv, indexFalse)这段代码解决的是最核心的任务把124年的区域均值汇总成一个表格。拿到这个表之后做趋势分析、突变检验、可视化就都好办了。用ArcGIS实现同样功能的路径是搜索“Zonal Statistics as Table”工具区域数据用矢量边界栅格数据选年度气温文件统计类型设定为MEAN逐个年份执行或构建模型批处理。ArcGIS Pro的ModelBuilder可以把124次操作串联起来输出一个总表效率也不低。4.4 区域平均气温空间分布可视化如果想观察某一年的气温空间格局或者绘制多年平均气温分布可视化是关键。Python里最常用的方案是matplotlib结合rasterio读取栅格数据再绘制但更简单的方式是用QGIS直接加载GeoTIFF并调整色带。下面用一个示例展示如何用Python绘制2010年的平均气温空间分布import rasterio import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap with rasterio.open(tem_2010.tif) as src: tem src.read(1).astype(float32) tem[tem src.nodata] np.nan tem tem / 10.0 extent [src.bounds.left, src.bounds.right, src.bounds.bottom, src.bounds.top] colors [#313695, #4575b4, #74add1, #abd9e9, #e0f3f8, #fee090, #fdae61, #f46d43, #d73027, #a50026] cmap LinearSegmentedColormap.from_list(temp, colors) plt.figure(figsize(10, 8)) plt.imshow(tem, cmapcmap, extentextent, vmin-15, vmax25) plt.colorbar(labelMean Annual Temperature (degC)) plt.title(China Mean Annual Temperature 2010) plt.xlabel(Longitude) plt.ylabel(Latitude) plt.tight_layout() plt.savefig(Tmean_2010.png, dpi300) plt.show()这里需要注意两点其一色带的选择建议使用红蓝渐变而不是默认的jet因为红蓝渐变对温度数据的语义表达更直观其二设置vmin和vmax时参考数据直方图避免色彩对比度被极端值支配。4.5 批量数据导出重投影很多研究项目需要将数据统一到其他投影比如WGS84经纬度坐标。用rasterio的reproject函数可以完成重投影。from rasterio.warp import calculate_default_transform, reproject, Resampling dst_crs EPSG:4326 for year in range(1901, 2025): src_path ftem_{year}.tif dst_path ftem_{year}_wgs84.tif with rasterio.open(src_path) as src: transform, width, height calculate_default_transform( src.crs, dst_crs, src.width, src.height, *src.bounds) kwargs src.meta.copy() kwargs.update({ crs: dst_crs, transform: transform, width: width, height: height }) with rasterio.open(dst_path, w, **kwargs) as dst: for i in range(1, src.count 1): reproject( sourcerasterio.band(src, i), destinationrasterio.band(dst, i), src_transformsrc.transform, src_crssrc.crs, dst_transformtransform, dst_crsdst_crs, resamplingResampling.bilinear)重采样方法的选择是个需要动脑子的细节。气温属于连续变量用双线性内插或三次卷积法都行但土地覆盖、土壤类型这类类别变量必须用最近邻法否则会改变类别值。5. 时间序列统计分析与趋势解读数据准备好之后真正的分析才刚开始。拿着124年的区域平均气温序列我们能做什么最常见的两个方向一是线性趋势分析二是年代际变化特征分析。如果还想更进一步可以加入Mann-Kendall趋势检验和突变检验。5.1 线性回归趋势分析最简单的趋势分析是用年份作为自变量气温作为因变量做一元线性回归回归系数就是每十年的升温速率。通常以每十年升高多少摄氏度来表示这是IPCC报告和各种气候蓝皮书里最常见的指标。import numpy as np import pandas as pd from scipy import stats df pd.read_csv(annual_temp_series.csv) df df.dropna() slope, intercept, r_value, p_value, std_err stats.linregress(df[year], df[mean_temp]) trend_per_decade slope * 10 print(fTrend: {trend_per_decade:.2f} degC per decade, p{p_value:.4f})如果趋势通过了显著性检验p小于0.05说明这个区域在过去一百多年里确实存在显著的气温变化趋势。比如很多研究表明中国区域年均温的升温速率大致在每十年0.1到0.2摄氏度之间近几十年速率更快。你算出来的数值落在什么范围很大程度上取决于区域和时段。5.2 Mann-Kendall非参数趋势检验线性回归有个前提假设是数据服从正态分布而气温序列有时候并不完全满足这个条件另外线性回归对异常值比较敏感。相比之下Mann-Kendall检验是非参数方法不要求数据符合特定分布对缺失值和异常值的鲁棒性更好因此在水文气象趋势分析中被广泛使用。Python中可以直接用pymannkendall库pip install pymannkendallimport pymannkendall as mk result mk.original_test(df[mean_temp]) print(result)输出结果包括趋势方向、显著性、Kendall Tau值等。跟线性回归的结果互相印证会让结论更扎实。5.3 年代际波动分析除了整体趋势年代际波动同样值得关注。把124年的数据按十年分组来算平均可以很明显地看出冷暖阶段的交替。还可以通过滑动平均来平滑年际噪声df[smooth] df[mean_temp].rolling(window11, centerTrue).mean()11年滑动平均是气象上常用的做法能有效突出年代际信号同时保留更长时间尺度的变化特征。在实际论文中这种图一般配合多年平均基线比如1961-1990年平均值一起画用距平表示变化看起来更直观。5.4 空间趋势制图除了单区域的时间序列还可以做“逐像元趋势分析”——每个格网单独算趋势然后画成一张空间分布图。这在识别气温变化的空间异质性时非常有用比如看是北方升温快还是南方升温快高原地区和高纬度地区是不是更敏感。逐像元回归的计算量比较大但用numpy向量化运算可以高效完成。大致思路是把124个年度的栅格堆叠成一个三维数组然后对每个像元的时间序列做线性回归提取斜率。numpy的linalg.lstsq函数可以批量处理。6. 常见问题与排查技巧实录说实话真正用起来的时候问题往往不是算法不会而是数据处理环节各种小毛病。我根据自己的使用经验整理一下高频问题应该可以帮大家省点时间。6.1 数据范围异常偏大或偏小拿到数据直接出图颜色一塌糊涂数值动辄几百十有八九是缩放因子没处理。前面说过的除以10就是针对这类问题。如果数值普遍偏小且范围很窄可能只是年度气温本身差异小不用太担心。最简单的验证方法就是挑几个点位跟附近基准站气候值对比。6.2 裁剪后整片区域都是NoData出现这种情况第一步先看矢量和栅格的投影是不是一致的。如果都是地理坐标系但基准面不同或者一个用投影坐标系一个用地理坐标系裁剪就很可能出问题。先统一投影再重新裁剪基本能解决。处理矢量时注意坐标系转换的细节避免用错转换参数。6.3 多时段数据数值体系不一致当使用年限跨度极大的数据集时可能出现早期和近期数值分布不连续的现象。原因很多可能是早期站点稀少导致插值偏向平滑或者站点迁移与仪器更新带来的非气候因素影响。遇到这种情况建议先做均一性检验常用的方法有Pettitt检验、SNHT检验等。如果确有问题可以考虑对早期部分做偏差订正或者在分析中明确排除异常年份。6.4 逐像元趋势计算内存爆掉124个分辨率为1km的全国栅格叠加起来占用的内存相当可观。如果电脑配置不够建议分块处理用rasterio的window参数按窗口读取或者干脆把研究区裁剪小一点再分析。我当时用逐像元回归时就是先裁剪出研究区再做堆叠和计算速度就快多了。6.5 可视化时图例范围和色带选择不妥做气温空间分布图时图例范围如果直接用数据最低到最高往往会让大部分区域的颜色都挤在中间视觉上很难区分空间差异。建议根据研究目的把范围设到合理区间比如做全国年均温图用-15到25摄氏度比较合适做区域图则根据区域实际情况适当收窄范围。6.6 不同产品交叉对比时数值差异较大最后想提醒一句不同气候数据集之间本身就存在差异因为插值方法、站点数据来源、DEM版本都不完全相同。你做研究时如果发现这套数据与某个全球产品的数值相差1到2摄氏度未必是谁错了更可能是空间代表性和算法差异。处理办法是给出数据间的不确定性范围而不是简单断言某个数据不准。7. 典型应用方向与研究扩展思路我觉得一套好的数据集不应该只服务一个固定用途。拿这套百年气温栅格数据来说叠加其他变量就能延伸出大量有意思的分析方向。7.1 物候与农业气候区划有了连续124年的年均温栅格就能统计各区域的积温、无霜期等农业热量指标。把这些指标跟作物种植分布叠加可以分析气候变化背景下中国农业种植北界是否在移动、复种指数是否在增加。比如过去常说的“小麦种植北界北移”“柑橘种植范围扩展”等现象都跟热量条件变化直接相关。7.2 生态学中的物种分布模型物种分布模型非常依赖气候变量年均温几乎是必选变量之一。这种百年尺度的气温栅格数据能为模型提供长期气候背景也可以用来分析物种潜在分布区在过去一百年间的位移。把不同时期的气候数据分别代入模型输出物种种群适宜分布区变化图是很常见的生态地理研究范式。7.3 冻土与水文研究年均温是判断冻土存在与否的重要指标之一。多年冻土通常分布于年均温低于0摄氏度的区域通过逐年的年均温栅格可以估算过去120多年冻土南界的变化。这对理解高寒地区水文过程、碳释放风险等问题都有辅助价值。7.4 极端年份快速定位把124个年份跟长期均值比较计算标准化气温距平就能快速定位历史上的显著冷暖年份。比如某年如果全国平均气温距平达到2个标准差以上那基本可以认定为极端暖年。这种分析不需要复杂模型用栅格计算器或numpy就能完成对气候事件研究很有用。7.5 与人口、经济数据结合的风险评估将气温栅格与人口密度、GDP空间数据叠加还能做气候变化暴露度评估。比如分析在升温趋势下哪些区域的人口和经济活动暴露在更高的热风险中。这类研究在城市规划、公共卫生领域越来越受重视。有一点需要提醒这些扩展方向在数据操作上并不难难点往往在于搞清楚自己的研究问题到底需要什么时间尺度、什么空间粒度的气温数据。年尺度数据适合趋势和年代际分析如果是作物生长季或极端高温事件研究那就需要月尺度或日尺度数据年值就不够用了。8. 实操心得与长期维护建议最后这部分我打算分享几点比较具体的个人体会谈不上理论高度但都是实际操作中得出来的经验。第一把数据处理流程固定成脚本。第一次用这套数据时我光是裁剪、投影转换、提取均值就手工点了很多次。后来我把流程固化成了Python脚本换一个区域只需要改边界文件路径运行一遍就出完整结果。这省下来的时间不是一点点。建议任何经常跟这类数据集打交道的人都尽早建立自己的批处理命令库。第二注重元数据与代码注释的同步管理。以前我习惯在代码里写一个文件路径就完事等几个月后回来看往往忘了数据是否经过缩放、采用的投影是什么。自从养成在脚本头部写清楚元数据信息数据版本、来源、投影、单位转换系数的习惯后代码的可复用性大幅提高。第三版本管理同样重要。这套数据集在时间上会不断更新每年新增一个年份文件。旧数据处理完了新数据来了最好建立一个简单的版本更新机制把旧版本归档新版本单独建目录避免混淆。谁也不想用旧数据跑完分析最后发现数据源已经更新了。第四遇到疑问多跟同行交流。网上关于这套数据集的讨论其实挺多但分散在不同平台。有些高手会把预处理脚本分享出来直接在原帖下提问也经常能得到回复。合理借鉴别人的经验和代码能帮你少走很多弯路。第五永远给数据结果留下误差解释的余地。任何基于插值的数据都存在不确定性。用这套数据集写出的分析结论建议在方法部分明确说明空间分辨率和验证精度让读者了解数据的适用边界。这在期刊投稿时尤其重要审稿人往往很关注数据来源和精度说明。气候数据的使用说到底是一个“理解数据、处理数据、用好数据”的过程。这套高精度年度平均气温栅格数据集本身质量不错但真正决定研究成果质量的还是使用者的处理流程是否严谨、对数据局限性的理解是否到位。希望这篇内容能帮你在自己的研究里少踩几个坑把时间更多地花在真正的科学问题上。