需求:根据非规则经纬度坐标,查找均匀网格点上最接近的经纬度坐标,并提取该点上的变量。
思路:
- 1、首先选取一个较大的经纬度范围,将你的非规则经纬度坐标包含进去;
- 2、计算均匀网格点上经纬度与非规则经纬度坐标的绝对值距离;
- 3、选择绝对值距离最短的点的索引坐标;
- 4、根据索引坐标提取最邻近的经纬度坐标
- 5、选取最近邻经纬度坐标对应的变量
数据:
海表面高度异常数据:sla
分辨率:0.25X0.25
数据类型:2017年月平均数据(netcdf)
代码实现:
主要用到几个库:xarray、numpy、matplotplib
通过xarray读取nc
文件,选取数据范围,
根据np.abs()
计算两点间绝对值,
通过np.where()
查找绝对值最小的网格点的索引index
全部代码如下:
## import package
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
## set path
path1=r'sla/'
str1='2017'
str2='.nc'
#file=glob.glob(path+'*.nc')
####=======================================================================================================================================
## 设置一个空矩阵存储每个月的sla数据
sla2017=np.zeros((12,1))
sla2017[:]=np.nan
i=0
fig=plt.figure(figsize=(10,10))
### 由于是月平均数据,共有12个,所以需要循环读取12次
for i in range(0,12):
f=path1+str1+'%02.0f'%int(i+1)+str2
print(i)
#137°36.533′ 34°40.917′
data=xr.open_dataset(f).sel(latitude=slice(33,36),longitude=slice(136,139))
x=data.longitude
y=data.latitude
time=data.time
sla=data.sla
x1,y1=np.meshgrid(x,y)
##### request longitude\latitude指定的非规则经纬度坐标,根据需求修改
lat = 34.921
lon = 137.748
### 计算绝对值
abslat = np.abs(y-lat)
abslon = np.abs(x-lon)
### 就是计算三角形斜边的最小值
c=(abslat**2+abslon**2).data
## 找到最小值的坐标索引
([xloc], [yloc]) = np.where(c == np.min(c))
r = np.where(c == np.min(c))
##### the nearest point longitude\latitude
lon_new=x[r[1].data].data
lat_new=y[r[0].data].data
### 重新选择最邻近点的数据
ds=data.sel(latitude=slice(lat_new,lat_new),longitude=slice(lon_new,lon_new))
### 将新的选取的数据保存下来
sla_new=ds.sla
sla2017[i,:]=sla_new
i=i+1
### 在图中以散点的方式查看最邻近的坐标
data.sla.plot()
plt.scatter(x1, y1)
point = data.sel(latitude=slice(sla.latitude[xloc],sla.latitude[xloc]), longitude=slice(sla.longitude[yloc],sla.longitude[yloc]))
plt.scatter(lon, lat, color='b')
plt.text(lon, lat, 'requested')
plt.scatter(lon_new, lat_new, color='r')
plt.text (lon_new, lat_new, 'nearest')
结果很明显,肉眼看上去是最邻近的点,应该是没有问题的。有兴趣的小伙伴可以尝试一下~
一个努力学习python的海洋人
水平有限,欢迎指正!!!
欢迎评论、收藏、点赞、转发、关注。
关注我不后悔,记录学习进步的过程~~