简介:一套依据国标GBT17297-1998制作的中国气候区划GIS矢量数据,包含气候带与气候大区的面状分布,以及对应的气候界线线状要素,线状数据用于描绘气候带边界,辅助识别过渡区域。面向GIS分析人员、气候研究人员和区域规划者,可支撑气候特征提取、空间分析与专题制图。压缩包共16个文件,包体约498KB,主要含shp地理要素、dbf属性表、prj投影定义、sbn/sbx空间索引及xml元数据等类型,各文件协同保证空间数据完整读取,可在ArcGIS或QGIS中直接加载使用。借助这份矢量数据,读者能快速定位不同气候带与大区范围,并可叠加人口、土地利用等信息进行综合分析,服务农业区划、生态评估、灾害预防和可持续发展研究;还可用于评估气候变化趋势、规划气象监测站点布局、分析气候变暖的农业影响。目前已有59人学习下载,适合气候地理相关课题研究与教学演示。
1. 中国气候区划气候带和气候大区:一张决定种植和建筑边界的底图
"这个项目所在地属于什么气候带?"在农业、能源和建筑设计项目里被问过多次后,我发现很多人把中国气候区划当成一张查颜色的地图:红的是热带、绿的是亚热带、黄的是温带。但它真正的技术骨架是两套指标、两级区划——气候带用热量定南北,气候大区用干湿定东西。搞清楚这套逻辑,你才能回答"为什么秦岭—淮河一线那么重要",才能在报告里写出带依据的结论,而不是照着图描一遍。这篇按我复现这套区划的完整过程来写:指标怎么算、代码怎么写、边界值怎么定、哪些地方最容易翻车。
2. 热量定带、水分定大区:气候带的划分指标和边界值怎么落地
气象和地理行业有一套成文的区划体系,《中国气候区划名称与代码》这类标准把全国按两级切分:第一级"气候带"以热量为主导,第二级"气候大区"在每一个气候带内部再按干湿细分。这样设计是有现实原因的:热量和水分是决定种植制度、自然植被和建筑能耗的两类独立变量,而且两者在地理上并不重合。同样是中温带,东北东部湿润、内蒙古半干旱、北疆干旱,农业利用方式完全不是一回事。所以要先用热量划出"带"的骨架,再用干湿在每个带里切出"大区"。
2.1 气候带:≥10℃ 积温是主线,最冷月气温做兜底
≥10℃ 积温是热量资源最常用的口径:日均温稳定通过 10℃ 大致对应喜温作物的生长季,把一年内所有日均温 ≥10℃ 的日子逐日累加,得到的就是年积温(单位 ℃·d)。中国气候区划按积温把全国划成以下几个带:
| 气候带 | ≥10℃ 积温(℃·d) | 典型区域 |
|---|---|---|
| 寒温带 | < 1600 | 大兴安岭北部 |
| 中温带 | 1600~3400 | 东北大部、内蒙古、北疆 |
| 暖温带 | 3400~4500 | 华北平原、黄土高原、塔里木盆地 |
| 北亚热带 | 4500~5300 | 秦岭南坡、江淮北部 |
| 中亚热带 | 5300~6500 | 江南丘陵、四川盆地、贵州 |
| 南亚热带 | 6500~8200 | 闽南、岭南、桂南 |
| 北热带 | ≥ 8200 | 雷州半岛、海南北部、西双版纳 |
| 高原气候带 | 单独判定 | 青藏高原 |
这套数值不是铁律,不同版本的区划在边界上会差 100~200℃·d,所以边界地带要用辅助指标兜底。用得最多的是最冷月平均气温:北热带要求最冷月 ≥15℃,雷州半岛和西双版纳正好压在这条线上;寒温带则要求冬季气温足够低。中温带到亚热带的最冷月阈值和积温高度相关,所以许多简化版本只给积温一个指标。秦岭—淮河一线正是暖温带与北亚热带的分界,它大致与 1 月 0℃ 等温线、800mm 年降水量线重合,这也是这条线在农业区划里反复出现的原因。
注意:同一地点用 1981—2010 和 1991—2020 两套气候标准期算积温,结果差异可能超过 200℃·d,边界带可能"跨带"。后面第 5 章专门讲。
2.2 气候大区:干燥度 K 值把每个气候带切成干湿四档
气候大区不看温度,看水分。气象上用的干燥度是张宝堃经验式:
K = 0.16 × ΣT(≥10℃) / r
其中 ΣT(≥10℃) 就是上一节的 ≥10℃ 积温,r 是年降水量(mm)。这个式子本质是"热量对水分的需求"除以"降水供给",K 越大越干。划分标准如下:
| 气候大区 | 干燥度 K | 景观与用水含义 |
|---|---|---|
| 湿润 | K ≤ 1.0 | 森林为主,雨养农业可行 |
| 半湿润 | 1.0 < K ≤ 1.5 | 森林草原,灌溉补墒 |
| 半干旱 | 1.5 < K ≤ 4.0 | 草原、荒漠草原,必须有灌溉 |
| 干旱 | K > 4.0 | 荒漠,只有绿洲农业 |
400mm 年降水量线大致落在半湿润与半干旱的交界附近,所以"400mm 线 = 农牧过渡带"的说法在区划里是有依据的。气候大区的命名是"带名 + 大区名",比如"暖温带半湿润大区"指华北的大部分,"中温带干旱大区"指北疆到内蒙古西部。引用时最好写全称,只写"半干旱区"而不带气候带,别人没法判断你说的到底是哪块地方。
2.3 为什么是"积温 + 干燥度"而不是年均温
年均温最大的问题是把季节性抹平了。东北和云南可能年均温接近,但一个生长季只有 120 天,另一个几乎全年可耕作,种植制度天差地别。积温保留的是"热量总量 + 生长季长短",这才与作物熟制直接挂钩。干燥度则是把积温和降水放进同一个公式,反映的是"大气对水分的需求"与"实际供水"之间的差距。两套指标一个管"够不够热",一个管"够不够水",组合起来才是完整的农业生产气候条件。对从业者来说,记住这个组合的意义在于:你引用区划结果时要能反推它背后的指标,才不会把"暖温带"和"半干旱大区"混为一谈——前者说热量,后者说水分。
3. 用 30 年格点数据复现气候带和气候大区:从数据到分级图
3.1 数据源怎么选:站点、格点观测还是再分析
复现区划第一步是选数据,三类来源我都用过,适用场景不同:
| 数据源 | 分辨率 | 适合场景 | 主要问题 |
|---|---|---|---|
| 气象台站日值 | 站点级 | 站点所在位置的精确判定 | 要做空间插值,站点稀少的西部误差大 |
| CN05.1 格点观测数据集 | 0.5°×0.5° | 论文和业务复现,最接近官方口径 | 需申请,时间跨度到近年 |
| ERA5 / ERA5-Land 再分析 | 0.25° / 0.1° | 快速验证方法、全球覆盖 | 青藏高原和西北偏差明显 |
我的选择习惯是:快速把方法跑通、看个大概,用 ERA5-Land,0.1° 分辨率出图已经够平滑;要交付报告、和官方区划对比,一定换 CN05.1 这类格点观测数据,再分析在复杂地形区的偏差会让积温差出两三百度。另外,无论用哪个数据源,都要对齐"30 年气候标准期",目前业务上用的是 1991—2020,做历史对比才用 1981—2010。下面代码按 1991—2020 逐日数据处理。
3.2 算积温、最冷月气温和干燥度:一套可直接改的 Python 函数
import xarray as xr import numpy as np # ds: 30年逐日格点数据,含变量 tas(2m气温, K) 与 pr(降水, mm/d) # 使用前先把范围裁剪到中国区域,并统一经纬度网格 ds = xr.open_dataset('china_daily_1991_2020.nc') def calc_indices(ds): tas = ds['tas'] - 273.15 # 开尔文转摄氏 pr = ds['pr'] # 若原始单位是 m/d,先乘 1000 转 mm/d # 1) ≥10℃ 积温:只累计日均温 ≥10℃ 的日子 # where(条件) 会把不满足条件的像元置为 NaN,sum 自动跳过 gdd_year = (tas.where(tas >= 10.0)).groupby('time.year').sum('time') gdd10 = gdd_year.mean('year') # 多年平均积温,单位 ℃·d # 2) 最冷月平均气温:先逐月平均,再取每年12个月里的最低值 tas_month = tas.resample(time='1MS').mean('time') tcold_year = tas_month.groupby('time.year').min('time') tcold = tcold_year.mean('year') # 多年平均最冷月气温,单位 ℃ # 3) 年降水量(mm/a) pr_year = pr.groupby('time.year').sum('time') pr = pr_year.mean('year') # 4) 干燥度:张宝堃经验式 K = 0.16 * 积温 / 年降水 K = 0.16 * gdd10 / pr return xr.Dataset({'gdd10': gdd10, 'tcold': tcold, 'pr': pr, 'K': K})几个参数和逻辑要解释清楚。groupby('time.year')是按年分组聚合,目的是先得到每一年的积温和降水,再对 30 年取平均,而不是把 30 年直接累加再除以天数——两种算法在闰年和缺测处理上会差出几十度。resample(time='1MS')是把逐日数据重采样成逐月,1MS表示以每月第一天为起点。最冷月温度取的是"每年 12 个月的最低值再多年平均",后面第 5 章会讲为什么不能直接取 1 月。干燥度公式里的降水必须是年总量毫米数,如果数据源给的是 m 或 kg/m²,要先把单位换算对,否则 K 值会差三个数量级。
3.3 阈值落带:np.select 把连续场变成气候带和气候大区
def assign_groups(ds): gdd10 = ds['gdd10'] tcold = ds['tcold'] K = ds['K'] # 气候带:按 ≥10℃ 积温切,北热带加最冷月 ≥15℃ 兜底 cond_zones = [ gdd10 < 1600, (gdd10 >= 1600) & (gdd10 < 3400), (gdd10 >= 3400) & (gdd10 < 4500), (gdd10 >= 4500) & (gdd10 < 5300), (gdd10 >= 5300) & (gdd10 < 6500), (gdd10 >= 6500) & (gdd10 < 8200), (gdd10 >= 8200) & (tcold >= 15.0), ] zones = np.select(cond_zones, [1, 2, 3, 4, 5, 6, 7], default=0) # 1寒温带 2中温带 3暖温带 4北亚热带 # 5中亚热带 6南亚热带 7北热带 # 气候大区:按干燥度四档 regions = np.select( [K <= 1.0, K <= 1.5, K <= 4.0], [1, 2, 3], default=4) # 1湿润 2半湿润 3半干旱 4干旱 ds = ds.assign(zone=(('lat', 'lon'), zones), region=(('lat', 'lon'), regions)) return dsnp.select从上到下匹配,第一个条件为真的选择项生效,所以条件顺序就是优先级顺序,和"含上限"还是"不含上限"的口径直接相关。我这里的写法是积温恰好落在边界值时归入较暖的一侧,例如 3400 归中温带;如果你要复现某份具体标准,先查它边界值的开闭区间,这一点最容易和官方结果差出整条带。北热带我加了最冷月 ≥15℃ 的辅助条件,海南北部、西双版纳这类地方积温够,但冬季受寒潮影响,不加这个条件会把雷州半岛乃至更北的地方误判成热带。高原气候带是个例外:青藏高原主体 ≥10℃ 积温普遍低于 1600,套上面的阈值会落进寒温带,但它的温度特征和东北完全不同。常见做法是先用海拔掩膜把高原主体单独挑出来,再按最热月气温分高原寒带、高原温带。如果只做全国概览,给高原单独设一个编码就行,不要混进普通气候带。
输出结果可以存成 NetCDF 或 GeoTIFF,叠行政区划后做分区面积统计。到这一步,"数据 → 指标 → 分级"的链路就通了。
4. 区划结果怎么用:农业熟制、建筑分区的三个落地场景
4.1 农业规划:气候带对应熟制上限,气候大区决定灌溉底线
种植制度是第一大应用场景。气候带直接给出熟制上限:寒温带、中温带以一年一熟为主(东北玉米大豆);暖温带两年三熟到一年两熟(华北冬小麦—夏玉米);北亚热带一年两熟(稻麦两熟);中亚热带两熟到三熟,双季稻边界就在这一带;南亚热带以南一年三熟。做项目选址时,我会先把目标作物的热量下限换算成积温,再和区划图对比,比逐点查气象站快得多。气候大区则决定灌溉底线:半干旱大区(K > 1.5)即便积温够,没有灌溉也稳不了产,河套、河西走廊的绿洲农业就是这么来的。湿润大区里积温再低也能靠雨养延后播种期,这是大区指标在种植决策里最实用的一个判断。
4.2 建筑与能源:别把气候大区当成建筑气候区划
建筑行业有自己的区划体系,《建筑气候区划标准》把全国分成 7 个气候区、20 个子区,划分指标是 1 月与 7 月平均气温、相对湿度和降水;《民用建筑热工设计规范》又分了严寒、寒冷、夏热冬冷、夏热冬暖、温和 5 类。这两套和气象的中国气候区划不是一回事,我把它们混用过一次,后来被审图的人打回来重算。正确的用法是:用气候带(积温)粗略估冷暖负荷量级,用气候大区(干燥度)定湿度控制策略——湿润大区的梅雨防潮、半干旱大区的蒸发冷却,处理思路完全相反。写报告时一定注明引用的是哪套区划,这是建筑专业审图最容易挑的错。
4.3 生态边界:400mm 线和植被地带性的对应关系
气候带是植被地带性的温度骨架:暖温带对应落叶阔叶林,亚热带对应常绿阔叶林,热带对应雨林和季雨林;气候大区的干湿分档则对应草原、荒漠的分布。做生态承载力或林草规划时,把区划结果和土地利用数据叠加,能快速找出"越过生态边界"的区域——比如在半干旱大区勉强种乔木的造林地,成活率低是气候决定的,不是管理问题。400mm 线作为半湿润与半干旱的分界,在农业和生态两个视角下都成立,这也是区划结果"一张图管两件事"的价值所在。
5. 避坑与排查:复现气候区划翻车的 5 个高频问题
5.1 积温比官方图低两百多度
现象:用 ERA5 算华北平原的 ≥10℃ 积温,结果比官方区划图低 200~300℃·d,气候带落到了下一级。原因:日平均气温的口径不同。台站业务用的是 02、08、14、20 时四次定时观测平均,再分析的 2m 气温是 24 小时平均;更关键的是再分析在晴天强辐射下日较差偏小,白天气温被压低,导致日均温 ≥10℃ 的天数减少。解决:交付对比类结论时换用 CN05.1 格点观测或台站日值;如果只能用再分析,至少在报告里注明"基于 ERA5,积温系统性偏低";想粗略订正,可以取 20~30 个站点算积温偏差,再做空间插值做差。
5.2 高原区最冷月不是 1 月
现象:青藏高原一部分台站 2 月平均气温反而低于 1 月,按 1 月取最冷月气温会高估 1~2℃,影响高温带下限和寒温带上限的判定。原因:高原的冬春环流调整和辐射冷却节律与东部季风区不同,地面气温最低点滞后。解决:程序里统一用"逐月平均后取全年最低月"的口径,而不是写死 1 月。第 3 章的tcold已经按这个逻辑算,不要图省事改成年均气温或 1 月气温。
5.3 干燥度换公式,湿润区变半湿润
现象:把干燥度公式从 0.16ΣT/r 换成 Penman-Monteith 参考蒸散,长江中下游的 K 值明显变大,湿润大区变半湿润,区划图大范围漂移。原因:张宝堃公式是热量—降水两要素的经验式,Penman-Monteith 考虑了辐射、风速、湿度,两个公式的数值体系不同,对应的干旱等级阈值也不同。解决:做中国气候区划就用配套公式和配套阈值,不要只换公式不换阈值;如果因为项目要求必须用 ET0 类指标,就整套换用与之配套的干湿划分体系,并注明依据。
5.4 气候带边界锯齿严重、碎斑一堆
现象:自动分类出来的气候带边界在秦岭、云贵高原一带呈锯齿状,甚至出现孤立的碎斑,和官方区划图的光滑曲线对不上。原因:格点分辨率不足,复杂地形区再分析误差被放大;官方图是多年气候平均加专家订正的结果,做过线状平滑。解决:分类前对积温场做一次高斯空间平滑,窗口取 3×3 或 5×5 格点;出图时和官方区划图做目视校验;在报告里写明这是"按指标自动分类结果",不要标成"标准区划",否则遇到较真的评审会很被动。
5.5 新旧气候标准期结果不一样,甚至"跨带"
现象:同一格点用 1981—2010 算落在中温带,用 1991—2020 算进了暖温带。原因:气候变暖让等积温线整体北移,气象业务这几年已把气候标准期切换到 1991—2020,新旧结果差异在东北—华北过渡带最明显。解决:任何报告先写清"基于哪个标准期",不要只写"30 年气候平均";如果项目跨年份,优先用最新标准期。反过来,这个特性可以做成有价值的分析——第 6 章就讲怎么用两套标准期做气候带漂移评估。
6. 进阶用法:用两套气候标准期做气候带漂移评估
同一套脚本,把数据分别切成 1981—2010 和 1991—2020 两段跑一遍,你就得到两张气候带图。逐像元比较两张图,就能量化"气候带往哪边漂、漂了多少"。做法并不复杂:两期结果对齐网格后,把新旧编码合成一个整数,统计编码变化得到转移矩阵。
import numpy as np # zone_old / zone_new: 同一网格、两个标准期的气候带编号数组 def transition_report(zone_old, zone_new): # 编码生成 new*100 + old,例如 3205 表示旧带5 -> 新带3 enc = zone_new.astype(int) * 100 + zone_old.astype(int) vals, counts = np.unique(enc, return_counts=True) total = counts.sum() for v, c in zip(vals, counts): old, new = v % 100, v // 100 if old != new: # 只输出跨带像元 print(f"{old:02d} -> {new:02d}: {c} 格点, " f"{c / total * 100:.2f}%")这个编码思路适合任何两期分区对比,不只是气候带。new*100+old能同时保留新旧信息,np.unique统计后只打印跨带项,避免被大量"没有变化"的像元刷屏。转移矩阵告诉我们哪里在变;要看得更直观,可以沿某条经度取一条带谱剖面线,画出两期等积温线位置,算出"北移了多少公里"——这种图在气候适应、种植制度调整、能源分区修订的报告里,比静态区划图更有说服力。
有一点要提醒:漂移评估说明的是"按同一套指标体系的区划结果发生了移动",不等于官方区划已经修订,引用时要写明口径。我现在养成的习惯是,凡是交付区划图,一定在图上标注三个信息:数据源、气候标准期、阈值版本。缺任何一个,三个月后连自己都还原不了这张图——这个习惯是从一次被甲方拿着旧版区划图追问数据来源之后,才彻底改过来的。希望帮到你。
本文还有配套的精品资源,点击获取