为了账号安全,请及时绑定邮箱和手机立即绑定

从 NetCDF 中的多个经纬度中心查找半径内的值

从 NetCDF 中的多个经纬度中心查找半径内的值

qq_花开花谢_0 2023-03-30 16:46:54
我有一个 netCDF 文件,其中包含多个气旋位置(纬度、经度)和特定时间南半球的气温。我想要的是从每个气旋位置的中心提取 10 测地线度数(~1110 公里)半径范围内的温度值。这个想法是确定与每个气旋相关的温度值(假设距气旋中心的最大径向距离为 10º),并绘制一个仅包含这些温度值的全局 contourf 地图。我在这里搜索了很多,但我只找到了适用于与一个特定经纬度中心的距离的代码(比如这个:如何从纬度和经度值的中心位置找到半径内的值)。我一直在研究如何同时为多个中心应用 Haversine 公式。import xarray as xrimport numpy as npimport matplotlib.pyplot as pltd = xr.open_dataset('cyc_temp.nc')lat = d['lat']lon = d['lon']cyc_pos = d['id'][:,:]temp = d['temp'][:,:]# Haversine formuladef haversine(lon1, lat1, lon2, lat2):    # convert decimal degrees to radians    lon1 = np.deg2rad(lon1)    lon2 = np.deg2rad(lon2)    lat1 = np.deg2rad(lat1)    lat2 = np.deg2rad(lat2)    # haversine formula    dlon = lon2 - lon1    dlat = lat2 - lat1    a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2    c = 2 * np.arcsin(np.sqrt(a))    r = 6371    return c * r如果有人可以帮助我,我会很感激。
查看完整描述

1 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

这是一个有趣的问题;xarray 的自动广播使它非常干净。


我不确定气旋位置数组的结构,但我假设它的结构如下(或者至少可以操纵成这种形式):


centers = np.array([[12.0, -62.0], [40.0, -80.0], [67.0, -55.0]])

cyc_pos = xr.DataArray(centers, coords={"coord": ["lon", "lat"]}, dims=["cyclone", "coord"])

换句话说,每一行代表每个旋风的经度和纬度值。


以cyc_pos这种方式定义,使用该函数获取经纬度网格中的每个点到每个气旋中心的距离haversine非常简单,从那里获取所需的掩码仅需多一行。


distances = haversine(cyc_pos.sel(coord="lon"), cyc_pos.sel(coord="lat"), lon, lat)

如果您想要针对特定风暴的面罩,您可以使用:


storm_id = 0

mask = (distances <= 1110.0).isel(cyclone=storm_id)

或者,如果您想要一个可以应对所有风暴的面具,您可以使用:


mask = (distances <= 1110.0).any("cyclone")


查看完整回答
反对 回复 2023-03-30
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信