如何批量对气象站点执行坐标变换查找最近网格点
批量实现方法
不用逐点写循环,直接用cartopy的批量坐标转换接口搭配xarray的向量化索引就能搞定,运行效率比逐点遍历高很多,具体实现逻辑如下:
- 坐标转换环节不用单点调用
transform_point(),改用投影对象的transform_points()方法,直接传入所有站点的经纬度数组,一次性完成全量坐标转换 - 匹配环节把转换得到的整组站点投影坐标传入
sel()方法,指定nearest匹配规则,就能一次性返回所有站点对应的最近网格点数据,结果顺序和原站点表完全对齐
完整可运行代码如下:
import xarray as xr import pandas as pd import cartopy.crs as ccrs # 读取格点数据、站点数据,和你原有读取逻辑一致 grid_ds = xr.open_dataset('/home/mmartin/LauNath/air.2m.2015.nc') station_df = pd.read_csv('Slope95.csv') # 定义格点使用的兰伯特投影,参数和你之前单点计算用的完全一致 data_crs = ccrs.LambertConformal( central_longitude=-107.0, central_latitude=50.0, standard_parallels=(50, 50.000001), false_easting=5632642.22547, false_northing=4612545.65137 ) # 批量转换所有站点经纬度到格点投影坐标系 trans_xy = data_crs.transform_points( src_crs=ccrs.PlateCarree(), x=station_df['Lon'].values, y=station_df['Lat'].values ) # 提取转换后的x、y投影坐标,忽略返回值第三列的默认高度值 station_x = trans_xy[:, 0] station_y = trans_xy[:, 1] # 批量匹配所有站点对应的最近网格点 match_result = grid_ds.sel( x=xr.DataArray(station_x, dims='station'), y=xr.DataArray(station_y, dims='station'), method='nearest' ) # 可选:把匹配结果合并回原站点表 station_df['match_grid_x'] = match_result['x'].values station_df['match_grid_y'] = match_result['y'].values # 替换成你自己格点数据里的经纬度、温度变量名即可 station_df['match_grid_lon'] = match_result['lon'].values station_df['match_grid_lat'] = match_result['lat'].values station_df['air_2m'] = match_result['air'].values
实用提示:
- 该方案全程为底层向量化运算,哪怕是十万级站点量也能秒级跑完,远快于逐行循环、apply逐点计算的实现
- 如果需要过滤离研究区过远的无效站点,可以在
sel()参数中增加tolerance=距离阈值,兰伯特投影的单位为米,比如设置tolerance=12500就代表仅匹配12.5公里范围内的最近网格,超出范围的站点会返回空值- 转换前请确认站点表中
Lon、Lat列是十进制度格式的WGS84坐标,不要传入度分秒格式值
内容的提问来源于stack exchange,提问作者Megan Martin
相关产品推荐
相关产品推荐

