
简介这份中国太阳辐射空间分布数据面向GIS分析、太阳能资源评估与能源规划相关从业者及研究者提供全国尺度的年均辐射空间分布信息可用于光伏选址、发电潜力估算与气候研究等场景。数据涵盖直接辐射、散射辐射与水平面总辐射三类指标单位均为kWh/m²空间分辨率达9弧秒精度较高适合中高级GIS用户进行栅格分析与可视化制图。资源包共13个文件约771.86MB以tif栅格数据为主体辅以xml元数据、pdf说明文档及ovr金字塔文件便于在ArcGIS、QGIS等平台直接加载与快速渲染。压缩包内附数据说明文档对指标含义、坐标信息与使用方式有清晰交代可减少前期理解成本。目前已有533人学习下载适合需要快速获取全国太阳辐射基础数据、开展能源评估或空间建模的读者参考使用。1. 中国太阳辐射空间分布数据从一张图到一套可复现的评估链路做光伏选址、农业光热评估或者建筑能耗模拟的人迟早会撞上同一个问题手里只有气象站那几十上百个点的实测辐射值可项目要的是全国任意一个经纬度上的太阳辐射量。中国太阳辐射空间分布数据就是干这个的——它把离散的地面观测、卫星反演和再分析资料融合成一张覆盖全国、时间连续的辐射栅格让你在任意坐标上都能取到一个可用的数值。我第一次接触这类数据是为了给一个分布式光伏项目做初步选址当时天真地以为下载一个全国年均辐射图就够了结果被现实按在地上摩擦不同来源的数据在同一地点能差出百分之二三十直接决定一个项目是“优质资源区”还是“勉强够本”。这篇文章不讲空泛概念而是把中国太阳辐射空间分布数据从获取、理解、处理到验证的完整链路拆开让你能照着跑通一套自己的评估流程知道参数怎么设、坑在哪、什么情况下该换数据源。2. 太阳辐射空间分布数据的来源与选型地面站、卫星与再分析怎么选2.1 三类数据源的底层逻辑与适用边界中国太阳辐射空间分布数据的生产本质上是一个“空间插值物理反演”的混合问题。地面气象站测的是点上的真值精度高但空间代表性差全国参与辐射观测的站点长期只有百来个西部大片区域几乎是空白。卫星反演走的是另一条路通过静止气象卫星如风云系列观测云顶亮温和可见光反射率结合辐射传输模型反推地表短波辐射空间覆盖完整、时间分辨率高但受云检测和气溶胶假设影响在青藏高原这类复杂地形区容易系统性偏高或偏低。再分析资料如 ERA5则是用数值模式同化各种观测后输出的全球产品时间序列长、变量齐全但空间分辨率偏粗直接拿来用在中国复杂地形下会抹平很多局地特征。选型的核心不是找“最准”的数据而是找“在你的应用场景下误差可接受且空间代表性够用”的数据。做光伏电站的长期资源评估优先选时间序列长、经过地面站校准的融合产品做农业光热资源的空间格局分析卫星反演的高分辨率栅格更合适做气候趋势研究再分析资料的一致性更好。常见做法是先用再分析资料做宏观分区再用卫星产品做中尺度细化最后用地面站做局部校正。2.2 获取中国太阳辐射空间分布数据的实操路径目前国内可获取的公开辐射数据主要有几个渠道国家气象科学数据中心提供的辐射月报和年值、风云卫星产品服务网发布的卫星反演辐射产品、以及一些科研机构发布的融合数据集。下面以处理一份典型的全国辐射栅格数据为例走一遍从读取到裁剪的流程。import xarray as xr import numpy as np import rioxarray # 用于栅格裁剪和投影 # 打开一份假设的全国太阳辐射年均值 NetCDF 文件 # 实际文件名和变量名需根据你下载的数据集调整 ds xr.open_dataset(china_solar_radiation_annual.nc) # 查看数据结构维度、变量、坐标范围 print(ds) # 典型输出会包含 time, lat, lon 三个维度 # 辐射变量名可能是 ssrd, srad, ghi 等单位多为 W/m² 或 MJ/m²/day # 假设变量名为 ghi单位是 W/m² # 先做单位换算W/m² 转 MJ/m²/day 需乘以 0.0864 ghi_mj ds[ghi] * 0.0864 # 按经纬度范围裁剪出目标区域例如长三角 # 注意 lat 可能是从北到南递减裁剪时要确认顺序 target ghi_mj.sel( latslice(35, 28), # 纬度范围根据数据实际顺序调整 lonslice(115, 123) # 经度范围 ) # 如果数据是月值做年均需要按时间维度平均 # annual_mean target.mean(dimtime) # 导出为 GeoTIFF方便在 GIS 里叠加其他图层 target.rio.to_raster(yangtze_solar_radiation.tif)这段代码的关键点有三个。第一单位换算必须做W/m² 和 MJ/m²/day 之间的系数是 0.0864很多人在这一步翻车导致后续发电量估算差出一个数量级。第二sel里的slice顺序取决于数据本身的坐标排列如果 lat 是从 -90 到 90 递增slice(28, 35)才是对的写反了会得到空数组。第三导出 GeoTIFF 前要确认数据的 CRS坐标参考系统WGS84 是常见默认值但如果数据用的是其他投影需要先rio.write_crs()再导出。2.3 分辨率与时间粒度的权衡中国太阳辐射空间分布数据的分辨率从 0.1° 到 10km 不等时间粒度从小时到年值都有。分辨率越高数据量越大局地细节越丰富但噪声也越明显。我一般会遵循一个原则如果做的是省级以上的宏观规划0.25° 到 0.1° 足够如果做的是具体电站的初步设计至少要用 5km 以下的数据并且最好有小时值来算系统效率。时间粒度上年均值适合做资源分区月值适合做季节性评估小时值才能支撑发电量模拟。不要拿年均值去算一个具体电站的收益那是典型的误用。3. 把辐射栅格用起来从数据到发电量估算的关键步骤3.1 倾斜面辐射转换水平面数据不能直接算发电量拿到中国太阳辐射空间分布数据后绝大多数人第一步就错了——直接拿水平面总辐射GHI去乘组件面积和效率。光伏组件是倾斜安装的倾斜面上的辐射量POA才是决定发电量的直接输入。从 GHI 到 POA 需要经过直散分离和倾斜面转换两步。直散分离是把 GHI 拆成直接辐射DNI和散射辐射DHI常用模型有 Erbs 模型和 Perez 模型。倾斜面转换则要考虑太阳位置、组件倾角和方位角。import pvlib import pandas as pd # 假设已有某地的小时级 GHI 数据单位 W/m² # 以及对应的太阳天顶角 times pd.date_range(2023-01-01, periods8760, freqh, tzAsia/Shanghai) ghi pd.Series(500, indextimes) # 这里用常数示意实际替换为真实数据 # 用 Erbs 模型做直散分离 dni pvlib.irradiance.dni( ghighi, dhipvlib.irradiance.disc(ghi, times.dayofyear, times)[1], zenith30 # 这里用固定值示意实际需计算太阳位置 ) # 更完整的做法先算太阳位置再做分离和转换 solar_position pvlib.solarposition.get_solarposition(times, latitude31.2, longitude121.5) dni_extra pvlib.irradiance.get_extra_radiation(times.dayofyear) disc pvlib.irradiance.disc(ghi, solar_position[zenith], times.dayofyear) dni disc[dni] dhi disc[dhi] # 倾斜面转换假设组件倾角 25°方位角正南 poa pvlib.irradiance.get_total_irradiance( surface_tilt25, surface_azimuth180, solar_zenithsolar_position[zenith], solar_azimuthsolar_position[azimuth], dnidni, ghighi, dhidhi ) print(poa[poa_global].sum() / 1000) # 单位转为 kWh/m²这段代码里disc函数返回的是一个字典包含dni和dhi两个键直接取[1]是错误写法必须用键名。get_total_irradiance返回的poa_global才是倾斜面上的总辐射。参数方面surface_tilt一般取当地纬度附近surface_azimuth北半球取 180正南。如果做的是跟踪支架倾角和方位角需要按跟踪策略动态计算不能用固定值。3.2 从 POA 到发电量系统效率与温度修正有了 POA 之后发电量估算还要乘上一串效率系数组件效率、逆变器效率、线损、灰尘遮挡、温度修正。其中温度修正对结果影响最大夏季高温时组件温度能到 60°C 以上效率比标准条件下降 10% 到 15%。常见做法是用 NOCT 模型估算组件温度再按温度系数修正功率。# 组件温度估算NOCT 模型 # T_cell T_amb (NOCT - 20) / 800 * POA t_amb 25 # 环境温度实际应从气象数据获取 noct 45 # 标称工作温度查组件手册 poa_series poa[poa_global] t_cell t_amb (noct - 20) / 800 * poa_series # 温度修正功率温度系数一般取 -0.35%/°C gamma -0.0035 power poa_series * (1 gamma * (t_cell - 25)) # 再乘系统效率逆变器、线损、灰尘等综合取 0.8 左右 energy power.sum() / 1000 * 0.8 print(f年发电量估算{energy:.1f} kWh/kWp)这里gamma取 -0.0035 是晶硅组件的典型值薄膜组件会不同。系统效率 0.8 是一个粗略的综合系数实际项目要分项计算。注意power的单位是 W/kWp因为 POA 是 W/m²而组件标称功率对应 1000 W/m² 的辐照度所以这里隐含了组件面积归一化。3.3 空间分布数据的批量处理技巧实际项目中很少只算一个点往往要对一个区域内的所有栅格逐点计算。用 xarray 的apply_ufunc可以避免写循环效率高很多。但要注意pvlib的函数大多不接受 xarray 的 DataArray需要先转成 numpy 数组再包回去。另一个技巧是先把数据按时间维度聚合比如算日均值再插值到小时能大幅减少计算量但会损失日内变化信息适合做初步筛选而不是最终设计。4. 中国太阳辐射空间分布数据的避坑与排查五个血泪教训4.1 坑一单位混乱导致结果差一个数量级现象算出来的发电量要么高得离谱每千瓦年发几万度要么低得可怜几十度。原因辐射数据的单位没有统一。W/m²、MJ/m²/day、kWh/m²/day 之间需要换算W/m² 乘 0.0864 得 MJ/m²/day再除 3.6 得 kWh/m²/day。有些数据集标注的单位和实际存储的不一致比如标着 W/m² 实际是 0.1 W/m² 的整数存储。解决拿到数据先看数值范围全球年均 GHI 在 1000 到 2500 kWh/m² 之间如果算出来是几百或几万单位肯定错了。用ds[ghi].max()和.min()快速检查。4.2 坑二经纬度顺序和范围搞反现象裁剪出来的区域是空的或者跑到国外去了。原因不同数据集的 lat 排列顺序不同有的从南到北递增有的从北到南递减。sel里的slice必须按数据实际顺序写。解决先print(ds[lat].values[:5])看前五个值确认递增还是递减。如果是递减slice(35, 28)是对的如果是递增要写slice(28, 35)。另外注意经度范围中国大致在 73°E 到 135°E纬度在 18°N 到 54°N超出这个范围的数据要检查是不是全球数据没裁剪。4.3 坑三卫星数据在青藏高原的系统性偏差现象同一地点卫星反演的 GHI 比地面站实测高 15% 到 25%。原因青藏高原海拔高、气溶胶少、云量少卫星反演算法中的气溶胶假设和云检测阈值在这里容易失效导致直接辐射被高估。解决如果项目涉及青藏高原优先用经过地面站校准的融合数据或者用地面站数据对卫星产品做偏差校正。校正方法可以用线性回归ghi_corrected a * ghi_satellite b用附近站点的实测值拟合 a 和 b。4.4 坑四时间维度的时区问题现象小时级辐射数据的峰值出现在错误的时间比如正午峰值跑到下午三四点。原因数据存储用的是 UTC 时间而你没有转成当地时间。中国统一用北京时间UTC8如果数据是 UTC需要加 8 小时。解决用ds[time] pd.Timedelta(hours8)转换或者在读取时指定decode_times和时区参数。注意有些再分析资料用的是当地太阳时和北京时间还有差异做精细模拟时要统一到真太阳时。4.5 坑五直接拿年均值算项目收益现象项目建议书里的发电量和实际运行数据差 20% 以上。原因年均值抹平了季节波动和年际波动而光伏项目的收益受冬季低辐照和夏季高温的双重影响。解决至少用月值数据做逐月估算再用小时值做典型日模拟。如果只有年均值可以用月度分布系数做粗略拆分但误差会很大。我一般会要求项目评估必须用到小时级或至少日级数据年均值只用于初筛。5. 用地面站实测数据验证辐射栅格的精度一套可复现的校验流程中国太阳辐射空间分布数据到底准不准不能靠感觉得用独立的地面站数据做交叉验证。我一般会留出 20% 的站点不参与数据融合专门用来做验证。具体流程是从栅格数据中提取验证站点所在位置的辐射值和站点实测值做配对然后算几个指标——平均偏差MBE、均方根误差RMSE、相关系数R。MBE 看系统性偏差RMSE 看整体误差水平R 看时间变化的一致性。import pandas as pd import numpy as np from sklearn.metrics import mean_squared_error, r2_score # 假设有验证站点的实测日均 GHI 和从栅格提取的对应值 # station_ghi: 实测值序列grid_ghi: 栅格提取值序列 station_ghi np.array([...]) # 替换为真实数据 grid_ghi np.array([...]) # 计算偏差指标 mbe np.mean(grid_ghi - station_ghi) rmse np.sqrt(mean_squared_error(station_ghi, grid_ghi)) r2 r2_score(station_ghi, grid_ghi) print(fMBE: {mbe:.2f} W/m²) print(fRMSE: {rmse:.2f} W/m²) print(fR²: {r2:.3f}) # 如果 MBE 绝对值大于 RMSE 的 30%说明存在系统性偏差 # 可以用线性回归做偏差校正 from scipy.stats import linregress slope, intercept, r_value, p_value, std_err linregress(station_ghi, grid_ghi) grid_corrected slope * grid_ghi intercept print(f校正后 RMSE: {np.sqrt(mean_squared_error(station_ghi, grid_corrected)):.2f} W/m²)这段代码里linregress返回的slope和intercept就是校正系数。如果slope接近 1 且intercept接近 0说明栅格数据本身没有大的系统偏差不需要校正。如果slope明显偏离 1比如 0.85说明栅格数据在高值区偏低需要乘一个系数拉回来。校正后的 RMSE 如果比校正前下降超过 10%说明校正有效。验证时要注意几个细节。第一站点和栅格的时间匹配要严格日均值对日均值月均值对月均值不能混。第二站点周围的地形要平坦如果站点在山顶或峡谷空间代表性差验证结果会失真。第三验证站点的数量要足够至少 10 个以上才有统计意义而且最好分布在不同气候区。我自己的习惯是每拿到一套新的辐射数据先跑一遍验证流程RMSE 超过 30 W/m²日均值的数据我不会直接用于项目评估要么做校正要么换数据源。这套流程跑下来大概半天时间但能省掉后面无数次的返工和扯皮。希望帮到你。本文还有配套的精品资源点击获取