本文介绍来自德国气象局的数值天气预测(Numerical Weather Predicition, NWP)的数据源, 以及综合使用cdogdal等工具将其进行一些处理如绘制图像的方法。

1. ICON 模型

德国气象局使用的预测模型,称为ICON(Icosahedral Nonhydrostatic)模型, 这种模型将地球表面划分成类似正二十面体一样的20个三角形, 对每个区域细分成面积约173平方公里的小三角形单元进行计算。 相比于传统的使用经纬度进行计算的方案,这种划分方式能更加均匀地处理地球上各个地区的预测问题, 避免传统方案在接近极地时的种种问题。[1]

ICON的全球预测模型每日运行4次,分别在UTC时间0时、6时、12时和18时发布。 预测数据地理上精度约为0.125度每格,时间范围达180小时,其中0-78小时内是逐小时预测,78小时之外逐3小时预测。

此外对于欧洲地区,有精细度更高的预测模型,每日运行8次,相隔3小时,地理上精度为每格0.0625度,预测时间范围则与全球模型相同。

2. 使用 ICON 数据需要注意的法律规定

根据2017年7月25日修正的《德国气象局法(DWD-Gesetz)》, 一部分数据需要由德国气象局(Deutscher Wetterdienst, DWD)无偿发布。 为此设立了 https://opendata.dwd.de 这个网站。

虽然笔者认为在气象局法中并未将NWP数据划分为需要无偿发布的一类, 但DWD确实如同之前通过FTP方式一样也将这些数据发布在了这个网站上。 但因为NWP数据属于地理信息数据, 另一部联邦法令《用于确定联邦所发布地理信息的使用条款之法令(GeoNutzV)》 则明确于第2款第(1)条写明,此类数据在符合法规的情况下可无偿用于商业和非商业用途。

根据上述法令第3款的规定,使用这类数据需要2个条件:

  1. 地理信息数据、元数据和使用这些数据提供的服务,需要在明显的地方用可见的方式指明来源和法律提示。
  2. 如果对这些数据任何修改或处理,则应当或者说明进行了修改,或者在数据提供者有特别要求的情况下,删除数据来源的标识。

对于DWD的数据,建议的标识方式例如:

  • Datenbasis: Deutscher Wetterdienst, Rasterdaten bildlich wiedergegeben (数据来源:德国气象局,由点阵数据绘制)
  • Datenbasis: Deutscher Wetterdienst, Einzelwerte gemittelt (数据来源:德国气象局,各数值取平均值)
  • Datenbasis: Deutscher Wetterdienst, eigene Elemente ergänzt (数据来源:德国气象局,补充了自定义的内容)

删除数据来源的条件是,当使用数据的用途与DWD的业务目的不一致时。 例如尤其是对于天气预警类消息,如不能保证这类消息总是能完整、准时地抵达所有的用户时,就应当这样删去来源。[2]

3. 具体处理 ICON 数据的方式

3.1 使用命令行将数据按照不同的网格转换

为了使用 opendata.dwd.de 提供的数据,目前需要进行手动的转换,将ICON的自定义网格转换为我们常用的经纬度网格。

为此需要的工具是cdo这个程序(Climate Data Operator),在Ubuntu或Debian系统的软件源中可以找到。

此外还需要下载一些定义转换的参数文件,在这里:ICON_GLOBAL2WORLD_0125_EASY.tar.bz2 将文件使用bunzip2解压后,得到两个文件:target_grid_world_0125.txtweights_icogl2world_0125.nc

使用cdo进行转换[3]:

time cdo -f grb2 remap,target_grid_world-0125.txt,weights_icogl2world_0125.nc <输入文件> <输出文件>

输入文件,就是要转换的,从 https://opendata.dwd.de/weather/icon/global/grib/ 下载的.grib2结尾的文件(下载文件若是.bz2结尾,需要首先解压缩)。

输出文件可以是.grb2(GRIB2格式)或.nc(netCDF格式)结尾,这样cdo就可以输出相应格式的文件了。

如果cdo运行时出现错误,可能需要使用root权限运行(笔者猜测和内存分配有关)。

3.2 操作转换后的输出

之后,可以使用gdal软件包(在Ubuntu或Debian上,使用命令apt install gdal-bin安装),对文件进行各种操作。 用2017年12月1日18时得到的地表2米气温数据文件 ICON_iko_single_level_elements_world_T_2M_2017120118_051.grb2 为例说明如下。

查看元数据
$ gdalinfo ICON_iko_single_level_elements_world_T_2M_2017120118_051.grb2 # 查看.grb2文件的元数据

Driver: GRIB/GRIdded Binary (.grb)
Files: ICON_iko_single_level_elements_world_T_2M_2017120118_051.grb2
Size is 2879, 1441
Coordinate System is:
GEOGCS["Coordinate System imported from GRIB file",
    DATUM["unknown",
        SPHEROID["Sphere",6367470,0]],
    PRIMEM["Greenwich",0],
    UNIT["degree",0.0174532925199433]]
Origin = (179.937500000000000,90.062500000000000)
Pixel Size = (0.125000000000000,-0.125000000000000)
Corner Coordinates:
Upper Left  ( 179.9375000,  90.0625000) (179d56'15.00"E, 90d 3'45.00"N)
Lower Left  ( 179.9375000, -90.0625000) (179d56'15.00"E, 90d 3'45.00"S)
Upper Right (     539.812,      90.062) (Invalid angle, 90d 3'45.00"N)
Lower Right (     539.812,     -90.062) (Invalid angle, 90d 3'45.00"S)
Center      (     359.875,       0.000) (359d52'30.00"E,  0d 0' 0.01"N)
Band 1 Block=2879x1 Type=Float64, ColorInterp=Undefined
  Description = 2[m] HTGL="Specified height level above ground"
  Metadata:
    GRIB_COMMENT=Temperature [C]
    GRIB_ELEMENT=TMP
    GRIB_FORECAST_SECONDS=183600 sec
    GRIB_PDS_PDTN=0
    GRIB_PDS_TEMPLATE_NUMBERS=0 0 2 255 1 0 0 0 0 0 0 11 244 103 0 0 0 0 2 255 255 255 255 255 255
    GRIB_REF_TIME=  1512151200 sec UTC
    GRIB_SHORT_NAME=2-HTGL
    GRIB_UNIT=[C]
    GRIB_VALID_TIME=  1512334800 sec UTC
绘制图像

使用地表温度数据,可以利用命令绘制一幅图像。首先需要创建一个温度到色标的定义文件,取名color.txt,内容是:

-50       48  0   90
-25       12  67  196
0         255 255 255
25        250 182  57
35        170 0    20
45        74  0    10

之后使用命令:

$ gdaldem color-relief  ICON_iko_single_level_elements_world_T_2M_2017120118_051.grb2  color.txt  output.tiff

将 GRIB2 格式转换成 GeoTIFF 图像。接下来可以(需要 ImageMagick 软件包)将TIFF格式转换为更普遍的PNG图像格式:

$ convert output.tiff output.png

得到类似下图(已经过缩小)的效果:

OUTPUT