如何检查坐标网格中是否存在坐标对(纬度,经度)?

时间:2019-07-31 15:49:58

标签: python numpy logic geography

我有一种算法,可以在满足某些条件时使用地理坐标来计算形状。该算法将输出纬度列表和经度列表,如下所示。因此lat [0]和lon [0]将代表一个坐标对。我想创建一个纬度和经度图形状的布尔数组,如果算法输出中存在相应的坐标点,则索引为true。我具有netcdf文件中的原始纬度和经度信息,但是如何制作一个可以与算法输出进行比较的二维坐标点数组,然后使用匹配的索引来创建此布尔数组?

我尝试将纬度和经度合并为一个数组。 len(lat) = 81, len(lon) = 480,我需要一个(81,480)数组。我认为我必须使用numpy where函数来确定坐标对匹配的位置。

lat_alg = [-47.25 -47.25 -47.25 -48.   -48.   -48.   -48.   -48.   -48.   -48.
 -48.   -48.75 -48.75 -48.75 -48.75 -48.75 -48.75 -49.5  -49.5  -49.5
 -49.5  -50.25 -50.25 -50.25]
lon_alg = [225.75 226.5  227.25 226.5  227.25 228.   228.75 229.5  230.25 231.
 231.75 228.   228.75 229.5  230.25 231.   231.75 229.5  230.25 231.
 231.75 230.25 231.   231.75]

我创建的布尔数组是... ar_tracker = np.zeros((len(lat),len(lon)))

并且我希望输出为1,坐标匹配。

3 个答案:

答案 0 :(得分:0)

由于具有真实值,因此无法使用==进行检查。因此,我们必须使用不等式限制的窗口。结果,我们获得了所选窗口中的元素索引(在此示例中为 11和12

# 1. build numpy arrays
lat = np.array([-47.25, -47.25, -47.25, -48.,   -48.,   -48.,   -48.,   -48.,   -48.,   -48., -48.,   -48.75, -48.75, -48.75, -48.75, -48.75, -48.75, -49.5,  -49.5,  -49.5, -49.5,  -50.25, -50.25, -50.25])
lon= np.array([225.75, 226.5,  227.25, 226.5,  227.25, 228.,   228.75, 229.5,  230.25, 231., 231.75, 228.,   228.75, 229.5,  230.25, 231.,   231.75, 229.5,  230.25, 231., 231.75, 230.25, 231., 231.75])


# 2. pick the values in the desired window for each data series, set to zeros the others
La = np.where( (lat> -49.0) & (lat<-48), lat, 0*lat)
Lo = np.where( (lon>226) & (lon<229), lon, 0*lon)

#3. give the indices where both series are non-zero
ind = np.argwhere(np.abs(Lo*La)>0.0001)
ind
array([[11],
       [12]], dtype=int64)

或者,如果您更喜欢带有布尔值的数组:

(np.abs(Lo*La)>0.0001).astype(int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0])

答案 1 :(得分:0)

尝试一下:

import numpy as np

lat_alg = np.array([-47.25, -47.25, -47.25, -48., -48., -48., -48., -48., -48.,
                    -48., -48., -48.75, -48.75, -48.75, -48.75, -48.75, -48.75,
                    -49.5, -49.5, -49.5, -49.5, -50.25, -50.25, -50.25])
lon_alg = np.array([225.75, 226.5, 227.25, 226.5, 227.25, 228., 228.75, 229.5,
                    230.25, 231., 231.75, 228., 228.75, 229.5, 230.25, 231.,
                    231.75, 229.5, 230.25, 231., 231.75, 230.25, 231., 231.75])

desired_position = np.array([-47.5, 228])
tolerance = 1

lat = np.abs(lat_alg - desired_position[0]) <= tolerance
lon = np.abs(lon_alg - desired_position[1]) <= tolerance 

desired_area = np.outer(lat, lon).astype(int)

如果要比较精确匹配而不是坐标 windows ,请尝试使用numpy.isclose以避免浮点数差异:

import numpy as np

lat_alg = np.array([-47.25, -47.25, -47.25, -48., -48., -48., -48., -48., -48.,
                    -48., -48., -48.75, -48.75, -48.75, -48.75, -48.75, -48.75,
                    -49.5, -49.5, -49.5, -49.5, -50.25, -50.25, -50.25])
lon_alg = np.array([225.75, 226.5, 227.25, 226.5, 227.25, 228., 228.75, 229.5,
                    230.25, 231., 231.75, 228., 228.75, 229.5, 230.25, 231.,
                    231.75, 229.5, 230.25, 231., 231.75, 230.25, 231., 231.75])

desired_position = np.array([-47.5, 228])

lat = np.isclose(lat_alg - desired_position[0], 0)
lon = np.isclose(lon_alg - desired_position[1], 0)

exact_matches = np.outer(lat, lon).astype(int)

desired_areaexact_matches都是形状为(len(lat), len(lon))的二维数组。

答案 2 :(得分:0)

为了完全确定该对是否存在,建议您建立一个元组列表,其中每个元组都包含一对(纬度,经度)。例如:

def Mesh(X,Y):
    A=[]
    for x,y in zip(X,Y):
        A.append((x,y))

    return A

Coord=Mesh(lat_alg,lon_alg)

然后,如果您知道网格分辨率,则可以按以下步骤轻松检查一对:

coord=(-49.5,230.25)

if coord in Coord:
    print('True')
else:
    print('False')