我试图在Python 3中使用地形/测深的信息(基本上是一个包含X [十位数的经度)的网格,y [小数点]和z [米] [米])。
网格文件具有扩展名.NC,因此是NetCDF文件。通常,我会将其用于映射诸如通用映射工具之类的映射工具中,而不必费心NetCDF文件的工作原理,但是我需要在Python脚本中提取特定信息。现在,这仅将数据集限制在某些经度/纬度范围内。
但是,现在我对特定x和y值的z信息有些丢失。这是我到目前为止对数据的了解
import netCDF4
#----------------------
# Load netCDF file
#----------------------
bathymetry_file = 'C:/Users/te279/Matlab/data/gebco_08.nc'
fh = netCDF4.Dataset(bathymetry_file, mode='r')
#----------------------
# Getting information about the file
#----------------------
print(fh.file_format)
netcdf3_classic
print(fh)
根组(NetCDF3_Classic数据模型,文件格式NETCDF3): 标题:GEBCO_08网格 资料来源:20100927 尺寸(尺寸):侧(2),xysize(933120000) 变量(尺寸):float64 x_range(侧),float64 y_range(侧),int16 z_range(侧),float64间距(侧),int32 dimension(侧),int16 z(xysize)(xysize) 组:
print(fh.dimensions.keys())
odict_keys(['side','xysize'])
print(fh.dimensions['side'])
:name ='side',size = 2
print(fh.dimensions['xysize'])
:name ='xysize',size = 933120000
#----------------------
# Variables
#----------------------
print(fh.variables.keys()) # returns all available variable keys
odict_keys(['x_range','y_range','z_range','spacing','dimension','z'])
xrange = fh.variables['x_range'][:]
print(xrange)
[-180。180.]#包含全世界经度的值-180至180
yrange = fh.variables['y_range'][:]
print(yrange)
[-90。90.]#包含整个世界纬度的值-90至90
zrange = fh.variables['z_range'][:]
[-10977 8685]#包含世界深度/地形范围
spacing = fh.variables['spacing'][:]
[0.00833333 0.00833333]#x和y中的间距。等于尺寸,如果乘以x和y范围
dimension = fh.variables['dimension'][:]
[43200 21600]#与z的形状相对应,如果是我希望的2D数组(目前是9333120000的1D数组 - 它是43200*21600)
z = fh.variables['z'][:] # currently an 1D array of the depth/topography/z information I want
fh.close
基于此信息,我仍然不知道如何访问z以获取特定的x/y(经度/纬度)值。我认为基本上我需要将z的1D数组转换为对应于经度/纬度值的2D数组。我只是不知道如何做到这一点。我在一些帖子中看到了人们试图将1D转换为2D阵列的帖子,但是我无法知道他们在世界的哪个角落以及他们的进步方式。
我知道有一个3岁的类似帖子,但是,我不知道如何为我的问题找到一个模拟"扁平阵列的索引" - 或如何与此相处。有人可以帮忙吗?
您需要先阅读z
的尺寸(LAT,LON,DEPTH)的所有三个,然后在每个维度中提取值。这是一些考试。
# Read in all 3 dimensions [lat x lon x depth]
z = fh.variables['z'][:,:,:]
# Topography at a single lat/lon/depth (1 value):
z_1 = z[5,5,5]
# Topography at all depths for a single lat/lon (1D array):
z_2 = z[5,5,:]
# Topography at all latitudes and longitudes for a single depth (2D array):
z_3 = z[:,:,5]
请注意,您输入的lat/lon/depth的数字是该维度的 index ,而不是实际的纬度。您需要先确定要事先寻找的值的索引。
我刚刚在这篇文章中找到了解决方案。抱歉,我以前没看到。这就是我的代码现在的样子。多亏了戴夫(他在上面的帖子中回答了自己的问题)。我唯一要处理的是尺寸必须保持整数。
import netCDF4
import numpy as np
#----------------------
# Load netCDF file
#----------------------
bathymetry_file = 'C:/Users/te279/Matlab/data/gebco_08.nc'
fh = netCDF4.Dataset(bathymetry_file, mode='r')
#----------------------
# Extract variables
#----------------------
xrange = fh.variables['x_range'][:]
yrange = fh.variables['y_range'][:]
zz = fh.variables['z'][:]
fh.close()
#----------------------
# Compute Lat/Lon
#----------------------
nx = (xrange[-1]-xrange[0])/spacing[0] # num pts in x-dir
ny = (yrange[-1]-yrange[0])/spacing[1] # num pts in y-dir
nx = nx.astype(np.integer)
ny = ny.astype(np.integer)
lon = np.linspace(xrange[0],xrange[-1],nx)
lat = np.linspace(yrange[0],yrange[-1],ny)
#----------------------
# Reshape the 1D to an 2D array
#----------------------
bathy = zz[:].reshape(ny, nx)
所以,现在,当我看着Zz和Bathy的形状(以下代码)时,前者是一个1D阵列,长度为933120000,后者是2D阵列,尺寸为43200x21600。
。print(zz.shape)
print(bathy.shape)
下一步是使用索引正确地访问测深/地形数据,就像N1B4在他的职位