使用python查找网格上纬度点的索引

使用python查找网格上纬度点的索引,python,coordinates,netcdf,Python,Coordinates,Netcdf,我是python新手,我不知道如何找到从给定的lat/lon点(不是从网格中给出的,而是由我选择的)到网格上最近的lat/lon点的最小距离 基本上,我在一个包含二维坐标的NCF文件中读取: coords = 'coords.nc' fh = Dataset(coords,mode='r') lons = fh.variables['latitudes'][:,:] lats = fh.variables['longitudes'][:,:] fh.close() >>> l

我是python新手,我不知道如何找到从给定的lat/lon点(不是从网格中给出的,而是由我选择的)到网格上最近的lat/lon点的最小距离

基本上,我在一个包含二维坐标的NCF文件中读取:

coords = 'coords.nc'
fh = Dataset(coords,mode='r')
lons = fh.variables['latitudes'][:,:]
lats = fh.variables['longitudes'][:,:]
fh.close()

>>> lons.shape
(94, 83)
>>> lats.shape
(94, 83)
我想在上面的网格中找到最接近以下值的lat lon的索引:

sel_lat=71.60556
sel_lon=-161.458611
为了使用scipy.spatial.distance函数,我尝试制作lat/lon对,但仍然存在问题,因为我没有将输入数组设置为它想要的格式,但我不知道如何做到:

latLon_pairsGrid = np.vstack(([lats.T],[lons.T])).T

>>> latLon_pairsGrid.shape
(94, 83, 2)

distance.cdist([sel_lat,sel_lon],latLon_pairsGrid,'euclidean')

任何帮助或提示都将不胜感激

我想我找到了答案,但这是一种避免计算所选lat/lon和网格上lat/lon之间距离的解决方法。这似乎并不完全准确,因为我从不计算距离,只计算lat/lon值之间最接近的差值

我用了这个问题的答案

使用这些返回的索引i,j,我可以在网格上找到与我选择的lat,lon值最接近的坐标:

>>> lats[i,j]
71.490295
>>> lons[i,j]
-161.65045

我想我找到了答案,但这是一个避免计算所选lat/lon和网格上lat/lon之间距离的解决方法。这似乎并不完全准确,因为我从不计算距离,只计算lat/lon值之间最接近的差值

我用了这个问题的答案

使用这些返回的索引i,j,我可以在网格上找到与我选择的lat,lon值最接近的坐标:

>>> lats[i,j]
71.490295
>>> lons[i,j]
-161.65045
签出包裹。它使用快速kdtree方法提供空间最近邻搜索:

import pyresample
import numpy as np

# Define lat-lon grid
lon = np.linspace(30, 40, 100)
lat = np.linspace(10, 20, 100)
lon_grid, lat_grid = np.meshgrid(lon, lat)
grid = pyresample.geometry.GridDefinition(lats=lat_grid, lons=lon_grid)

# Generate some random data on the grid
data_grid = np.random.rand(lon_grid.shape[0], lon_grid.shape[1])

# Define some sample points
my_lons = np.array([34.5, 36.5, 38.5])
my_lats = np.array([12.0, 14.0, 16.0])
swath = pyresample.geometry.SwathDefinition(lons=my_lons, lats=my_lats)

# Determine nearest (w.r.t. great circle distance) neighbour in the grid.
_, _, index_array, distance_array = pyresample.kd_tree.get_neighbour_info(
    source_geo_def=grid, target_geo_def=swath, radius_of_influence=50000,
    neighbours=1)

# get_neighbour_info() returns indices in the flattened lat/lon grid. Compute
# the 2D grid indices:
index_array_2d = np.unravel_index(index_array, grid.shape)

print "Indices of nearest neighbours:", index_array_2d
print "Longitude of nearest neighbours:", lon_grid[index_array_2d]
print "Latitude of nearest neighbours:", lat_grid[index_array_2d]
print "Great Circle Distance:", distance_array
还有一种直接获取最近网格点数据值的速记方法:

data_swath = pyresample.kd_tree.resample_nearest(
    source_geo_def=grid, target_geo_def=swath, data=data_grid,
    radius_of_influence=50000)
print "Data at nearest grid points:", data_swath
签出包裹。它使用快速kdtree方法提供空间最近邻搜索:

import pyresample
import numpy as np

# Define lat-lon grid
lon = np.linspace(30, 40, 100)
lat = np.linspace(10, 20, 100)
lon_grid, lat_grid = np.meshgrid(lon, lat)
grid = pyresample.geometry.GridDefinition(lats=lat_grid, lons=lon_grid)

