首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >X数组选择多维坐标最近的lat/lon

X数组选择多维坐标最近的lat/lon
EN

Stack Overflow用户
提问于 2019-11-07 23:47:59
回答 6查看 16.3K关注 0票数 23

我有一个x数组数据集,它有不规则的纬度和经度坐标。我的目标是在最接近某个lat/lon的点上找到变量的值。

由于xy维度不是lat/lon值,因此在这种情况下,ds.sel()方法本身似乎无法使用。是否有以x数组为中心的方法,通过引用多维lat/lon维度来定位最近期望的lat/lon点?例如,我想取出最近的lat=21.2lon=-122.68的速度值。

下面是一个示例数据集..。

代码语言:javascript
运行
复制
lats = np.array([[21.138  , 21.14499, 21.15197, 21.15894, 21.16591],
                 [21.16287, 21.16986, 21.17684, 21.18382, 21.19079],
                 [21.18775, 21.19474, 21.20172, 21.2087 , 21.21568],
                 [21.21262, 21.21962, 21.22661, 21.23359, 21.24056],
                 [21.2375 , 21.2445 , 21.25149, 21.25848, 21.26545]])  

lons = np.array([[-122.72   , -122.69333, -122.66666, -122.63999, -122.61331],
                 [-122.7275 , -122.70082, -122.67415, -122.64746, -122.62078],
                 [-122.735  , -122.70832, -122.68163, -122.65494, -122.62825],
                 [-122.7425 , -122.71582, -122.68912, -122.66243, -122.63573],
                 [-122.75001, -122.72332, -122.69662, -122.66992, -122.64321]])

speed = np.array([[10.934007, 10.941321, 10.991583, 11.063932, 11.159435],
                  [10.98778 , 10.975482, 10.990983, 11.042522, 11.131154],
                  [11.013505, 11.001573, 10.997754, 11.03566 , 11.123781],
                  [11.011163, 11.000227, 11.010223, 11.049   , 11.1449  ],
                  [11.015698, 11.026604, 11.030653, 11.076904, 11.201464]])

ds = xarray.Dataset({'SPEED':(('x', 'y'),speed)},
                    coords = {'latitude': (('x', 'y'), lats),
                              'longitude': (('x', 'y'), lons)},
                    attrs={'variable':'Wind Speed'})

ds

代码语言:javascript
运行
复制
<xarray.Dataset>
Dimensions:    (x: 5, y: 5)
Coordinates:
    latitude   (x, y) float64 21.14 21.14 21.15 21.16 ... 21.25 21.26 21.27
    longitude  (x, y) float64 -122.7 -122.7 -122.7 ... -122.7 -122.7 -122.6
Dimensions without coordinates: x, y
Data variables:
SPEED      (x, y) float64 10.93 10.94 10.99 11.06 ... 11.03 11.03 11.08 11.2
Attributes:
    variable:  Wind Speed

同样,ds.sel(latitude=21.2, longitude=-122.68)无法工作,因为纬度和经度不是数据集维度。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-10-19 16:48:56

这里的聚会有点晚了,但我已经多次提到这个问题了。如果您的x和y坐标位于地理空间坐标系中,则可以使用cartopy将lat/lon点转换为该坐标系。如果查看netcdf中的元数据,构建cartopy投影通常是简单的。

代码语言:javascript
运行
复制
import cartopy.crs as ccrs

# Example - your x and y coordinates are in a Lambert Conformal projection
data_crs = ccrs.LambertConformal(central_longitude=-100)

# Transform the point - src_crs is always Plate Carree for lat/lon grid
x, y = data_crs.transform_point(-122.68, 21.2, src_crs=ccrs.PlateCarree())

# Now you can select data
ds.sel(x=x, y=y)
票数 16
EN

Stack Overflow用户

发布于 2019-11-08 21:42:02

我想出了一个不纯粹使用xarray的方法。我首先手动查找最近邻的索引,然后使用该索引访问xarray维度。

代码语言:javascript
运行
复制
# A 2D plot of the SPEED variable, assigning the coordinate values,
# and plot the verticies of each point
ds.SPEED.plot(x='longitude', y='latitude')
plt.scatter(ds.longitude, ds.latitude)

# I want to find the speed at a certain lat/lon point.
lat = 21.22
lon = -122.68

# First, find the index of the grid point nearest a specific lat/lon.   
abslat = np.abs(ds.latitude-lat)
abslon = np.abs(ds.longitude-lon)
c = np.maximum(abslon, abslat)

([xloc], [yloc]) = np.where(c == np.min(c))

# Now I can use that index location to get the values at the x/y diminsion
point_ds = ds.sel(x=xloc, y=yloc)

