预处理系统 WPS 详解:以4.5版本为例
- [将静态数据写入 Geogrid 二进制格式](#将静态数据写入 Geogrid 二进制格式)
-
- [1. Geogrid 数据格式概述](#1. Geogrid 数据格式概述)
- [2. 分类字段(Categorical Fields)格式](#2. 分类字段(Categorical Fields)格式)
- [3. 连续字段(Continuous Fields)格式](#3. 连续字段(Continuous Fields)格式)
- [4. 文件组织与命名规则](#4. 文件组织与命名规则)
- [5. 元数据文件(index 文件)](#5. 元数据文件(index 文件))
- [NLCD Urban Fraction Field](#NLCD Urban Fraction Field)
-
- [1.1 下载 NLCD 数据](#1.1 下载 NLCD 数据)
- [1.2 转换 GeoTIFF 为二进制栅格格式](#1.2 转换 GeoTIFF 为二进制栅格格式)
- [1.3 提取城市类别并生成城市化比例场](#1.3 提取城市类别并生成城市化比例场)
- [1.4 创建元数据文件(index 文件)](#1.4 创建元数据文件(index 文件))
- [1.5 修改 GEOGRID.TBL 配置](#1.5 修改 GEOGRID.TBL 配置)
- [1.6 运行 geogrid](#1.6 运行 geogrid)
- [INDEX 选择](#INDEX 选择)
- 参考
将静态数据写入 Geogrid 二进制格式
WRF 的 WPS 模块(尤其是 geogrid)用于插值静态地理数据,存储这些数据的格式是 简单的二进制栅格格式。
1. Geogrid 数据格式概述
Geogrid 支持三种主要类型的地理数据集:
1、单层或多层连续字段:如地形高度。
2、以主导类别表示的分类字段:如 USGS 土地利用数据集中每个网格点的主要土地类型。
3、以每个类别的分数表示的分类字段:如每个网格点的各土地类型分布比例。
以下是 Geogrid 格式的核心特征:
- 数据存储为规则的 2D 或 3D 数组。
- 数据以行优先(从南到北)顺序写入到文件中。
- 文件中没有头部、记录标记或额外字节,所有数据按 big-endian 字节序 存储(可通过设置 index 文件中的 endian=little 使用 little-endian 字节序)。
2. 分类字段(Categorical Fields)格式
以主导类别为例,分类字段的存储格式如下:
- 数据表示:将网格点的主导类别存储为整数(1, 2, 3...)。
- 写入顺序:按行优先顺序写入文件,即从南到北、从西到东,逐行存储到文件中。
- 文件大小:每个元素使用 1、2、3 或 4 字节整数存储,所有元素必须使用相同的字节数。
示例
对于一个网格大小为 1000 × 1000 的分类字段,若每个值用 2 字节存储,文件大小为:
bash
1000 × 1000 × 2 = 2,000,000 字节
注意事项
Fortran 限制:Fortran 语言的非格式化写入会添加额外字节,因此不能直接生成 Geogrid 二进制文件。可以使用 Geogrid 提供的 C 函数 write_geogrid.c 来写入数据。
命名规则:文件名必须包括网格的起始和结束索引(五位整数),例如:
bash
00001-01200.00001-00800
表示一个 1200 × 800 网格矩阵。
3. 连续字段(Continuous Fields)格式
特点
连续字段(如地形高度)不同于分类字段,因为它们可能包含:
- 非整数值(如浮点数)。
- 负值。
处理步骤
1、缩放:将所有值按比例因子缩放为整数,以保留所需精度。例如:
- 若需要保留小数点后三位精度,-2.71828 被缩放为 -2718。
- 缩放因子为 1 / 所需精度,如 1 / 0.001 = 1000。
2、处理负值:将所有负值转换为正值:
在 WPS 静态数据中,连续字段(continuous fields) 可能包含负值,而 Geogrid 二进制格式要求字段值必须为正整数。因此,在写入文件前,负值需要通过以下方法调整为正值。
调整规则:每个负值通过增加一个常量变为正值:
- 1 字节存储:加上 2^8。
- 2 字节存储:加上 2^16。
- 3 字节存储:加上 2^24。
- 4 字节存储:加上 2^32。
3、写入文件:按分类字段的方式逐行写入。
多层连续字段
多层连续字段(如 3D 数据集)处理方式类似:每个层单独处理为 2D 数组,按层索引从低到高依次写入文件。
分类字段的分数表示
如果分类字段以分数形式表示(每个类别的分布比例),可视为多层连续字段,每一层对应一个类别的分数。
4. 文件组织与命名规则
单文件存储
文件名格式:xstart-xend.ystart-yend
- xstart 和 xend:x 方向的起始和结束索引。
- ystart 和 yend:y 方向的起始和结束索引。
- 索引必须从 1 开始,并用五位整数表示。
示例:
bash
00001-01200.00001-01200
表示一个 1200 × 1200 的网格。
多文件存储
- 如果数据集分为多个文件,每个文件必须是规则的矩形网格。
- 文件之间的网格范围不能重叠,且每个文件的网格维度必须相同。
- 若数据不能被整除分块,必须填充缺失值(missing_value)。
大数据集
如果网格点超过 99999(x 或 y 方向),需将数据分为多个数据集(如东、西半球分别存储)。
5. 元数据文件(index 文件)
每个数据集必须有一个名为 index 的元数据文件,描述数据的属性和组织方式。
示例 index 文件:
bash
type = continuous
signed = yes
projection = regular_ll
dx = 0.00833333
dy = 0.00833333
known_x = 1.0
known_y = 1.0
known_lat = -89.99583
known_lon = -179.99583
wordsize = 2
tile_x = 1200
tile_y = 1200
tile_z = 1
tile_bdr=3
units="meters MSL"
description="Topography height"
关键字段说明
type:
- categorical:分类字段。
- continuous:连续字段。
signed:
- yes:数据包含负值。
- no:数据仅包含正值。
projection:数据的投影类型(如 regular_ll 表示经纬度网格)。
dx/dy:x 和 y 方向的网格间距。
known_x/known_y/known_lat/known_lon:数据集中已知点的网格索引和经纬度。
wordsize:每个网格点存储所需字节数(1, 2, 3 或 4)。
tile_x/tile_y/tile_z:网格的 x, y, z 方向维度。
tile_bdr:网格边界的缓冲区大小。
units:数据的单位(如 meters MSL 表示海平面高度)。
description:数据的描述信息。
NLCD Urban Fraction Field
注意:美国大陆有基于 30 米 NLCD 2011 土地覆盖准备的城市分数字段;此数据集可从 WPS 地理静态数据下载页面的"可选字段"部分获取。
本部分内容详细描述如何使用NLCD(National Land Cover Database) 数据生成 WRF 使用的 城市化比例场(FRC_URB2D),在生成自己所需的城市分数字段时十分有用。
WRF 使用静态地理数据来模拟地表物理过程,其中城市化比例场(FRC_URB2D)可以通过高分辨率的 NLCD 数据生成。以下是具体步骤:
1.1 下载 NLCD 数据
1、前往 Multi-Resolution Land Characteristics Consortium (MRLC) 网站,选择合适的 NLCD 数据集(1992、2001、2006 或 2011)。
2、选择覆盖 WRF 模拟域的区域。
3、确保选择 GeoTIFF 格式,方便后续处理。
4、如果直接下载的是 BIL 格式,可以跳过格式转换步骤。
1.2 转换 GeoTIFF 为二进制栅格格式
1、解压下载的文件包,会包含一个 .tif 文件和 .tfw 文件。
2、使用 GDAL 工具(Geospatial Data Abstraction Library) 将 .tif 文件转换为 ENVI 格式的二进制文件:
bash
gdal_translate -of ENVI foo.tif data.bil
- foo.tif 是下载的 GeoTIFF 文件。
- data.bil 是生成的二进制文件,符合 geogrid 的栅格格式要求。
3、重命名文件:
根据生成的文件行数和列数,将 data.bil 重命名为:
bash
00001-ncols.00001-nrows
- ncols 是图像的列数(5 位整数,如 01200)。
- nrows 是图像的行数(5 位整数,如 00800)。
- 行列数可以在运行 gdal_translate 时打印的输出中找到。
1.3 提取城市类别并生成城市化比例场
使用一个转换程序,从二进制文件中提取城市类别(NLCD 中的城市类别通常对应特定值,如 21、22、23、24),并基于城市类别生成城市化比例场。
转换后的文件需要覆盖原始土地利用文件,命名规则同上(如 00001-ncols.00001-nrows)。
1.4 创建元数据文件(index 文件)
index 文件描述了栅格数据的基本信息,供 geogrid.exe 使用。以下是一个示例:
bash
type=continuous
projection=albers_nad83
dx=30.0
dy=30.0
known_x=1.0
known_y=2351.0 # <- 根据数据调整
known_lat = 40.096571 # <- 根据 .tfw 文件调整
known_lon = -105.405615 # <- 根据 .tfw 文件调整
truelat1=29.5
truelat2=45.5
stdlon=-96.0
wordsize=1
scale_factor=0.01
row_order=top_bottom
tile_x=2407 # <- 根据数据调整
tile_y=2351 # <- 根据数据调整
tile_z=1
units="unitless"
description="urban fraction"
关键字段说明:
- type:数据类型,城市化比例场为连续字段(continuous)。
- projection:投影方式,NLCD 使用 Albers Equal Area NAD83。
- dx/dy:网格分辨率(单位:米),NLCD 数据为 30 m。
- known_x, known_y:网格中已知点的索引。
- known_lat, known_lon:已知点的纬度和经度(从 .tfw 文件中获取)。
- wordsize:每个像素的存储字节数,这里为 1 字节。
- scale_factor:缩放因子,城市化比例场通常在 0-1 范围内,因此乘以 100 转换为整数存储。
- tile_x, tile_y:网格大小(行列数)。
- units:数据单位。
1.5 修改 GEOGRID.TBL 配置
在 WPS/geogrid 目录中,修改 GEOGRID.TBL 文件,添加以下条目:
bash
===============================
name=FRC_URB2D
priority=1
dest_type=continuous
fill_missing = 0.
interp_option=default: average_gcell(1.0)+four_pt
abs_path=default:/path/to/dataset/
===============================
- 替换 /path/to/dataset/ 为步骤 3 和 4 中生成文件所在的路径。
- fill_missing = 0. 指定缺失值填充的默认值为 0。
1.6 运行 geogrid
配置完成后,运行 geogrid.exe,生成包含 FRC_URB2D 的网格静态文件。
INDEX 选择
与 GEOGRID.TBL 相关的是与每个静态数据集相关的索引文件。索引文件定义特定于该数据集的参数,而 GEOGRID.TBL 文件描述地理网格应如何处理每个数据集。与 GEOGRID.TBL 一样,索引文件中的规范采用关键字=值的形式。以下是可能的关键字及其可能的值。