需求:根据非规则经纬度坐标,查找均匀网格点上最接近的经纬度坐标,并提取该点上的变量。
思路:
- 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的海洋人 水平有限,欢迎指正!!! 欢迎评论、收藏、点赞、转发、关注。 关注我不后悔,记录学习进步的过程~~