技术博客
天气预报国际版:太阳辐射与紫外线字段解读(short_rad / dni / gti / uv)

天气预报国际版:太阳辐射与紫外线字段解读(short_rad / dni / gti / uv)

作者: 万维易源
2026-09-03
天气预报国际版太阳辐射紫外线指数光伏
# 天气预报国际版:太阳辐射与紫外线字段解读(short_rad / dni / gti / uv) > 接口:天气预报国际版(apiCode=3540)接入点 1 / 2 · 免费接口 · POST/GET · JSON · 适用人群:户外/能源/健康类应用开发者 · 阅读时间:约 6 分钟 ## 核心要点 - 当前天气与逐小时预报都带一组少见的**太阳辐射字段**:`short_rad`(短波/全球水平辐射)、`diff_rad`(水平面散射)、`dni`、`gti`(倾角辐射),单位 W/m²,外加紫外线指数 `uv`。 - 实测观察:白天多个时段 `dni` 与 `gti` 返回 0,而 `short_rad`/`diff_rad` 数值正常(曼谷正午 `short_rad=938.38`);文档对 `dni` 的中文描述在两处接入点还不一致。 - 本文如实呈现字段定义与实测现象,辐射字段可用于展示与参考场景,用于光伏等严肃计算前务必业务侧实测验证。 ## Why 紫外线提醒(防晒)、光伏发电参考、户外运动强度评估——这些场景要看的不是"晴天还是多云",而是太阳辐射本身。多数天气接口只给 UV 指数,天气预报国际版额外暴露了 4 个辐射字段,这在免费天气接口里不多见。 不过,字段多也意味着理解成本高:四个辐射字段什么关系?单位是什么?数据可靠性如何?本文基于文档定义 + 真实接口实测,把这些问题讲透。 ## What 字段速查(均见于 3540-1 的 `now` 与 3540-2 的 `hourList[]`;3540-3 日级只有 `uv`): | 字段 | 单位 | 文档描述 | 说明 | |------|------|---------|------| | `uv` | - | 紫外线指数 | 通用 UV 指数,白天高、夜间为 0,实测曼谷午后 9.4 | | `short_rad` | W/m² | 短波太阳辐射或全球水平辐射 | 即气象上的 GHI(全球水平辐照)口径 | | `diff_rad` | W/m² | 水平面散射日射量 | 散射部分 | | `dni` | W/m² | 3540-1 写"散射辐射",3540-2 写"直接辐射" | DNI 气象惯例为**直接法向辐照**;两处描述不一致 | | `gti` | W/m² | 倾角辐射 | 倾斜面辐照,光伏组件面口径 | > `uv` 与 `dni`/`gti` 等在文档字段表中部分示例值为"-",实际返回可能缺失,取值判空。 ## How ### 1. 拉取并展示 UV 与辐射 Python: ```python # pip install requests import requests APPKEY = "YOUR_APPKEY" def fetch_uv_rad(city: str) -> dict: resp = requests.post( "https://route.showapi.com/3540-1", params={"appKey": APPKEY, "name": city}, timeout=10, ) body = resp.json()["showapi_res_body"] if body.get("ret_code") != 0: raise RuntimeError(f"业务错误: {body.get('remark')}") now = body["now"] return { "city": body["cityInfo"]["city"], "uv": now.get("uv"), "short_rad": now.get("short_rad"), "diff_rad": now.get("diff_rad"), "dni": now.get("dni"), "gti": now.get("gti"), } def uv_tip(uv): if uv is None: return "暂无数据" if uv < 3: return "弱,无需特别防护" if uv < 6: return "中等,出门建议防晒" if uv < 8: return "强,遮阳帽+防晒霜" if uv < 11: return "很强,避免正午暴晒" return "极强,尽量不外出" r = fetch_uv_rad("bangkok") print(f'{r["city"]} UV={r["uv"]} -> {uv_tip(r["uv"])};短波辐射 {r["short_rad"]} W/m²') # 实测输出示例: 曼谷 UV=9.4 -> 很强,避免正午暴晒;短波辐射 938.38 W/m² ``` cURL: ```bash curl -X POST "https://route.showapi.com/3540-1?appKey=YOUR_APPKEY&name=bangkok" ``` Node.js(逐小时 UV 峰值): ```js const res = await fetch( `https://route.showapi.com/3540-2?appKey=${process.env.APPKEY}&name=bangkok`, { method: "POST" } ); const body = (await res.json()).showapi_res_body; const peak = body.hourList.reduce((a, b) => ((b.uv ?? -1) > (a.uv ?? -1) ? b : a)); console.log(`今日 UV 峰值出现在 ${peak.time},uv=${peak.uv}`); ``` ### 2. 防晒提醒的推荐组合 用逐小时 `uv` 找峰值时段 + 当前天气的 `uv` 做即时提示,比单一时刻值更实用;`uv_tip` 分级为 UV 指数通用分级常识,按业务口径调整。 ## 返回示例与解析 实测(name=bangkok,3540-2,14 时): ```json { "time": "2026-09-03 14:00", "uv": 9.4, "short_rad": 938.38, "diff_rad": 84.74, "dni": 0, "gti": 0, "cloud": 85 } ``` 实测(name=北京,3540-1,15 时):`uv=3.3, short_rad=689.78, diff_rad=98.84, dni=0, gti=0, cloud=0`。 两个城市的 `short_rad`/`diff_rad` 都有正常量级,而 `dni`/`gti` 均为 0——这就是下文"进阶与边界"要重点说的实测观察。 ## 进阶与边界 - **`dni`/`gti` 实测为 0(重要观察)**:本文在北京(晴,cloud=0)、曼谷(多云,cloud=85)白天时段实测,`dni` 与 `gti` 均返回 0,而 `short_rad`/`diff_rad` 正常。可能的原因(推断,未经官方确认):数据源未提供该两项、或按当地条件计算为 0。**建议**:展示类场景可如实展示;光伏发电量估算等严肃场景,先做长周期实测对比,勿直接依赖。 - **`dni` 的中文描述不一致**:3540-1 文档表写"散射辐射",3540-2 写"直接辐射"。气象惯例 DNI = Direct Normal Irradiance(直接法向辐照),"散射"的表述与惯例不符,以官方最终解释为准。 - **`uv` 是最稳的一个**:实测昼夜变化规律(曼谷 14 时 9.4 → 17 时 0.4 → 夜间 0),用于防晒提醒可靠。 - **判空**:辐射字段实测偶有缺失(文档示例值"-"),统一判空。 ## FAQ **Q1:四个辐射字段怎么区分?** `short_rad`(全球水平)、`diff_rad`(其中散射部分)、`dni`(直接法向)、`gti`(倾斜面)。做光伏参考关注 `gti`/`dni`,做"太阳晒不晒"的直觉展示关注 `short_rad` + `uv`。 **Q2:`dni` 一直是 0,是不是我调用姿势不对?** 与调用方式无关:本文用不同城市、不同天气条件实测均为 0,`short_rad` 同时刻正常。属于数据侧现象,见"进阶与边界"。 **Q3:`uv` 晚上是 0 正常吗?** 正常。紫外线随日照存在,实测曼谷夜间 `uv=0`、午后 `uv=9.4`。 **Q4:`short_rad` 单位一定是 W/m² 吗?** 是,文档字段说明标注 W/m²,实测量级(数百)也符合该单位的白天特征。 **Q5:14 天预报里有辐射字段吗?** 日级 `dayList` 只有 `uv`,没有四个辐射字段;需要辐射请用 3540-1(当前)或 3540-2(逐时)。 ## 下一步阅读 - [天气预报国际版:24 小时预报接入实战(逐小时天气卡片与出行提醒)](https://www.showapi.com/guides/global-weather-hourly-forecast-3540) - [天气预报国际版:当前天气接入实战(气温、体感、风、降水概率全字段)](https://www.showapi.com/guides/global-weather-current-weather-3540) - [天气预报国际版:返回字段全解(cityInfo / now / hourList / dayList 一文读懂)](https://www.showapi.com/guides/global-weather-response-fields-3540) - **本系列共 12 篇**:查看[天气预报国际版指南总目录](https://www.showapi.com/guides/global-weather-guides-3540)