# Generate some random data on the grid
data_grid = np.random.rand(lon_grid.shape[0], lon_grid.shape[1])

# Define some sample points
my_lons = np.array([34.5, 36.5, 38.5])
my_lats = np.array([12.0, 14.0, 16.0])
swath = pyresample.geometry.SwathDefinition(lons=my_lons, lats=my_lats)

# Determine nearest (w.r.t. great circle distance) neighbour in the grid.
_, _, index_array, distance_array = pyresample.kd_tree.get_neighbour_info(
    source_geo_def=grid, target_geo_def=swath, radius_of_influence=50000,
    neighbours=1)

# get_neighbour_info() returns indices in the flattened lat/lon grid. Compute
# the 2D grid indices:
index_array_2d = np.unravel_index(index_array, grid.shape)

print "Indices of nearest neighbours:", index_array_2d
print "Longitude of nearest neighbours:", lon_grid[index_array_2d]
print "Latitude of nearest neighbours:", lat_grid[index_array_2d]
print "Great Circle Distance:", distance_array
还有一种直接获取最近网格点数据值的速记方法:

data_swath = pyresample.kd_tree.resample_nearest(
    source_geo_def=grid, target_geo_def=swath, data=data_grid,
    radius_of_influence=50000)
print "Data at nearest grid points:", data_swath

向我们展示一下LON和LAT的样子以及它们的类型。更好的是:给我们一个可以在计算机上运行的示例和预期的输出。@cd98我不确定您所说的示例是什么意思,但可能我的问题还不够清楚。上面给出了sel_lat、sel_lon值,这些是我需要从“coords.nc”文件中找到网格上最近的对应索引的坐标。lons.shape=(93,83),与lats.shape相同。这意味着我制作的latLon_pairsGrid是一个(93,83,2)。我希望这足够清楚,我不确定还有什么要添加“没有它想要的格式”您可以打印错误吗?您也可以尝试将
lats.T.as_matrix()
lons.T.as_matrix()
转换为np.vstack中的纯numpy数组,而不是熊猫数组吗stuff@Julius我没有用熊猫,当我执行lats.T.as_matrix()时,它会给出错误`>>>lats.T.as_matrix()回溯(最近一次调用):文件“”,在AttributeError中的第1行:“numpy.ndarray”对象没有属性“as_matrix”,用于在距离中收到的错误。cdist命令在我问题的最后一行返回:`2027,在cdist raise ValueError中('XA必须是二维数组')`给我们看一下lon和lat的样子以及它们的类型。更好的是:给我们一个可以在计算机上运行的例子和预期的输出。@cd98我不确定你所说的例子是什么意思,但也许我在我的问题上不够清楚。sel_-lat,sel_-lon的值在上面给出,这些就是坐标我需要从'coords.nc'文件中找到网格上最接近的对应索引。lons.shape=(93,83)和lats.shape相同。这意味着我制作的latLon_pairsGrid是一个(93,83,2)。我希望这足够清楚,我不确定还需要添加什么“没有它想要的格式”你能把错误打印出来吗?你能试着把
lats.T.as_matrix()
lons.T.as_matrix()
打印到你的np.vstack里面的数组中,把它们转换成纯numpy数组而不是熊猫数组吗stuff@Julius我没有使用pandas,当我使用lats.T.as_matrix()时,它会给出错误`>>>lats.T.as_matrix()的回溯(最后一次调用):文件“”,第1行,在AttributeError:'numpy.ndarray'对象没有属性'as_matrix',用于在距离中接收到的错误。cdist命令在我的问题的最后一行返回:'2027,在cdist raise ValueError中('XA必须是二维数组')'你正在最小化一个L1度量,也被称为,它不是完全不合理的,计算起来也比通常的L2度量便宜
a=sqrt(dx**2+dy**2)
。正如您所说,您是在lat/lon域中计算距离,而不是需要坐标变换的测地线或笛卡尔距离。如果您要查询多个点,并且速度是一个问题,请务必查看@Funkensieper的答案或其他基于树的方法。您正在最小化L1度量,也称为w这并不是完全不合理的,并且比通常的L2度量
a=sqrt(dx**2+dy**2)计算起来更便宜
。正如您所说,您是在lat/lon域中计算距离,而不是需要坐标变换的测地线或笛卡尔距离。如果您要查询多个点,并且速度是一个问题,请务必查看@Funkensieper的答案或其他基于树的方法。