气象互助社 发表于 2024-4-29 16:51:56

MPAS模式后处理,寻找距离观测站点最近的网格点


气象和海洋领域涉及到很多站点数据的应用,比如气象站点观测、海洋浮标数据等,而且非结构网格的模式的输出数据也可以视为站点类型的数据,如MPAS,FVCOM,ADCIRC等大气或者海洋模式。


MPAS-A非结构网格,其输出数据也类似于站点数据

一个常用的场景是,给点一个经纬度点A,从一组经纬度点中(也就是前述的站点数据)寻找距离A点最近的点。比如寻找距离气象观测站最近的模式网格点。

sklearn.neighbors其中的BallTree类可以直接找到最近邻。通过建立一组离散点的BallTree,可以方便的搜索到这一组离散点中距离目标位置最近的点的索引,并计算最近距离。

下面以MPAS模式的一个后处理为例,给定气象观测站点的经纬度,然后寻找模式网格中距离观测站最近的网格点,从而读取模式模拟结果与观测资料进行对比,评估模拟结果。



以下为全部代码:
import netCDF4 as nc4
from sklearn.neighbors import BallTree
import numpy as np

## 构建BallTree
def cells_tree(cellsLatLon):
    # lat and lon unit: radian
    tree = BallTree(cellsLatLon, metric='haversine')
    return tree

## 给定观测站点的经纬度,求最近网格点的距离和索引
def nearest_cell_index(lon, lat, tree):
    # lon, lat unit: radian
    coords = np.zeros((1,2))
    coords   = lat
    coords   = lon
    dist, index = tree.query(coords, k=1)
    dist = dist.flatten()*6371
    return dist, index

if __name__ == "__main__":
    rad = np.pi/180.0
    latSite = 25.0* rad# 观测站点位置
    lonSite = 110.0 * rad

    ## 读取MPAS网格经纬度
    fileModel = nc4.Dataset(mpas_output_file, mode='r')
    latCell= fileModel.variables["latCell"][:]# unit: radian
    lonCell= fileModel.variables["lonCell"][:]

    cellsLatLon = []
    for i in range(len(latCell)):
      cellsLatLon.append((latCell<i>, lonCell))</i>

    # 构建BallTree
    tree = cells_tree(cellsLatLon)
    # 计算最近网格和观测站点的距离,并返回最近网格的索引
    distMin, near_cell_index =nearest_cell_index(lonSite, latSite, tree)





文章来源于微信公众号:气海同途
页: [1]
查看完整版本: MPAS模式后处理,寻找距离观测站点最近的网格点