# Plot requested lat/lon point blue
plt.scatter(lon, lat, color='b')
plt.text(lon, lat, 'requested')

# Plot nearest point in the array red
plt.scatter(point_ds.longitude, point_ds.latitude, color='r')
plt.text(point_ds.longitude, point_ds.latitude, 'nearest')

plt.title('speed at nearest point: %s' % point_ds.SPEED.data)

另一个潜在的解决方案(同样,不是xarray)是使用KDTree,甚至更好的是使用scikit--学习的BallTree (https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.BallTree.html)或使用https://github.com/xarray-contrib/xoak

票数 13
EN

Stack Overflow用户

发布于 2019-11-08 02:15:45

我认为您需要以不同的方式创建数据集,以确保latitudelongitude具有可解释的维度(请参阅xarray的基本数据结构文章)。

例如:

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd
import xarray
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

lats = np.array([21.138, 21.14499, 21.15197, 21.15894, 21.16591,
                 21.16287, 21.16986, 21.17684, 21.18382, 21.19079,
                 21.18775, 21.19474, 21.20172, 21.2087, 21.21568,
                 21.21262, 21.21962, 21.22661, 21.23359, 21.24056,
                 21.2375, 21.2445, 21.25149, 21.25848, 21.26545])

lons = np.array([-122.72, -122.69333, -122.66666, -122.63999, -122.61331,
                 -122.7275, -122.70082, -122.67415, -122.64746, -122.62078,
                 -122.735, -122.70832, -122.68163, -122.65494, -122.62825,
                 -122.7425, -122.71582, -122.68912, -122.66243, -122.63573,
                 -122.75001, -122.72332, -122.69662, -122.66992, -122.64321])

speed = np.array([10.934007, 10.941321, 10.991583, 11.063932, 11.159435,
                  10.98778, 10.975482, 10.990983, 11.042522, 11.131154,
                  11.013505, 11.001573, 10.997754, 11.03566, 11.123781,
                  11.011163, 11.000227, 11.010223, 11.049, 11.1449,
                  11.015698, 11.026604, 11.030653, 11.076904, 11.201464])

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 5))

idx = pd.MultiIndex.from_arrays(arrays=[lons, lats], names=["lon", "lat"])
s = pd.Series(data=speed, index=idx)
da = xarray.DataArray.from_series(s)
print(da)
da.plot(ax=ax1)

print('-'*80)
print(da.sel(lat=21.2, lon=-122.68, method='nearest'))

# define grid.
num_points = 100
lats_i = np.linspace(np.min(lats), np.max(lats), num_points)
lons_i = np.linspace(np.min(lons), np.max(lons), num_points)

# grid the data.
speed_i = griddata((lats, lons), speed,
                   (lats_i[None, :], lons_i[:, None]), method='cubic')

# contour the gridded data
ax2.contour(lats_i, lons_i, speed_i, 15, linewidths=0.5, colors='k')
contour = ax2.contourf(lats_i, lons_i, speed_i, 15, cmap=plt.cm.jet)
plt.colorbar(contour, ax=ax2)

# plot data points.
for i, (lat, lon) in enumerate(zip(lats, lons)):
    label = f'{speed[i]:0.2f}'
    ax2.annotate(label, (lat, lon))

ax2.scatter(lats, lons, marker='o', c='b', s=5)

ax2.set_title(f'griddata test {num_points} points')

plt.subplots_adjust(wspace=0.2)
plt.show()

结果

代码语言:javascript
运行
复制
<xarray.DataArray (lat: 25, lon: 25)>
array([[      nan,       nan,       nan,       nan,       nan, 10.934007,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan, 10.941321,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan, 10.991583,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan, 11.063932,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan, 10.98778 ,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
        11.159435],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan, 10.975482,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan, 10.990983,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
        11.042522,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan, 11.013505,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan, 11.131154,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan, 11.001573,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
        10.997754,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan, 11.03566 ,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan, 11.011163,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan, 11.123781,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
        11.000227,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan, 11.010223,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan, 11.049   ,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [11.015698,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan, 11.1449  ,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan, 11.026604,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan, 11.030653,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan, 11.076904,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan],
       [      nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan,       nan,       nan,       nan,       nan,       nan,
              nan, 11.201464,       nan,       nan,       nan,       nan,
              nan]])
Coordinates:
  * lat      (lat) float64 21.14 21.14 21.15 21.16 ... 21.24 21.25 21.26 21.27
  * lon      (lon) float64 -122.8 -122.7 -122.7 -122.7 ... -122.6 -122.6 -122.6
--------------------------------------------------------------------------------
<xarray.DataArray ()>
array(10.997754)
Coordinates:
    lat      float64 21.2
    lon      float64 -122.7

还有一个包括格栅的情节只是为了好玩

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58758480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档