二维数组中的纬度/经度 - 最近的像素索引

问题描述 投票:0回答:1

我的数据集 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

建议将不胜感激!

python arrays 2d latitude-longitude nearest-neighbor
1个回答
0
投票

我浏览了你的代码,我意识到你正在独立地找到每个纬度和经度的最小绝对差。这不能保证目标和网格点之间的最小组合距离。

你能做的是:

  1. 您可以计算目标位置与每个网格点之间的欧氏距离,并找到组合距离的最小索引。

    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)
    
  2. 您还可以使用

    nearest_idx[0]
    nearest_idx[1]
    来索引过滤后的数据集:

    xyz_filtered = xyz_data.isel( 时间=切片(无),x=[nearest_idx[0]],y=[nearest_idx1] )

  3. 但我建议你的是,你应该使用 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)

该方法使用向量化运算,直接找到最小距离的索引。

© www.soinside.com 2019 - 2024. All rights reserved.