繁体   English   中英

特定地理位置的 CMEMS.netcdf 文件中的温度和盐度

[英]Temperature and Salinty from CMEMS netcdf file for specific geographical location

我想获取特定地理位置的海面(仅顶层)的温度['thetao']和盐度['so']

我在该网站上找到了有关如何执行此操作的指南。

import netCDF4 as nc
import numpy as np

fn = "\\...\...\Downloads\global-analysis-forecast-phy-001-024_1647367066622.nc"  # path to netcdf file

ds = nc.Dataset(fn)  # read as netcdf dataset

print(ds)
print(ds.variables.keys()) # get all variable names

temp = ds.variables['thetao']
sal = ds.variables['so']
lat,lon = ds.variables['latitude'], ds.variables['longitude']

# extract lat/lon values (in degrees) to numpy arrays
latvals = lat[:]; lonvals = lon[:]

# a function to find the index of the point closest pt
# (in squared distance) to give lat/lon value.
def getclosest_ij(lats,lons,latpt,lonpt):
  # find squared distance of every point on grid
  dist_sq = (lats-latpt)**2 + (lons-lonpt)**2
  # 1D index of minimum dist_sq element
  minindex_flattened = dist_sq.argmin()
  # Get 2D index for latvals and lonvals arrays from 1D index
  return np.unravel_index(minindex_flattened, lats.shape)

iy_min, ix_min = getclosest_ij(latvals, lonvals, 50., -140)
print(iy_min)
print(ix_min)


# Read values out of the netCDF file for temperature and salinity
print('%7.4f %s' % (temp[0,0,iy_min,ix_min], temp.units))
print('%7.4f %s' % (sal[0,0,iy_min,ix_min], sal.units))

我正在使用的 nc 文件的一些细节:

dimensions(sizes): time(1), depth(1), latitude(2041), longitude(4320)
 variables(dimensions): float32 depth(depth), float32 latitude(latitude), int16 thetao(time, depth, latitude, longitude), float32 time(time), int16 so(time, depth, latitude, longitude), float32 longitude(longitude)
    groups:
dict_keys(['depth', 'latitude', 'thetao', 'time', 'so', 'longitude'])

我收到此错误:

dist_sq = (lats-latpt)**2 + (lons-lonpt)**2
ValueError: operands could not be broadcast together with shapes (2041,) (4320,)

我怀疑形状/数组有问题。 在网站示例(上面的链接)中,纬度和经度有一个 (x,y),但是这个 NC 文件只有纬度 (2041,) 和经度 (4320,)。

我该如何解决这个问题?

这是因为 lats 和 lons 是具有不同大小的向量......

如果使用 WGS84 或度数作为单位,我通常会这样做:

lonm,latm = np.meshgrid(lons,lats)
dmat = (np.cos(latm*np.pi/180.0)*(lonm-lonpt)*60.*1852)**2+((latm-latpt)*60.*1852)**2

现在你可以找到最近的点:

kkd = np.where(dmat==np.nanmin(dmat))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM