我的数据集 xyz_data = xr.open_dataset("xyz.nc") 具有以下属性:
xarray.Dataset
Dimensions:
time: 2967x: 61y: 91
Coordinates:
lat
(x, y)
float32
...
lon
(x, y)
float32
...
time
(time)
datetime64[ns]
2021-12-01 ... 2021-12-31T23:45:00
Data variables:
xyz_probability
(time, x, y)
int8
...
Indexes:
time
PandasIndex
我正在使用此代码来查找最接近我感兴趣的位置的像素的索引。
lat = xyz_data['lat']
lon = xyz_data['lon']
target_lon = 8.117500
target_lat = 48.59111
lon_diff = np.abs(lon - target_lon)
lat_diff = np.abs(lat - target_lat)
nearest_lon_idx = np.unravel_index(lon_diff.argmin(), lon.shape)
nearest_lat_idx = np.unravel_index(lat_diff.argmin(), lat.shape)
print(nearest_lon_idx)
print(nearest_lat_idx)
# The output of print command is (9, 21) and (25, 25)
xyz_filtered = xyz_data.isel(time=slice(None), x= [nearest_lon_idx[0]], y=[nearest_lat_idx[1]])
问题: xyz_filtered 没有给我最接近目标位置的坐标。 我认为这与索引有关,但我无法解决它。 建议将不胜感激!
我还关注了https://gis.stackexchange.com/questions/357026/indexing-coordinates-in-order-to-get-a-value-by-cooperatives-from-xarray线程,但我收到一个错误说:
ValueError: Cannot apply_along_axis when any iteration dimensions are 0
建议将不胜感激!
我浏览了你的代码,我意识到你正在独立地找到每个纬度和经度的最小绝对差。这不能保证目标和网格点之间的最小组合距离。
你能做的是:
您可以计算目标位置与每个网格点之间的欧氏距离,并找到组合距离的最小索引。
import numpy as np
lon_diff = lon - target_lon
lat_diff = lat - target_lat
dist = np.sqrt(lon_diff**2 + lat_diff**2)
nearest_idx = np.unravel_index(dist.argmin(), dist.shape)
您还可以使用
nearest_idx[0]
和nearest_idx[1]
来索引过滤后的数据集:
xyz_filtered = xyz_data.isel( 时间=切片(无),x=[nearest_idx[0]],y=[nearest_idx] )
但我建议你的是,你应该使用 xarray
的
apply_ufunc
,而不是手动计算距离
你的代码应该包含这个片段:
def euclidean_distance(lon1, lat1, lon2, lat2):
return np.sqrt((lon1 - lon2)**2 + (lat1 - lat2)**2)
xyz_filtered = xyz_data.apply_ufunc(
euclidean_distance,
input_vars=["lon", "lat"],
kwargs={"lon2": target_lon, "lat2": target_lat},
vectorize=True,
).argmin(dim=("x", "y"))
xyz_filtered = xyz_data.isel(time=slice(None), x=xyz_filtered.x, y=xyz_filtered.y)
该方法使用向量化运算,直接找到最小距离的索引。