格点预报 vs 单点预报:取数口径与建模的取舍

做新能源功率预测和资源评估,几乎所有人都从一行看似无害的代码开始:给一个经纬度,取一条时间序列。但很少有人停下来追问——你拿到的这条序列,到底代表"那个点",还是代表"那个点所在的网格"? 这两件事在物理上根本不是一回事。数值预报和再分析本质上都是格点产品(gridded field),每个数算出来的值代表一个网格盒(grid box)内的某种空间平均;而你的风机、你的测风塔、你的辐照站,是实打实的单点(point)。从格点到单点这一步取数口径的选择,决定了你后面所有偏差订正、特征工程和考核结果的起点。这篇文章把"格点预报 vs 单点预报"这个常被一行插值代码草草带过的问题拆开讲清楚:它们的物理差异在哪、三种取点方式各自的取舍是什么、代表性误差怎么估、以及它如何一路传导到建模。
关键要点
- 格点值与单点值不是同一个物理量:数值预报/再分析的每个格点代表一个网格盒内的次网格平均(grid-box mean),而风机、测风塔是单点观测,两者之间天然存在代表性误差(representativeness error),它不是模式"算错了",而是口径不匹配。
- 取点方式有三档取舍:最近邻(nearest)保物理但有跳变、双线性插值(bilinear)平滑但会进一步抹平极值、统计/动力降尺度(downscaling)能还原局地但成本高;没有免费的午餐,选哪个取决于地形复杂度和下游用途。
- 插值会系统性削弱方差:对四个格点做加权平均,本质是一次空间低通滤波,会压低风速峰值、抹平爬坡的陡峭程度——这对功率预测的尾部和爬坡考核尤其要命。
- 代表性误差随地形复杂度放大:平坦区一个 0.25° 网格还能近似代表点真值,山区、海岸带、城市边界层里 31 公里见方的平均会掩盖局地加速、海陆风、地形抬升,必须靠降尺度或本地订正补回。
- 建模上的正解是"承认口径差、用配对实测学订正":与其纠结取哪个格点最准,不如把模式取点序列与本场实测做长期配对,学一个把"网格真相"映射到"本场址真相"的订正函数,让代表性误差进入可控的统计闭环。
- 运梦气象 API 直接接受单点经纬度:历史用 ERA5(dataSourceId 为 era5,覆盖 1950 年至今)、预报用德国气象局(dataSourceId 为 ger,覆盖未来约 7 天),后台完成从格点到你给定点的取数,返回统一 JSON envelope。
一、格点与单点:先把物理量分清楚
数值天气预报(NWP)和再分析在算法内部都是把大气离散到一张三维网格上求解的。无论是 ERA5 约 0.25°(赤道附近约 31 公里)的网格,还是区域模式几公里量级的网格,每个格点上的那个数值,代表的不是一个几何点,而是这个网格盒所代表的那块面积上的某种空间平均。这一点是理解一切的起点:模式里的"地表"是网格盒平均的地形高度,模式里的"地表粗糙度"是网格尺度的等效粗糙度,模式里的"温度"是这块次网格区域的平均温度。
而你真正关心的对象——某台风机的轮毂处风速、某块测风塔的 100 米风、某个辐照站的 GHI——是货真价实的单点量。它受局地地形、单个山脊的加速效应、附近一片树林的尾流、一栋建筑的扰动影响,这些尺度远小于一个网格盒,被称为次网格过程(sub-grid process),在格点产品里要么被参数化、要么干脆看不见。
所以"格点预报 vs 单点预报"这个说法,严格讲应该叫**"格点产品 vs 单点需求"之间的口径转换问题**。市面上没有任何一个 API 能真的给你一个数学点上的预报值——它一定是从某种格点场里,用某种规则给你"抠"出来的。区别只在于:这个抠的过程用了什么方法、损失了什么信息、你是否知情。
二、代表性误差:不是模式错了,是口径不匹配
把模式取点序列和同位置实测一比,几乎必然有偏差。新手常把这笔账全记在"模式不准"头上,但其中有相当一部分根本不是模式的错,而是代表性误差(representativeness error)——你拿一个 31 公里见方的空间平均,去对标一个点观测,两者代表的空间尺度不一样,差异是必然的、结构性的。
举个直观的例子。一座位于山脊上的风机,实测年均风速 8.5 m/s;它所在的 ERA5 网格盒里,山脊只占一小块,更多是山谷和缓坡,网格平均地形低、平均风速可能只有 6.8 m/s。这 1.7 m/s 的差不是 ERA5"算错了",而是它老老实实给出了那块 31 公里区域的平均状态——只不过这个平均状态不等于山脊点的真相。同样的逻辑也适用于海岸带(一个网格里一半海一半陆)、城市站(热岛被周边农田稀释)、峡谷电站(地形加速被平滑掉)。
代表性误差有几个工程上必须记住的规律:
- 它随地形复杂度单调放大。平坦均匀的下垫面(大片农田、开阔海面远离岸线)上,网格平均和点真值接近,代表性误差小;地形起伏、海陆交界、下垫面非均匀的地方,误差迅速增大。
- 它对不同要素的敏感度不同。气温、气压这类相对平滑的量代表性误差较小;风速、辐射、降水这类受局地强烈调制的量代表性误差大,尤其风速在复杂地形里能差出 1–2 m/s 量级。
- 它通常是系统性的、可订正的。同一个场址,网格平均相对点真值的偏差方向和量级往往年复一年稳定(这台山脊风机就是常年偏高),这意味着它不是随机噪声,而是可以用一个订正关系长期复用的系统偏差。最后这条性质,正是后面建模解法的立足点。
三、三种取点方式的取舍
从格点场拿到"某个经纬度的值",工程上主流是三条路,各有各的代价。
最近邻(nearest neighbor):直接取离目标点最近的那个格点的值。它的好处是保物理一致性——这个值是模式真实算出来的、自洽的状态,没有被人为加工。代价是空间上有跳变:目标点稍微挪一下、跨过网格边界,取到的格点就换了一个,序列可能出现台阶。它适合那些你想保留模式原始动力学、不希望引入插值伪迹的场景,比如检验模式本身的偏差结构。
双线性插值(bilinear interpolation):取目标点周围四个格点,按到目标点的距离加权平均。它的好处是空间平滑、随位置连续变化、看起来更"精细"。但它有一个常被忽视的副作用:加权平均本质是一次空间低通滤波,会进一步削弱方差。四个格点里有一个风速峰值,平均之后峰值被另外三个稀释,结果是插值序列的极值更钝、爬坡更缓。换句话说,双线性插值让序列"更好看",但代价是它比任何一个真实格点都更平滑,离单点真值的高频波动反而可能更远。
降尺度(downscaling):这是真正试图还原局地单点状态的方法,分两类。统计降尺度用历史配对关系,把粗网格量映射到点尺度(比如经典的 MOS、模式输出统计,或机器学习订正);动力降尺度用区域高分辨率模式(如 WRF)以粗网格为边界条件,重新积分出几公里甚至几百米尺度的场,物理上能还原地形加速、海陆风等次网格效应。降尺度是唯一能把代表性误差从源头减小的路子,代价是计算和数据成本高、链路复杂,通常只在资源评估、复杂地形场站这类值得投入的环节上用。
一张取舍速查表:
| 取点方式 | 物理一致性 | 空间平滑 | 是否削弱极值 | 还原局地能力 | 成本 |
|---|---|---|---|---|---|
| 最近邻 | 高(保模式原值) | 无、有跳变 | 否 | 无 | 极低 |
| 双线性插值 | 中(人为加权) | 高 | 是(进一步抹平) | 弱 | 低 |
| 统计降尺度 | 中(统计映射) | 取决于方法 | 可订正 | 中–高 | 中 |
| 动力降尺度 | 高(重新积分) | 高分辨率 | 否、反而增强局地 | 高 | 高 |
要点是:插值越"平滑",离单点的高频真相未必越近。平坦区双线性够用;复杂地形里,与其纠结最近邻还是双线性,不如上降尺度或本地统计订正。
四、口径如何传导到建模
取数口径不是数据清洗的细节,它会一路传导到建模,影响你最在意的几个指标。
第一,方差被削弱,尾部和爬坡首当其冲。 功率预测的考核很多时候卡在极端时段——风速爬坡、辐照骤降。如果你的输入序列因为双线性插值被平滑掉了,模型看到的爬坡本来就比真实的缓,它学出来的功率爬坡自然也偏保守,"两个细则"里的爬坡事件和尾部误差会吃亏。做爬坡敏感的预测,宁可用最近邻保住陡峭度,也不要贪图插值的平滑。
第二,代表性误差进了特征,就成了系统偏差。 如果你直接拿网格平均风速喂模型、又不做订正,那台山脊风机的 1.7 m/s 系统偏差会被模型"学进去"一部分、又因为非线性功率曲线被放大/扭曲一部分,结果是整条功率曲线系统性偏低。模型不会自己消化口径误差,它只会把口径误差和真实信号一起拟合。
第三,历史与预报口径必须一致,否则订正系数会漂。 一个隐蔽的坑:训练时用 ERA5(一种取点口径)配实测,上线时用预报(另一种网格、另一种取点)驱动,如果两者的取点规则、网格分辨率不一致,你在历史上学到的订正关系到了预报上就不成立了。保证"历史训练用的取数口径"和"实时预报用的取数口径"可对齐,是订正模型能稳定上线的前提。
讲清楚这三条传导路径,建模上的正解其实就清晰了:不要奢望选出一个"最准的格点",而要承认格点到单点的口径差客观存在,然后用本场配对实测把它学成一个可复用的订正函数。 具体做法是把模式取点序列(无论最近邻还是插值)与同期本场实测做长期配对,估计偏差(bias)、均方根误差(RMSE)和它随风向/季节/lead time 的变化,拟合一个把"网格真相"映射到"本场址真相"的订正关系(线性系数、分风向订正、或机器学习残差模型都可以)。这一步等价于风资源评估里成熟的 MCP(测量-相关-预测) 思路:用一段实测把粗网格序列"锚定"到本场址,之后长期复用。代表性误差从此进入一个可量化、可监控、可迭代的统计闭环,而不是一笔糊涂账。
五、在运梦气象 API 上取单点序列
运梦气象 API 的接口设计正好对应这个口径问题:你给一个单点经纬度,后台从格点产品里完成取数,返回该点的时间序列。历史用 ERA5(dataSourceId 为 era5,运梦产品历史范围覆盖 1950 年至今),预报用德国气象局(dataSourceId 为 ger,覆盖未来约 7 天),两者共用同一个同步下载端点和同一套 CF 风格字段名,天然满足上一节"历史与预报口径一致"的要求。响应是统一 JSON envelope,data 里按字段名给出与 timeList 一一对应的数值数组,不返回 CSV/NetCDF、也没有 format 参数。
import requests
URL = "https://console.yun-meng.top/api/energy-weather/search/weather/action/downloadSync"
HEADERS = {
"Authorization": "Bearer sk-your-api-key",
"Content-Type": "application/json",
}
def download(data_source_id, stime, etime, fields, lat, lon):
body = {
"dataSourceId": data_source_id,
"lat": lat, # 单点经纬度:后台完成格点->该点取数
"lon": lon,
"stime": stime,
"etime": etime,
"timezone": "8", # 必填,东八区为 "8"
"fields": fields,
}
resp = requests.post(URL, headers=HEADERS, json=body, timeout=60)
result = resp.json() # 统一 JSON envelope
if not result["success"]:
raise RuntimeError(result["msg"])
return result["data"]
# 同一单点:历史 ERA5 与预报 DWD 共用同一经纬度,保证口径可对齐
LAT, LON = 31.50, 118.50
# 历史:取 100m 风分量 + 派生风速,做 MCP 订正的训练侧
hist = download("era5", "2020-01-01 00:00", "2022-12-31 23:00",
["u100", "v100", "ws"], LAT, LON)
# 预报:同点取未来风速,做在线驱动侧
fcst = download("ger", "2026-06-18 00:00", "2026-06-24 23:00",
["ws", "wd"], LAT, LON)
t_h, ws_h = hist["timeList"], hist["ws"]
t_f, ws_f = fcst["timeList"], fcst["ws"]
print(f"ERA5 历史 {len(t_h)} 条,均值风速 {sum(ws_h)/len(ws_h):.2f} m/s")
print(f"DWD 预报 {len(t_f)} 条,首点 {t_f[0]} 风速 {ws_f[0]:.2f} m/s")
# 提示:历史均值若系统性偏离本场测风塔均值,
# 说明存在代表性误差,应在此点上拟合 MCP 订正系数后再复用。
字段沿用 CF 命名:tas 气温、sp 气压、uas/vas 是 10 米风分量、u100/v100 是 100 米风分量、ws/wd 是派生风速风向、rsds 是地表短波(GHI)、dni 直接法向、dhi 散射水平。资源评估和功率预测建议历史与预报取同一经纬度、同一组字段,把口径对齐放在第一位,再谈订正与建模。
常见问题
格点预报和单点预报有什么区别,我拿到的序列到底代表什么? 数值预报和再分析都是格点产品,每个格点代表一个网格盒(如 ERA5 约 0.25°、约 31 公里见方)内的空间平均;而风机、测风塔是单点。没有 API 能给你数学点上的"原生"预报值,它一定是从格点场里用某种规则取出来的。你拿到的序列代表"该点所在网格的某种取点结果",与点真值之间存在代表性误差。
为什么模式取点序列和实测对不上,是模式不准吗? 有一部分确实是模式误差,但相当一部分是代表性误差——用 31 公里的网格平均去对标一个点观测,口径本就不一致。它随地形复杂度放大(山区、海岸带、城市最明显),对风速、辐射尤其敏感,且通常是系统性的、可用配对实测订正的,不能简单归咎于"模式算错了"。
取格点值用最近邻好还是双线性插值好? 看用途。最近邻保留模式原始物理、自洽但有跳变;双线性插值空间平滑、连续,但会进一步削弱方差、抹平峰值和爬坡。做爬坡和尾部敏感的功率预测,宁可用最近邻保住陡峭度;平坦区双线性够用;复杂地形真正的解是统计或动力降尺度。
双线性插值看起来更精细,为什么反而可能离真值更远? 因为对四个格点做加权平均本质是一次空间低通滤波,会压低极值、抹平高频波动。它让序列"更平滑好看",但单点真值恰恰包含大量局地高频起伏,平滑之后在极端时段反而偏离更大。插值的"精细"是空间连续性,不是对单点高频真相的还原。
运梦气象 API 怎么处理格点到单点的取数? 你提交单点经纬度,后台从格点产品取出该点序列:历史用 ERA5(era5,覆盖 1950 年至今),预报用德国气象局(ger,未来约 7 天),共用同一端点和同一套 CF 字段名,返回统一 JSON envelope。建议历史与预报取同一经纬度、同一组字段,保证取数口径一致,再在该点上拟合 MCP 订正复用。
收尾
"格点预报 vs 单点预报"从来不是一个谁更准的问题,而是一个口径取舍的问题。格点产品给的是网格平均、单点需求要的是点真值,这两者之间的代表性误差是结构性的、绕不开的。工程上真正成熟的做法不是去赌"哪个格点最准"或"哪种插值最神",而是:清楚自己取的是什么口径、知道它损失了什么(最近邻的跳变、双线性的方差削弱、降尺度的成本),再用本场配对实测把网格序列锚定到场址真相,让代表性误差进入可控的订正闭环。把历史与预报的取数口径统一接进同一条管线、同一套字段约定,远比在不同口径之间反复倒腾省心。先把口径和订正系数沉淀下来,换场址、扩规模时都能复用。关于 ERA5 这套格点本底的来龙去脉,可进一步参考ERA5 是什么与 ERA5 数据产品。
参考与延伸阅读
- Hersbach, H., Bell, B., Berrisford, P., et al. (2020). The ERA5 global reanalysis. Quarterly Journal of the Royal Meteorological Society, 146(730), 1999–2049. https://doi.org/10.1002/qj.3803
- Janjić, T., Bormann, N., Bocquet, M., et al. (2018). On the representation error in data assimilation. Quarterly Journal of the Royal Meteorological Society, 144(713), 1257–1278. https://doi.org/10.1002/qj.3130
- Wilks, D. S. (2019). Statistical Methods in the Atmospheric Sciences (4th ed.). Elsevier. (MOS 与统计降尺度章节)
- Carvalho, D., Rocha, A., Gómez-Gesteira, M., & Santos, C. S. (2014). WRF wind simulation and wind energy production estimates forced by different reanalyses: Comparison with observed data for Portugal. Applied Energy, 117, 116–126. https://doi.org/10.1016/j.apenergy.2013.12.001