You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量对气象站点执行坐标变换查找最近网格点

批量实现方法

不用逐点写循环,直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:27:22