python--根据任意非网格经纬度坐标,找到均匀网格点上最接近的经纬度坐标

需求:根据非规则经纬度坐标,查找均匀网格点上最接近的经纬度坐标,并提取该点上的变量。

思路:

  • 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的海洋人
                水平有限,欢迎指正!!!
                欢迎评论、收藏、点赞、转发、关注。
                关注我不后悔,记录学习进步的过程~~
  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简朴-ocean

继续进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值