Field 类属性和方法详解
概述
Field
类是 ol-wind 库中用于管理风场数据的核心类,负责处理风场数据的网格化、坐标转换、插值计算等功能。它提供了完整的风场数据处理能力,支持各种坐标系统和边界条件。
实例属性
地理范围属性
xmin
, xmax
- 类型 :
Number
- 作用: 定义风场数据的经度范围
- 单位: 度(-180 到 180)
- 用途: 用于确定数据的地理覆盖范围
ymin
, ymax
- 类型 :
Number
- 作用: 定义风场数据的纬度范围
- 单位: 度(-90 到 90)
- 特点: 自动处理纬度顺序,确保 ymin < ymax
网格结构属性
cols
, rows
- 类型 :
Number
- 作用: 定义网格的尺寸
- 含义:
-
cols
: 经度方向的格点数rows
: 纬度方向的格点数
deltaX
, deltaY
- 类型 :
Number
- 作用: 定义网格的经纬度间隔
- 单位: 度
- 用途: 用于坐标转换和插值计算
grid
- 类型 :
Array<Array<Vector|null>>
- 作用: 存储风场数据的二维网格
- 内容 : 每个元素是
Vector
对象或null
,表示该格点的风向量 - 结构 :
grid[j][i]
表示第 j 行第 i 列的风向量
风场数据属性
us
, vs
- 类型 :
Array<Number>
- 作用: 存储风场的 U 和 V 分量数据
- 含义:
-
us
: 东西方向的风速分量vs
: 南北方向的风速分量
- 长度 : 通常为
cols * rows
range
- 类型 :
Array<Number>
- 作用: 存储风场数据中风速的范围
- 内容:
-
range[0]
: 最小风速值range[1]
: 最大风速值
- 用途: 用于颜色映射和可视化效果
坐标系统属性
flipY
- 类型 :
Boolean
- 作用: 标识纬度坐标是否需要翻转
- 默认值 : 如果
deltaY >= 0
且ymin < ymax
,则默认为true
- 用途: 处理不同数据源的坐标系统差异
isContinuous
- 类型 :
Boolean
- 作用: 标识数据是否覆盖完整的经度范围(360 度)
- 判断条件: 如果网格覆盖的经度范围 >= 360 度,则为连续数据
- 用途: 处理全球数据的边界连接
translateX
- 类型 :
Boolean
- 作用: 标识是否需要经度平移
- 默认值 : 如果
xmax > 180
,则默认为true
- 用途: 处理跨越 180° 经线的数据
wrapX
- 类型 :
Boolean
- 作用: 标识是否启用经度包装
- 用途: 允许查询超出数据范围的经度值,自动进行经度包装
类型标识属性
isFields
- 类型 :
Boolean
- 作用 : 标识对象是否为
Field
类的实例 - 用途: 用于类型检查和验证
实例方法
数据管理方法
constructor(params)
- 作用: 初始化风场数据字段,设置网格参数和数据处理选项
- 参数 :
params
- 包含所有初始化参数的对象 - 主要功能:
-
- 设置地理范围 (xmin, xmax, ymin, ymax)
- 设置网格尺寸 (cols, rows, deltaX, deltaY)
- 处理 U、V 分量数据
- 处理坐标翻转和连续性检测
- 构建网格并计算数值范围
buildGrid()
- 作用: 构建风场数据的二维网格
- 返回值 :
Array<Array<Vector|null>>
- 功能:
-
- 将一维的 U、V 分量数据转换为二维网格
- 创建 Vector 对象表示每个格点的风向量
- 处理连续数据的边界连接
release()
- 作用: 释放网格数据,清空内存
- 功能 : 将
this.grid
设置为空数组,释放内存资源
extent()
- 作用: 获取格点数据的地理范围
- 返回值 :
Array<Number>
-[xmin, ymin, xmax, ymax]
插值计算方法
bilinearInterpolateVector(x, y, g00, g10, g01, g11)
- 作用: 对向量进行双线性插值
- 参数:
-
x, y
: 插值位置(0-1 之间的相对坐标)g00, g10, g01, g11
: 四个相邻格点的向量
- 返回值 :
Vector
- 插值后的向量 - 功能: 根据四个相邻格点的向量值,计算中间点的向量值
interpolatePoint(i, j)
- 作用: 基于向量的双线性插值
- 参数 :
i, j
- 网格索引(可以是小数) - 返回值 :
Vector|null
- 插值后的向量或 null - 功能: 获取四个周围格点的值并进行插值计算
interpolatedValueAt(lon, lat)
- 作用: 获取指定经纬度的插值结果
- 参数 :
lon, lat
- 经纬度坐标 - 返回值 :
Vector|null
- 插值后的向量或 null - 功能: 使用双线性插值计算任意位置的风向量值
数据查询方法
valueAt(lon, lat)
- 作用: 获取指定经纬度的最近邻值
- 参数 :
lon, lat
- 经纬度坐标 - 返回值 :
Vector|null
- 最接近格点的风向量值或 null - 功能: 使用线性插值获取最接近格点的风向量值
hasValueAt(lon, lat)
- 作用: 检查指定位置是否有有效值
- 参数 :
lon, lat
- 经纬度坐标 - 返回值 :
Boolean
- 是否存在有效数据 - 功能: 判断指定经纬度位置是否存在风场数据
valueAtIndexes(i, j)
- 作用: 根据网格索引获取值
- 参数 :
i, j
- 网格索引(整数) - 返回值 :
Vector|null
- 指定位置的向量值 - 功能: 直接从网格中获取指定位置的向量值
坐标转换方法
getDecimalIndexes(lon, lat)
- 作用: 获取经纬度对应的网格索引
- 参数 :
lon, lat
- 经纬度坐标 - 返回值 :
Array<Number>
-[i, j]
数组,表示网格索引 - 功能: 将地理坐标转换为网格索引位置
lonLatAtIndexes(i, j)
- 作用: 根据网格索引获取经纬度
- 参数 :
i, j
- 网格索引(整数) - 返回值 :
Array<Number>
-[lon, lat]
数组 - 功能: 将网格索引转换为对应的地理坐标
longitudeAtX(i)
- 作用: 根据网格索引获取经度
- 参数 :
i
- 列索引(整数) - 返回值 :
Number
- 经度值 - 功能: 计算格点中心的经度坐标
latitudeAtY(j)
- 作用: 根据网格索引获取纬度
- 参数 :
j
- 行索引(整数) - 返回值 :
Number
- 纬度值 - 功能: 计算格点中心的纬度坐标
边界处理方法
getWrappedLongitudes()
- 作用: 获取经度包装后的范围
- 返回值 :
Array<Number>
-[xmin, xmax]
数组 - 功能: 处理跨越 180° 经线的数据,确保经度范围正确
contains(lon, lat)
- 作用: 检查指定经纬度是否在数据范围内
- 参数 :
lon, lat
- 经纬度坐标 - 返回值 :
Boolean
- 是否在范围内 - 功能: 考虑经度包装,判断坐标点是否在风场数据覆盖区域内
clampColumnIndex(ii)
- 作用: 限制列索引在有效范围内
- 参数 :
ii
- 原始列索引 - 返回值 :
Number
- 修正后的列索引 - 功能: 确保列索引不会超出网格边界
clampRowIndex(jj)
- 作用: 限制行索引在有效范围内
- 参数 :
jj
- 原始行索引 - 返回值 :
Number
- 修正后的行索引 - 功能: 确保行索引不会超出网格边界
辅助计算方法
calculateRange()
- 作用: 计算向量值的范围
- 返回值 :
Array<Number>
-[min, max]
数组 - 功能: 遍历整个网格,找出风速的最小值和最大值
isValid(x)
- 作用: 检查数值是否有效
- 参数 :
x
- 要检查的数值 - 返回值 :
Boolean
- 是否有效 - 功能: 判断值是否为 null 或 undefined
getFourSurroundingIndexes(i, j)
- 作用: 计算周围四个格点的索引
- 参数 :
i, j
- 中心点索引(可以是小数) - 返回值 :
Array<Number>
-[fi, ci, fj, cj]
数组 - 功能: 获取用于插值的四个相邻格点位置
getFourSurroundingValues(fi, ci, fj, cj)
- 作用: 获取四个周围格点的值
- 参数 :
fi, ci, fj, cj
- 四个格点的索引 - 返回值 :
Array<Vector>|null
- 四个向量值或 null - 功能: 从网格中提取四个相邻格点的向量值
粒子生成方法
randomize(o = {}, width, height, unproject)
- 作用: 生成随机粒子位置
- 参数:
-
o
- 输出对象(可选)width, height
- 生成范围(可选)unproject
- 坐标转换函数(可选)
- 返回值 :
Object
- 包含 x, y 坐标的对象 - 功能: 在指定范围内随机生成粒子位置,用于风场动画
类型检查方法
checkFields()
- 作用: 判断是否是 Field 实例
- 返回值 :
Boolean
- 是否为 Field 类实例 - 功能: 检查对象是否为 Field 类的实例
使用示例
JavaScript
// 创建 Field 实例
const field = new Field({
xmin: -180,
xmax: 180,
ymin: -90,
ymax: 90,
cols: 360,
rows: 180,
deltaX: 1,
deltaY: 1,
us: [...], // U 分量数据
vs: [...], // V 分量数据
flipY: true
});
// 获取指定位置的风向量
const vector = field.interpolatedValueAt(120.5, 30.2);
// 检查位置是否有数据
const hasData = field.hasValueAt(120.5, 30.2);
// 获取数据范围
const extent = field.extent();
const range = field.range;
// 生成随机粒子位置
const particle = field.randomize({}, 800, 600);
总结
Field
类提供了完整的风场数据处理能力,包括:
- 数据管理: 构建和管理风场数据的二维网格
- 空间查询: 提供基于经纬度的数据查询和插值功能
- 坐标转换: 处理地理坐标与网格索引之间的转换
- 边界处理: 处理经度包装和边界条件
- 插值计算: 提供线性和双线性插值功能
- 粒子生成: 为风场动画生成随机粒子位置
这些属性和方法共同构成了一个强大的风场数据处理系统,为风场可视化提供了全面的数据支持。