【问题标题】:Find values within a radius from multiples lat lon centers in a NetCDF从 NetCDF 中的多个纬度中心查找半径内的值
【发布时间】:2020-11-15 11:33:44
【问题描述】:

我有一个 netCDF 文件,其中包含多个旋风位置(纬度、经度)和特定时间南半球的气温。

我想要的是提取距离每个气旋位置中心10测地线(~1110公里)半径内的温度值。我们的想法是识别与每个旋风分离器相关的温度值(假设距旋风分离器中心的最大径向距离为 10º)并绘制一个仅包含这些温度值的全局轮廓图。

我在这里进行了很多搜索,但我只找到了适用于距一个特定纬度中心的距离的代码(例如:how to find values within a radius from a central position of latitude and longitude value)。

我陷入了如何一次对多个中心应用 Haversine 公式。

import xarray as xr
import numpy as np
import matplotlib.pyplot as plt

d = xr.open_dataset('cyc_temp.nc')
lat = d['lat']
lon = d['lon']
cyc_pos = d['id'][:,:]
temp = d['temp'][:,:]

# Haversine formula

def 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

如果有人可以帮助我,我会很感激。

【问题讨论】:

标签: python matplotlib netcdf python-xarray haversine


【解决方案1】:

这是一个有趣的问题; 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.(coord="lat"), lon, lat)

如果你想要一个特定风暴的面具,你可以使用:

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

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

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

【讨论】:

  • 不知道,因为你的回答真的解决了我的问题!我什至没有想到会这么简单,我需要多学习xarray。谢谢!
  • 很高兴听到它@Maartaud!
猜你喜欢
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多