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')


a8e314bf84634045849a47fc7589c656.png


结果很明显,肉眼看上去是最邻近的点,应该是没有问题的。有兴趣的小伙伴可以尝试一下~


 

                一个努力学习python的海洋人
                水平有限,欢迎指正!!!
                欢迎评论、收藏、点赞、转发、关注。
                关注我不后悔,记录学习进步的过程~~


相关文章
|
7月前
|
数据可视化 数据挖掘 数据处理
python 盒装图纵坐标单位
【4月更文挑战第1天】
|
7月前
|
Python
python用鼠标获取图像任一点的坐标和像素值
python用鼠标获取图像任一点的坐标和像素值
|
2月前
|
Python
【10月更文挑战第15天】「Mac上学Python 26」小学奥数篇12 - 图形变换与坐标计算
本篇将通过 Python 和 Cangjie 双语实现图形变换与坐标计算。这个题目帮助学生理解平面几何中的旋转、平移和对称变换,并学会用编程实现坐标变化。
66 1
|
2月前
|
小程序 定位技术 Python
Python编程:根据经纬度生成并调用地图
Python编程:根据经纬度生成并调用地图
|
2月前
|
数据可视化 Serverless Python
Python小事例—质地不均匀的硬币的概率统计
Python小事例—质地不均匀的硬币的概率统计
|
4月前
|
数据可视化 Python
Python 绘制误码率对比折线图,纵坐标是10次幂,即求对数
本文介绍了如何在Python中绘制误码率(BER)的对比折线图,特别指出纵坐标使用10次幂即对数形式来表示误码率,横坐标为信噪比(SNR),并提供了相应的绘图函数和使用示例。
46 2
|
4月前
|
Python
【Leetcode刷题Python】16. 最接近的三数之和
解决LeetCode "最接近的三数之和" 问题的Python实现,通过排序和双指针法,记录并更新与目标值最接近的三数之和。
40 1
|
5月前
|
机器学习/深度学习 数据采集 算法
Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战
Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战
196 3
|
5月前
|
机器学习/深度学习 数据采集 自然语言处理
Python实现支持向量机SVM分类模型(SVC算法)并应用网格搜索算法调优项目实战
Python实现支持向量机SVM分类模型(SVC算法)并应用网格搜索算法调优项目实战
220 0
|
5月前
|
机器学习/深度学习 数据采集 算法
Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战
Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战
150 0